Inspirado en xkcd .
Su desafío es determinar si un número sería una buena combinación en el juego 2048 . Su entrada será un número, como:
8224
Y la salida será si ese número sería un buen combo de 2048, que para esta entrada sería true
o yes
o 1
o cualquier otra forma de indicar un resultado positivo.
Para aquellos que no están familiarizados con el juego, he aquí una explicación sencilla: las potencias de dos están dispuestas en una cuadrícula, como esto: [2] [2]
. Las fichas se pueden mover en cualquier dirección, y si dos fichas idénticas se encuentran, se convierten en la siguiente potencia de dos (así que [2] [2]
cuando se mueven hacia la izquierda o hacia la derecha [4]
). O bien, puedes probar el juego aquí .
¿Qué significa "una buena combinación 2048"? Significa cualquier número que, si estaba en el juego "2048", podría combinarse en un solo número. (Un cero significa un espacio vacío , y puede ignorarse si es necesario). ¡Tenga en cuenta que los números pueden ser múltiples dígitos! Sin embargo, los números no deben cambiar entre movimientos. Aquí hay algunos ejemplos / casos de prueba (con "Bueno" que indica una buena combinación y "Malo" que significa que no es bueno):
- Bueno: 8224 (8224 -> 844 -> 88 -> 16)
- Bueno: 2222 (2222 -> 44 -> 8)
- Bueno: 22048 (22048 -> 448 -> 88 -> 16)
- Malo: 20482 (no puede combinar los 2 externos, ni puede combinar un 2048 y un 2)
- Bueno: 20482048 (20482048 -> 4096)
- Malo: 210241024 (210241024 -> 22048, pero ahora es [2] [2048] y no se puede combinar ya que los números no pueden cambiar entre movimientos)
- Bien: 2048 (ya es un número)
- Malo: 2047 (no es un poder de 2)
- Malo: 11 (no hay 1 en el juego)
- Bueno: 000040000000 (los ceros son espacios vacíos)
Reglas misceláneas:
- La entrada puede ser desde cualquier lugar razonable, es decir, STDIN, argumento de función, archivo, etc.
- La salida también puede ser razonable, es decir, STDOUT, valor de retorno de función, archivo, etc.
- Ignorar el tamaño de la cuadrícula,
22222222
aún debería salir verdadero - No hay un máximo de lo que podría ser un número, siempre que sea una potencia de dos. Por lo tanto, los números posibles son cualquier potencia de dos mayor que 0.
- Para aquellos preocupados por los ceros que causan ambigüedad, ese no es el caso. Por ejemplo,
22048
se puede analizar como[2] [2048]
o[2] [2] [0] [4] [8]
. El primero no funciona, pero el segundo sí, por lo que debería ser verdadero. - Este es el código de golf , ¡así que el código más corto en bytes ganará!
1
22048
debería salir,good
pero eso no es cierto. Usted no puede combinar2
con2048
y la red es4x4
si todos los números deben ser separada obtendrá 5 células. entonces quizás deberías eliminar el0
? Además, su quinto ejemplo parece no ser válido ya que el juego se detiene en2048
:)Respuestas:
GolfScript, 137 caracteres
La entrada debe darse en STDIN. La salida es
0
/1
para números malos / buenos. La mayor parte del código es necesario para analizar las posibles entradas.Esta versión más corta (113 caracteres) realiza una prueba de cambio simple que no funcionaría correctamente para entradas como
224422
.Todos los casos de prueba se pueden verificar en línea .
fuente
Python:
457422 caracteresLa función f (s) obtiene una cadena de dígitos y genera 'bueno' o 'malo' en consecuencia. Elegí no usar 0 como espacios porque los espacios no tienen sentido en el juego y crean ambigüedad al analizar cadenas (¿22048 es bueno o malo?). Esto solo usa números hasta 2048, pero eso se puede cambiar sin agregar caracteres. Al costo de aproximadamente 10 caracteres, también puedo imprimir todos los pasos para combinar los números. Y me doy cuenta de que este código aún no se ha jugado lo suficiente; no te preocupes, las ediciones están por venir.
fuente
Haskell:
285 254 253 237 230227uso: simplemente cárguelo en ghci y pase la cadena a h.
Código:
Comentario:
i
es la comprobación de si un número es una potencia de 2, esto será superado por los idiomas con un poco de giro.%
genera recursivamente todos los análisis que son listas de potencias de 2 o 0.c
contrae los mosaicos.l
prueba recursivamente si las fichas son plegables a la izquierda o bien.g
prueba si las fichas son plegables a la izquierda o la derecha. No hay límite para los números en los mosaicos, por ejemplo,h ((show (2^200))++(show (2^200)))
devuelve verdadero para 2 mosaicos marcados "1606938044258990275541962092341162602522202993782792835301376".Editado para corregir un error que no colapsó correctamente "88222288888" a la derecha, pero también encontró más oportunidades de golf.
fuente
Perl, 175-336 bytes
Mantener intactos los elementos esenciales:
[ 64 y 256 conducen a algunas ambigüedades poco resolubles que la codiciosa correspondencia no puede resolver ... pero estos son buenos recuentos de bytes. ]
fuente
Delphi
572582 caracteresCódigo editado, el límite se establece en 2 ^ 30 para que no supere el valor MaxInt en Delphi.
Golfed
Sin golf
EDITAR
Entonces sentí curiosidad y me pregunté cuántas de estas combinaciones encajarían en el rompecabezas y realicé una prueba.
Para otros que también son curiosos, haga una prueba también;)
Pero bueno, aquí están los resultados:
20736 combinations were tested and 1166 were great combinations
Debo decir combinaciones de 3 o más ceros se omiten (tiene sentido ¿verdad?)
Combinaciones son casi única, es decir, las combinaciones
2248
,8224
,8422
y4228
todos fueron contados como una gran combinación.fuente
Mathematica - 218 bytes
Versión sin golf:
La
Internal\
magia PartitionRagged` se toma de esta pregunta .Esta solución maneja tamaños de cuadrícula arbitrarios y números arbitrariamente grandes.
Aquí hay una versión de 195 bytes que funciona como el juego real con solo 4 mosaicos (así
f[22222222]
esFalse
):donde he reemplazado
con
fuente
DeleteCases
parece que elimina los pares más a la izquierda,f[88222288888]
¿fallaría?DeleteCases
simplemente elimine ceros y números que no sean potencia de dos. El colapso real de los pares se realiza mediante la regla//. {a___, x_, x_, b___} :> {a, 2 x, b}
, que funciona para ese número y lo contrario. En realidad, no estoy completamente seguro sobre el orden en que Mathematica aplica esos reemplazos, pero funciona.Haskell - 260
263f
Es la función. Ejemplos:Una pequeña explicación:
p
devuelve todas las formas de dividir una lista.q
filtra aquellos que consisten en solo potencias de 2 (excluyendo 1 pero incluyendo 0).c
intenta colapsar una cadena.r
itera la colisión derecha e izquierda hasta que solo queda 1 elemento, o la cadena es incollapsable.fuente
c
embargo, hay un error , prueba "222244442222", devuelve verdadero, pero eso no es plegable en el juego. Necesita recurrir con(2*x):c s
.