Rompecabezas de cuatro patas

21

El acertijo Four fours es un acertijo matemático recreativo popular que implica el uso de exactamente cuatro 4s (y ningún otro número) y un conjunto definido de operaciones para alcanzar cada número desde 0 hasta un máximo dado.

En esta versión, los únicos operadores siguientes están permitidos:

  • Se puede usar cualquier símbolo de agrupación
  • Suma ( +), Resta ( -), Multiplicación ( *), División ( /)
  • Factorial ( !), función Gamma ( Γ)
  • Exponenciación ( ^), raíz cuadrada ( )
  • Concatenación (por ejemplo, 44es dos 4s)
  • Punto decimal (p. Ej., 4.4Dos 4s), Overbar (p. Ej. .4~ = 4/9)

Se aplica el orden estándar de operaciones.

Su programa debe generar, dada una entrada entre 0 y 100 inclusive, una solución correcta para esa entrada. Si el programa genera una solución no válida para cualquier entrada, ese programa no es válido.

Por ejemplo, con una entrada de 0, su programa podría generar 44-44.

El uso de módulos externos no está permitido. Solo _.4~está permitido para el operador de barra superior, es decir, solo uno 4puede estar detrás del punto decimal.

Este es el código golf, por lo que gana la solución más corta


Editar : para ser más claro, el programa debe generar un conjunto de las operaciones anteriores aplicadas exactamente a cuatro 4s, ni más ni menos. Además, .4 = 4/10es un término válido y cuenta como usar solo uno 4.

Volatilidad
fuente
no hay operaciones de redondeo? :-(
John Dvorak
@ JanDvorak err, no, eso no estaría permitido.
Volatilidad
¿Gamma y factorial están permitidos?
John Dvorak
@JanDvorak todo lo que está en la lista (pero solo se pueden usar las cosas que están en la lista).
Volatilidad
¿Se nos permite generar factorial como función de prefijo (en !(4)lugar de (4)!)?
John Dvorak

Respuestas:

6

GolfScript (129 caracteres *)

[4.`2'√4'24'4!'6'Γ4'1'Γ√4'120'ΓΓ4']2/:F{.F=[[44.`]]*\{`{+{'+*-'1/{:^;.[~@[\]{'()'1/*}%^*@@^~\]\}/}:|~2/~\+|;}+F/}%+}3*\{\0==}+?1=

El tiempo de ejecución es del orden de 4 minutos en mi PC. Se puede obtener una aceleración moderada a costa de dos caracteres agregando una operación de unicidad .&inmediatamente después del %+.

Utilizo expresiones pre-codificadas 1, 2, 4, 6, 24, 120, y 44, y construir el resto a partir de los que utilizan solamente +, *y -. De esta manera, no necesito hacer ninguna aritmética no entera en el programa en sí. Intenté obtener expresiones más simples colocando los valores precodificados más simples al comienzo.

Todos esos valores son obligatorios , y es necesario admitir ambas direcciones de sustracción ( complex_expression - simple_expressiony viceversa). También es necesario incluir algunas operaciones que requieren paréntesis (específicamente a*(b-c)), por lo que pongo entre paréntesis todas las subexpresiones indiscriminadamente.

* Estoy contando puntos de código Unicode suponiendo que el programa esté codificado en UTF-8, y ocultando el hecho de que, a menos que esté utilizando una versión reciente de Ruby para ejecutar el intérprete, realmente lo trata como caracteres ASCII. Si está muy preocupado por esto, use Gpara Gamma y vpara sqrt.

Bueno, estrictamente podría eliminar 44a cambio de 11as 44/4y 71as √(Γ√4+(ΓΓ4+Γ√4)!), pero eso no es una buena compensación.

Peter Taylor
fuente
7

Python 155 bytes

h={4:'4',24:'4!',6:'â4',.4:'.4',1:'âû4',4/9.:'.4~'}
f={}
def g(r,s='24',y='4!'):f[eval(s)]=y;[g(r-1,s+o+`k`,y+o+h[k])for k in h for o in'/*-+'if r]
g(3)

Los primeros tres bytes ( \xEF\xBB\xBF) son la marca de orden de bytes UTF-8, aunque el archivo debe guardarse en formato ANSI. El ûy âse interpretará como y Γrespectivamente en cp437 y cp850 , que deberían funcionar en casi cualquier cuadro de Windows.

El tiempo de ejecución es de aproximadamente 0.4s en mi computadora.

Uso de muestra (nombre del archivo four_fours.py):

$ python
>>> from four_fours import f
>>> f[39]
'4!+4!/.4/4'
>>> f[87]
'4!*4-4/.4~'
>>> for i in range(101): print i, f[i]
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!
.
.
.
96 4!+4!+4!+4!
97 4!*4!/Γ4+Γ√4
98 4!*4+Γ4-4
99 4!*4+4-Γ√4
100 4!*4!/Γ4+4

Resultados para 0..100 . Debido a la forma en que se itera el hash, prefiere usarlo con la 4!mayor frecuencia posible.

Editar: guardó una cantidad de bytes agregando Γ√4 = 1, lo que elimina la necesidad de cualquier agrupación, y eliminando √4 = 2, lo que ya no era necesario.

primo
fuente
4

J, 175 161 caracteres

   f=.')',~'(',;@((<;._2'+ - * % .4 .4~ g(r(4)) r(4) 4 g(4) 4! ( ) '){~(143402 A.i.9)
      /:~(12,11,0,6$0 4 4)+(9$4 7 7)#:((,@(+/,-/,*/,%/)~)^:2,0.4 4r9 1 2 4 6 24)&i.)

   f 1
(.4+.4)+(.4%r(4))

   f 42
(r(4)+4)+(g(4)*g(4))

   f 100
(r(4)+r(4))+(4*4!)

El formato marcado es (v op v) op (v op v)dónde v={0.4 4/9 1 2 4 6 24}yop={+ - * /}

completo 0..100 resultados

randomra
fuente
No creo que .4sea ​​un número válido para este juego.
John Dvorak
@JanDvorak es - tal vez debería haberlo dejado más claro
Volatilidad