73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450
Encuentra los 13 dígitos adyacentes en el número de 1000 dígitos que tienen el mayor producto ¿Cuál es el valor de ese producto?
Solución con Ruby
El resultado se obtiene a través de fuerza bruta con varios métodos que ofrece Ruby para simplificar un poco las cosas. El número en un inicio se trabaja como un string y se va obteniendo un rango de 13 números dentro de él. De ahí se ejecutará el ciclo 987 veces (1000 - 13 para tomar todos las series posibles) y dentro del ciclo se hacen las operaciones. Cada producto resultante de la serie de 13 dígitos, se irá guardando en un array para que finalizado el ciclo, se imprima el valor más grande dentro de este array.
1.- Definimos dos variables que serán las encargadas de ir consiguiendo los 13 dígitos para hacer la operación, una iniciada en 0 y otra en 12 para tomar las posiciones iniciales.
2.- Comienza el ciclo times el cual se ejecutará 987 veces para ir recorriendo las posiciones dentro del número. Se debe iniciar la variable mult en 1 que ocuparemos para ir multiplicando los dígitos dentro de cada serie. content recibirá el valor entre el rango definido entre las variables que se declararon anteriormente content = number[limit1..limit2] al entrar la primera vez al ciclo, del número tomaría sus primeros 3 dígitos. Después, ambas variables de límite se incrementarán en 1 para hacer el recorrido de la posición en la siguiente entrada al ciclo.
3.- En estos momentos, content ya tiene 13 digitos, pero estos están como string, por lo cual, convert recibirá el valor de content pero lo transformará en un entero para poder seguir trabajándolo.
4.- Comienza el ciclo while, el cual, irá descomponiendo el número de 13 dígitos en cada uno de sus números. Mientras convert sea diferente de 0, mood tendrá el residuo de convert / 10, y será cuando entre la variable mult, la cual irá acumulando la multiplicación de mood * mult. Y finalmente, para conservar el valor de convert sin su último dígito, convert se divide entre 10:
(en la primer posición)
convert = 7316717653133
7316717653133 ¿es diferente de 0? .: entra al while
mood = convert % 10 .: 7316717653133 % 10 .: mood = 3 (el residuo es el último digito)
mult = mult * mood .: 1 * 3 .: mult = 3
convert = convert / 10 .: 7316717653133 / 10 .: convert = 731671765313
Así, cada que entre al ciclo, irá "quitando" el último elemento y lo irá multiplicando por la cuenta actual hasta que convert esté "vacío" y salga del ciclo while.
5.- Dentro de products, el array antes declarado, se guardará la el producto resultante de la serie de 13 digitos en cada uno de los times, lo que resultaría en un array con 987 elementos (los productos de cada una de las series)
6.- Finalmente, al terminar el ciclo times, se imprime el máximo valor dentro del arreglo
puts products.max
Y con esto, se habría encontrado el máximo producto de los 13 digitos adyacentes dentro del número de 1000 dígitos.
Código de Ruby:
number = \
'73167176531330624919225119674426574742355349194934' \
'96983520312774506326239578318016984801869478851843' \
'85861560789112949495459501737958331952853208805511' \
'12540698747158523863050715693290963295227443043557' \
'66896648950445244523161731856403098711121722383113' \
'62229893423380308135336276614282806444486645238749' \
'30358907296290491560440772390713810515859307960866' \
'70172427121883998797908792274921901699720888093776' \
'65727333001053367881220235421809751254540594752243' \
'52584907711670556013604839586446706324415722155397' \
'53697817977846174064955149290862569321978468622482' \
'83972241375657056057490261407972968652414535100474' \
'82166370484403199890008895243450658541227588666881' \
'16427171479924442928230863465674813919123162824586' \
'17866458359124566529476545682848912883142607690042' \
'24219022671055626321111109370544217506941658960408' \
'07198403850962455444362981230987879927244284909188' \
'84580156166097919133875499200524063689912560717606' \
'05886116467109405077541002256983155200055935729725' \
'7163626956188267042825248360082325753042075296345'
limit1 = 0
limit2 = 12
products = []
987.times do
mult = 1
content = number[limit1..limit2]
limit1 += 1
limit2 += 1
convert = content.to_i
while convert != 0 do
mood = convert % 10
mult *= mood
convert /= 10
end
products << mult
end
puts products.max