Un número de Friedman es un número entero positivo que es igual a una expresión no trivial que usa sus propios dígitos en combinación con las operaciones +, -, *, /, ^, paréntesis y concatenación.
Un número de Nice Friedman es un número entero positivo que es igual a una expresión no trivial que usa sus propios dígitos en combinación con las mismas operaciones, con los dígitos en su orden original.
Un número de Friedman muy bonito (VNFN), que estoy inventando aquí, es un número de Friedman bonito que se puede escribir sin las partes menos bonitas (en mi opinión) de tal expresión. Los paréntesis, la concatenación y la negación unaria están prohibidos.
Para este desafío, hay tres formas posibles de escribir una expresión sin paréntesis.
Prefijo: Esto es equivalente a asociatividad izquierda. Este tipo de expresión se escribe con todos los operadores a la izquierda de los dígitos. Cada operador se aplica a las siguientes dos expresiones. Por ejemplo:
*+*1234 = *(+(*(1,2),3),4) = (((1*2)+3)*4) = 20
Un VNFN que se puede escribir de esta manera es 343:
^+343 = ^(+(3,4),3) = ((3+4)^3) = 343
Postfix: Esto es equivalente a la asociatividad correcta. Es como la notación de prefijo, excepto que la operación va a la derecha de los dígitos. Cada operador se aplica a las dos expresiones anteriores. Por ejemplo:
1234*+* = (1,(2,(3,4)*)+)* = (1*(2+(3*4))) = 14
Un VNFN que se puede escribir de esta manera es 15655:
15655^+** = (1,(5,(6,(5,5)^)+)*)* = (1*(5*(6+(5^5)))) = 15655
Infix: la notación Infix utiliza el orden estándar de operaciones para las cinco operaciones. Para los propósitos del desafío, ese orden de operaciones se definirá de la siguiente manera: ^
Primero, paréntesis , derecho asociativo. Luego, entre paréntesis *
y /
, simultáneamente, se fue asociativamente. Finalmente, entre paréntesis +
y -
simultáneamente, izquierda asociativamente.
1-2-3 = (1-2)-3 = -4
2/3*2 = (2/3)*2 = 4/3
2^2^3 = 2^(2^3) = 256
1^2*3+4 = (1^2)*3+4 = 7
Un VNFN que se puede escribir de esta manera es 11664:
1*1*6^6/4 = (((1*1)*(6^6))/4) = 11664
Desafío: dado un entero positivo, si puede expresarse como una expresión no trivial de sus propios dígitos en notación de prefijo, infijo o postfijo, genera esa expresión. De lo contrario, no envíe nada.
Aclaraciones: si son posibles varias representaciones, puede generar cualquier subconjunto no vacío de ellas. Por ejemplo, 736 es un VNFN:
+^736 = 736
7+3^6 = 736
+^736
, 7+3^6
o ambos serían productos aceptables.
Una expresión "trivial" significa una que no utiliza ningún operador. Esto solo es relevante para números de un dígito, y significa que los números de un dígito no pueden ser VNFN. Esto se hereda de la definición de un número de Friedman.
Las respuestas deben ejecutarse en segundos o minutos en entradas de menos de un millón.
IO: reglas estándar de IO. Programa completo, función, verbo o similar. STDIN, línea de comando, argumento de función o similar. Para generar "Nothing", la cadena vacía, una línea en blanco null
o similar y una colección vacía están bien. La salida puede ser una cadena delimitada con un carácter que no puede estar en una representación, o puede ser una colección de cadenas.
Ejemplos:
127
None
343
^+343
736
736^+
7+3^6
2502
None
15655
15655^+**
11664
1*1*6^6/4
1^1*6^6/4
5
None
Puntuación: Este es el código de golf. Pocos bytes ganan.
Además, si encuentra uno, proporcione un nuevo número Very Nice Friedman en su respuesta.
fuente
*(+(*(1,2),3,4)
le falta un par cercano, después,3
Parentheses, concatenation and unary negation are disallowed.
Respuestas:
Perl,
345334318293263245BLlamar con
perl -M5.10.0 scratch.pl 736
Resultados
Los primeros resultados que encontré son:
Explicación
Totalmente sin golf
Traté de repetirme lo más posible para facilitar el golf posterior.
Cómo se juega al golf
$_=q! ... !;eval
Esto proporciona algo como esto, desde el cual puede eliminar los saltos de línea para el resultado:
fuente
}glob
y guardar algunos bytes.s!B!}glob!g;BBB
-> 15B;}glob}glob}glob
-> 15B :)Ruby 2.1.5 solamente -
213220238 + 9 = 247No estoy seguro de cómo Ruby le gana a Perl, pero aquí tienes ...
Ejecute esto con un indicador -rtimeout (y -W0 o envíe su stderr a otra parte).
Para hacer esto un poco más robusto, reemplace
send([].methods[81],z-1)
conrepeated_permutation(z-1)
y anote un personaje adicional (entonces, 248 ).Básicamente, revise todas las permutaciones de operadores e intente infix, postfix y prefix en ese orden. El
d
método utilizaeval
el segundo parámetro para realizar los cálculos, capturando cualquier excepción DivideByZero o Overflow.Sin embargo, debe enviar stderr a / dev / null, o de lo contrario
eval
a veces imprimirá advertencias como(eval):1: warning: in a**b, b may be too big
.Mientras se me ocurría esta falta de golf, ¡encontré una manera de salvar tres caracteres!
Sin golf (principios anticuados pero similares):
Registro de cambios
247 hizo que esto funcione para números más grandes en lugar de agotar el tiempo de espera.
220 recortaron tres caracteres declarando matrices de pares y arreglaron un error en el que los números de un dígito se consideraban VNFN
213 confirmación inicial
fuente
a.zip(b,c)
devuelve una matriz de matrices como[ [a[0],b[0],c[0]],[a[1],b[1],c[1]], etc.]
y['hi', 'there']*''
simplemente concatena la representación de cadena de los valores de la matriz.[a,b]*3
rinde[a,b,a,b,a,b]
MATLAB (435 b)
pruébalo aquí
http://octave-online.net/
fuente
Python 2, 303 bytes
Pruébalo en línea
La salida de infijo contendrá en
**
lugar de^
. Si esto no está permitido,.replace('**','^')
ocurrirá y agregará otros 18 bytesExplicación:
fuente