Un número de Friedman es un número que se puede expresar aplicando operaciones matemáticas básicas (^, /, *, +, -) a todos sus dígitos. Las operaciones no necesitan aplicarse a cada dígito individual, pero todos los dígitos deben estar involucrados. Es decir, 121 = 11 ^ 2 -> todos los dígitos están involucrados, pero 1 y 1 se han unido para formar 11.
Se permite el uso de paréntesis, pero la solución trivial x= (x)
no es una solución válida. Además, no es válida, x= +x
.
- 25 = 5 ^ 2
- 121 = 11 ^ 2
- 343 = (3 + 4) ^ 3
- 2048 = (8 ^ 4) / 2 + 0
Escriba un programa que tome dos enteros positivos e imprima el número de números de Friedman en ese rango (inclusive) y los números con las expresiones en las líneas siguientes.
Entrada -
n m | n, m integers, n>=0, m>n
Salida -
count | number of Friedman numbers in the given range
fn1 exp1 | Friedman number, expression
fn2 exp2
fn3 exp3
.
.
.
El código más corto publicado antes del domingo 29 de julio a las 00:00 Hrs GMT será el ganador.
/
funciona? Por ejemplo, ¿qué es1/3
?-5
?Respuestas:
Rubí,
456 438 408 390 370 349 344334 [fijo]Salida:
También funciona relativamente rápido para números más grandes:
fuente
5 40
y consiguió el resultado:[11, "11**1", 21, "21**1", 31, "31**1", 41, "41**1"]
. No había señales de25
allí y creo que la solución adecuada (por ejemplo, para21
) es2*1
, no21**1
'+-*/'.chars.to_a+['','**']
con["+","-","*","/","","**"]
Python 2.7 -
380 378 372 371 367 363 357 354 352 348336 caracteresSolo una simple búsqueda de fuerza bruta.
Ejemplo de ejecución:
Explicación:
s(x)
es una función que toma una cadena que contiene una secuencia de dígitos y devuelve todas las expresiones usando esos dígitos en ese orden.[x]['1'>x>'0':]
se evalúa como una lista que contiene x si x es '0' o una secuencia de dígitos que no comienza con '0'; de lo contrario, se evalúa como una lista vacía. Básicamente, esto maneja el caso donde unir todos los dígitos juntos.['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
básicamente divide x en dos partes (ambas de longitud distinta de cero), llama a s () en cada parte y une todos los resultados junto con algún operador entre ellos, usando product ().E(e)
es básicamente una evaluación segura Devuelve el valor de e si e es válido y Ninguno de lo contrario.Básicamente, este código prueba todos los números en el rango, permuta sus dígitos y prueba cada expresión que s () genera para esa permutación, ignorando la primera expresión si x no comienza con '0', porque si x no comienza con ' 0 ', entonces la primera expresión será simplemente x.
Versión alternativa - 397 caracteres
Aquí está mi código si debe usar fracciones:
fuente
if len(x)<2
que alguna vez sea cierto en su funcións
. Además, puede reemplazar suformat
con"a[Fraction(%s)%s%s]='(%s%s%s)'"%(x[:i],o,v,x[:i],o,A)
para guardar 4 caracteres.except:0
inteligente ... muy inteligente. Lo recordaréPython3
(436)(434)(443)Fue dificil. Puedo ahorrar algunos caracteres si hago que la salida sea más nativa.
Salida
fuente
"("+i+c+j+")"
y su sustituciónlen(n)>1
por1<len(n)
después de lo cual se puede quitar el espacio después de esa expresión.for j in r:print(r[j],j)
para guardar 7 caracteres.Mathematica
456416402404400396 caracteresEjemplo :
Salida :
fuente