como sacar numeros del 0 al 9 con los digitos 4 4 4 4 (parte 2)
En la entrada anterior del blog puse el desafío de calcular los números del 1 al 50 haciendo operaciones aritméticas sobre 4 4s, y como generarlos para los números que van del 0 al 9. Pero me quedé con la duda de si es posible hacerlo para todos los números menores a 50, así que escribí un programita en ruby que calcula todas las posibles evaluaciones usando los operadores +, -, *, / y **. Lo único, hay que tener en cuenta que la división es entera, por lo que hay algunos resultados poco intuitivos.
Al final, el primer número imposible es el 10 (por eso no encontraba como armarlo :D). Acá les muestro la salida del programa:
0 == (4 / (4 ** (4 ** 4))) 1 == (4 ** (4 / (4 ** 4))) 2 == (4 / ((4 + 4) / 4)) 3 == (4 - (4 ** (4 - 4))) 4 == (4 ** (4 ** (4 - 4))) 5 == (4 + (4 ** (4 - 4))) 6 == (4 + ((4 + 4) / 4)) 7 == (4 + (4 - (4 / 4))) 8 == (4 - (4 - (4 + 4))) 9 == (4 + (4 + (4 / 4))) 10 == 11 == 12 == (4 * (4 - (4 / 4))) 13 == 14 == 15 == ((4 * 4) - (4 / 4)) 16 == (4 * (4 ** (4 / 4))) 17 == ((4 / 4) + (4 * 4)) 18 == 19 == 20 == (4 * (4 + (4 / 4))) 21 == 22 == 23 == 24 == (4 + (4 + (4 * 4))) 25 == 26 == 27 == 28 == ((4 * (4 + 4)) - 4) 29 == 30 == 31 == 32 == ((4 ** 4) / (4 + 4)) 33 == 34 == 35 == 36 == (4 + (4 * (4 + 4))) 37 == 38 == 39 == 40 == 41 == 42 == 43 == 44 == 45 == 46 == 47 == 48 == (4 * (4 + (4 + 4))) 49 == 50 ==
Y para los geeks codeadores como yo, este fue el script rubyistico que usé para calcular las cosas:
def template_expressions( leafs = 4 )
return "4" if leafs == 1
previous_level = template_expressions( leafs - 1 )
previous_level.map do
|expr|
results = []
(0...expr.length).each do
|i|
if expr[i..i] == "4"
new_result = expr.clone
new_result[i] = "(4 o 4)"
results << new_result
end
end
results
end.flatten
end
OPERANDS = %W{+ - * / **}
def sample_evaluations( leafs = 4 )
evaluations = {}
exprs = template_expressions(leafs)
exprs.each do
|expr|
sample_evaluations0( leafs, expr, evaluations )
end
evaluations
end
def sample_evaluations0( leafs, expr, evaluations )
if leafs == 0
begin
evaluations[eval( expr )] = expr
rescue ZeroDivisionError
end
return
end
OPERANDS.each do
|op|
new_expr = expr.sub( /o/, op)
sample_evaluations0( leafs - 1, new_expr, evaluations )
end
end
evaluations = sample_evaluations
(0..50).each { |i| puts "#{i} == #{evaluations[i]}" }
Happy hacking,
Aureliano.
1 comentario:
Algunos usan como truco juntar dos 4 para hacer un 44. Si lo usás, entonces (44 - 4)/4 = 10.
Otra opción es usar más operaciones, como sqrt y factorial. En ese caso, 10 = 4+4+(4/sqrt(4)).
Una cosa interesante hubiera sido que pongas todas las formas de hacer los cálculos, como que 0 se puede hacer con (4/4)**4**4, y (4/4**4)**4 también...
Publicar un comentario