Snaking Number Challenge
Me pregunto cuántos números serpientes hay entre 1 y 50,000.
Los números serpientes, en este juego, son números que se pueden escribir en un teclado numérico tradicional (formato a continuación) moviendo una tecla hacia arriba, hacia abajo, hacia la izquierda o hacia la derecha.
7 8 9
4 5 6
1 2 3
0
Por ejemplo, si comienza con el número 5, puede seleccionar 4, 6, 8 o 2 como su próximo movimiento válido; sin embargo, 7, 3, 9 y 1 están fuera de los límites, ya que se colocan en diagonal a la tecla actual . Entonces, si tiene 5, entonces 2, sus próximas opciones clave viables son 0, 1, 3 o 5 nuevamente.
En este ejercicio de Code Golf, debe generar una lista de todos los números positivos entre 1 y 50k, junto con un recuento final de todos los números que cumplen con el criterio.
Reglas
- Los números no pueden comenzar con un cero.
- Los números deben ser enteros enteros positivos.
- Cada número consecutivo, leído de izquierda a derecha, debe "serpentear" alrededor del teclado numérico.
- La serpiente no puede viajar diagonalmente a través de las teclas.
- Se puede acceder al número 0 desde los números 1 y 2
- Los números no se pueden emparejar (p. Ej .: 22)
Ejemplos de números serpientes válidos:
12369
45201
1254
10102
1
12
987
Ejemplos de números inválidos
1238 - 8 is not connected
0001 - multiple leading 0s
0101 - leading 0
159 - snake cannot travel diagonally
4556 - duplicate 5
Según Code Golfs normales, ¡el objetivo es la menor cantidad de bytes!
De acuerdo con mis matemáticas y reglas, debe tener 670 números válidos de serpiente en su lista, más 670 impresos como el último número.
Respuestas:
K (ngn / k) ,
6057 bytesPruébalo en línea!
!50000
lista de0
..49999
1+
agregue 1 a todos{
}#
filtrar con la función en{
}
10\x
dígitos decimales del argumento(
)@
utilizar como índices en ...!3 3
un par de listas:(0 0 0 1 1 1 2 2 2;0 1 2 0 1 2 0 1 2)
2*
multiplica todo por 20 1,'
anteponer0
a la primera lista y1
a la segunda+
transposición (par de listas -> lista de pares). esto nos da los botones de botones aprox.-':
restar de cada par el par anterior. utilizar0 0
como elemento imaginario antes del primero.1_
soltar el primero+
transponerx*x:
cuadrado (asignarx
y multiplicar porx
). Aquíx
hay un par de listas: ∆xs y ∆ys+/
suma las dos listas (elemento por elemento)5&
min con 53!
mod 31=
lista booleana de donde es igual a 1*/
producto (booleano "y")(x;#x:
)
hacer un par del resultado y la longitud (#
) del resultadofuente
Jalea ,
2423 bytesUn programa completo que imprime una lista de todos los resultados y luego el número de resultados.
Pruébalo en línea!
¿Cómo?
fuente
1.
evalúa1.5
?Python 3 , 140 bytes
Pruébalo en línea!
Estoy seguro de que alguien podrá hacer esto con una expresión en lugar de una cadena de búsqueda.
fuente
Python 2 , 101 bytes
Pruébalo en línea!
El número hexadecimal es decimal
10120214525632365878969854741
, que codifica cada par ordenado de dígitos que pueden aparecer adyacentes entre sí.fuente
JavaScript (V8) ,
112106104bytesGuardado 2 bytes gracias a @NahuelFouilleul
Un programa completo
Pruébalo en línea!
O 96 bytes si podemos generar los números en orden inverso:
Pruébalo en línea!
fuente
3
quizás porque36
ya está en cadena6589632145201478
es un byte más cortoStax ,
3735 bytes¡Ejecútelo y depúrelo en staxlang.xyz!
Fue tan agradable y breve, hasta que no lo fue.
Desempaquetado (42 bytes) y explicación
2012365478963258741 codifica el teclado. Mira los pares de dígitos adyacentes. Quizás si pudiera obtener una alternativa decentemente corta que vaya en ambas direcciones para cada par, podría cortar los ocho bytes de
{{om
.Sin ese 670 final, un simple filtro sería suficiente: en
f..!
lugar de{..C_Qf%p
. Puede haber una mejor manera de manejar esta irregularidad. En cualquier caso, este comportamiento de rango de filtro no está documentado.fuente
PHP , 145 bytes
Pruébalo en línea!
Para cada número del 1 al 50,000, verifica cada dígito de ese número de izquierda a derecha. Si todos los dígitos están en la lista de dígitos válidos del dígito anterior, ese número se imprime. Al final imprime un 670 codificado, ya que toma menos bytes de los que realmente lo cuenta.
fuente
05AB1E , 23 bytes
Pruébalo en línea!
Port of Jonathan Allan's Jelly respuesta .
fuente
₄50*
o4°5*
cuando estaba haciendo un intento antes. Y al principio estaba confundido por qué lo tenía en€OP
lugar de soloOP
, pero luego me di cuenta de que los números de un solo dígito (que es una lista vacía después deüα
) serían en[] → 0 → 0
lugar de[] → [] → 1
. :)4°5*
cuando puedes5°;
? Aunque me gusta más ZAK. Y sí, ese caso límite para números de un solo dígito es una molestia.Perl 5 (
-M5.01
),96, 92 bytes-4 bytes gracias a @Xcali
TIO
fuente
JavaScript (SpiderMonkey) ,
179173151129 bytesPruébalo en línea!
-22 bytes gracias a Arnauld -22 bytes gracias a dana
explicación:
@dana también dio una solución de 123 bytes si podemos imprimir 670 primero
fuente
Ruby , 99 bytes
Pruébalo en línea!
fuente
Stax ,
2826 bytesEjecutar y depurarlo
Desempaquetado, sin golf y comentado, se ve así.
Ejecute este
La salsa secreta está en la cadena literal
"{<f:[/T8Z"
. Después de atascar todos los puntos de código juntos, obtienes12360102589147845690
. Los pares ascendentes en esta cadena son los movimientos válidos de la serpiente.fuente
15JJ
en lugar de219J
funcionaría bien, pero no creo que pueda jugar ningún byte desde allí a menos que haya una constante de 1 byte para15
.Haskell , 118 bytes
Pruébalo en línea!
Un primer pase; No soy bueno en compresión.
El
s=
no cuenta, ya que en realidad no necesitamos vincular el resultado.Código sin golf .
fuente
Carbón , 42 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Procesar el rango inclusivo de
1
al50,000
elenco de cadena.Filtre los que tienen pares de dígitos no contenidos en la cadena comprimida
01478963202125458565236987410
.Salida de la matriz restante y su longitud.
fuente
Japt , 34 bytes
Intentalo
fuente
Perl 6 , 64 bytes
Pruébalo en línea!
Explicación
fuente
~>
aún no se haya implementado, de lo contrario, podría hacerlo solo con operadores de cadena, con el campo de bits como una cadenaPyth ,
686545 bytesPruébalo en línea!
La inspiración para el proceso de búsqueda revisado vino de la respuesta Stax de Khuldraeseth na'Barya, ¡dales un voto positivo !
Edición 2: reescrito para guardar un montón de bytes, versión anterior:
Editar: Golfed 3 bytes mediante búsquedas de cadenas, versión anterior:
fuente