CTF #nullcon 2012: Programación 2

nullcon1.jpg

En el segundo nivel de está categoría se nos pedía la suma los términos medios de las primeras 1337 del triángulo de Pascal.

Pues nada vistazo a la wikipedia, problema conocido, seguro que alguien ha escrito el algoritmo en Ruby, lo bajo, lo modifico, quedándome de esta forma:

#!/usr/bin/env ruby

def pascal(n)
  p=[1]
  sum = 0
  while(p.length<n)
#    puts p.join(" ")
    p.join(" ")
    p=Array.new(p.length+1) {|i| 
      a=i0 ? p[i-1] : 0
      a+b
    }
    if p.length.odd?
      sum = sum + p[p.length()/2] 
    end 
  end
  return sum+1
end

puts "sum: " + pascal(1337).to_s

Y cuyo resultado al ejecutarlo y por lo tanto nuestro flag:

4365932474188423707093600683230364311423941198777278660206654 3431205872166674362332393596312576719064242547970040323267566 5303433331039708200725935787062342766243246058781866709722670 5645987145656659456934356498862160032628647508069786551862253 7377534356455651048425097523734881838663157063304671110082383 2182944537376787442215601583578968563307031943568828954828743 83651576271102847866170999680296497

Básicamente al algoritmo original le añado:

if p.length.odd?
      sum = sum + p[p.length()/2] 
end

Para sumar el término medio de las filas impares, que son las que tienen término medio y al final le sumamos 1 a la suma total por la primera línea cuya valor del término medio y único es 1.