Búsqueda de palabras de teclado numérico

20

Dado un número entero de 1 a 999 inclusive, genera un valor verdadero si aparece horizontal, vertical o diagonal, hacia adelante o hacia atrás, en cualquier lugar del cuadrado de 3x3 de los dígitos 1-9 en un teclado numérico estándar :

789
456
123

Si el número no aparece, genera un valor falso.

Los 65 números exactos para los que debe generar la verdad son:

1
2
3
4
5
6
7
8
9
12
14
15
21
23
24
25
26
32
35
36
41
42
45
47
48
51
52
53
54
56
57
58
59
62
63
65
68
69
74
75
78
84
85
86
87
89
95
96
98
123
147
159
258
321
357
369
456
654
741
753
789
852
951
963
987

Todo lo demás es falso.

El código más corto en bytes gana.

Pasatiempos de Calvin
fuente
OEIS relevantes .
Fatalize
La entrada puede contener 0, puede ser una cadena.
Aficiones de Calvin
Veo a Luis Mendo aparecer con una respuesta MATL en un futuro cercano, je.
Urna de pulpo mágico

Respuestas:

16

JavaScript (ES6), 83 ... 74 73 bytes

Toma la entrada como una cadena.

n=>1/([a,b,c]=[...n].map(v=>--v+v/3|0))||45242>>(a^b)&(~c&&n<99|b*2==a+c)

Guardado 3 bytes gracias a ETHproductions

Cómo funciona

Transformamos el teclado numérico aplicando un desplazamiento a cada dígito de acuerdo con la fila a la que pertenece:

  • +1 para la fila superior
  • 0 para la fila del medio
  • -1 para la fila inferior.

Todos los códigos a continuación están representados en hexadecimal.

7 8 9      8 9 A  (+1)
4 5 6  =>  4 5 6  (unchanged)
1 2 3      0 1 2  (-1)

Consideremos todas las combinaciones XOR de estos nuevos códigos clave. Las teclas contiguas se resaltan con corchetes.

XOR|  0   1   2   4   5   6   8   9   A 
---+------------------------------------
 0 |  0  [1]  2  [4] [5]  6   8   9   A 
 1 | [1]  0  [3] [5] [4] [7]  9   8   B 
 2 |  2  [3]  0   6  [7] [4]  A   B   8 
 4 | [4] [5]  6   0  [1]  2  [C] [D]  E 
 5 | [5] [4] [7] [1]  0  [3] [D] [C] [F]
 6 |  6  [7] [4]  2  [3]  0   E  [F] [C]
 8 |  8   9   A  [C] [D]  E   0  [1]  2 
 9 |  9   8   B  [D] [C] [F] [1]  0  [3]
 A |  A   B   8   E  [F] [C]  2  [3]  0 

Podemos ver que dos claves son contiguas si y solo si XORing sus códigos conduce a uno de los siguientes valores:

1, 3, 4, 5, 7, C, D, F

Esta lista se puede empaquetar en la siguiente máscara binaria:

  FEDCBA9876543210
  ----------------
0b1011000010111010 = 0xB0BA = 45242

De ahí la prueba para determinar si dos códigos clave (a, b) corresponden a dos claves contiguas:

45242 >> (a ^ b) & 1

Para tres códigos clave (a, b, c), necesitamos esta prueba adicional:

b * 2 == a + c

Ejemplo:

a = 0xA
b = 0x6
c = 0x2

0xB0BA >> (0xA ^ 0x6) & 1 == 0xB0BA >> 0xC & 1 == 1
=> 0xA and 0x6 are contiguous key codes

0x6 * 2 == 0xA + 0x2
=> 0xA, 0x6 and 0x2 are contiguous key codes on the same row, column or diagonal

Manifestación

Este fragmento genera la lista de valores verdaderos.

Arnauld
fuente
La coerción es tu amigo aquí: a-.5 devuelve verdadero para cualquier matriz que acontenga (cero o) un entero. n=>([a,b,c]=[...n].map(v=>--v+v/3|0))-.5||n%10&&n<100|b*2==a+c&&45242&1<<(a^b)
ETHproductions
@ETHproductions ¡Ah, bien! 1/aes incluso más corto y debería funcionar igual de bien, creo.
Arnauld
5

Python3, 72 bytes

lambda n,s="123 456 789 741 852 963 42 753 86 26 159 84 ":n in s+s[::-1]

La entrada se toma como una cadena.

Sugerencias de golf bienvenidas! :RE

Yytsi
fuente
¿Esto toma el número como una cadena?
FlipTack
@ Flp.Tkc Sí, lo hace. Lo mencionaré en la publicación. ¡Gracias!
Yytsi
@TuukkaX hay un espacio adicional en la cadena s, puede guardar 1 byte.
Gurupad Mamadapur
@GurupadMamadapur No veo por qué cambiaría mi solución actual de 72 bytes a su solución de 74 bytes ...: D Y si hace referencia a mi cadena s, que tiene un espacio en blanco después 84, entonces es incorrecto, ya que es obligatorio. Si no contuviera un espacio en blanco, la cadena resultante tendría una cadena '8448', lo que conduciría a casos de prueba fallidos. ¡Gracias por las sugerencias!
Yytsi
@TuukkaX Sí, tienes razón sobre el espacio en blanco adicional, te lo perdiste :)
Gurupad Mamadapur
4

Befunge, 169 161 159 bytes

38*:2+"*0>DTV{51"3*\3*"kV"3*\3*"{w"3*\3*"mr"v
v:\&+*83:++66:+"c":+"?":+"$":++66:+"W":*6\*4<
_v#:\_v#*-+%+55g00*+55g02\*-g02\*-g00\`9::::p02/+55p00%"d":
0<@.!!<

Pruébalo en línea!

Las primeras dos líneas simplemente están empujando la lista de números de prueba a la pila. Esto se hace en orden de tamaño, ya que a veces puede ser más fácil generar un número como un desplazamiento del anterior en la serie en lugar de generarlo desde cero. Una vez que llegamos a los números más grandes, a veces también podemos guardar un byte al generarlos en pares, por ejemplo, "kV"3*\3*nos da 258 y 321 en nueve bytes, donde individualmente tomarían cinco bytes cada uno.

El bucle principal está en la línea tres, ejecutándose de derecha a izquierda con una envoltura. Esto solo itera a través de todos los números de prueba en la pila, comparando el valor en sí, el valor% 100 y el valor / 10. Si alguno de ellos coincide con el número de entrada o el número <= 9, entonces sacamos 1 y salimos. Si no hay coincidencia, continuamos en bucle. Si se nos acaban los números de prueba en la pila, sacamos 0 y salimos.

Gracias a Mistah Figgins por salvarme un par de bytes.

James Holderness
fuente
Creo que puede cambiar la última línea 0<@.!!<para guardar 2 bytes. Esto se basa en que la parte superior de la pila no es cero cuando la IP baja a la segunda flecha. Pruébalo en línea!
MildlyMilquetoast
3

Jalea , 29 24 19 bytes

Guardado 5 bytes gracias a la sugerencia de @ Dennis de Ky Ɠ.

9s3µUŒD;;Z;ŒDµ;UKƓẇ

Pruébalo en línea!

Explicación

9Rs3µUŒD;;Z;ŒDµ;UKƓẇ  Main link. Argument: number
9s3                   Split [1..9] into [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
   µ                  New monadic chain
    U                 Reverse the rows
     ŒD               Take the diagonals of the result
       ;              Append the original rows
        ;Z            Append the original columns
          ;ŒD         Append the original diagonals
             µ        New monadic chain
              ;U      Append the reverse of everything
                K     Join by spaces
                 Ɠẇ   Check if a line from STDIN is in the result
PurkkaKoodari
fuente
Si lee la entrada de STDIN, 9s3µUŒD;;Z;ŒDµ;UKƓẇahorra 5 bytes.
Dennis
¿Necesitas invertir las filas? Pueden aparecer hacia adelante o hacia atrás, por lo que 123,456,789debería ser lo mismo que789,456,123
Riley
@Riley Invierto cada fila, no las filas como una matriz. Supongo que podría haber sido más claro allí. De todos modos, se hace para obtener la mitad de las diagonales.
PurkkaKoodari
2

Ruby, 77 bytes

->n{!!((s='123 456 789 147 258 369 753 951 86 62 24 48 ')+s.reverse)["#{n}"]}
Vasu Adari
fuente
Está creando una cadena que es '123 456 789 147 258 369 753 951' + la misma cadena invertida, y verifica si el parámetro se encuentra en la cadena, ¿verdad? Si es así, entonces esta solución no es válida. Por ejemplo, 86y 24fallará.
Yytsi
Las reglas dicen que solo necesita generar un valor verdadero o falso, por lo que no necesita !!los paréntesis correspondientes.
Jordan
0

bash, 75

printf %s\\n 123 456 789 741 852 963 42 753 86 26 159 84|tee >(rev)|grep $1

genera algo y devuelve 0 para todos los valores de esa lista

no imprime nada y devuelve 1 en todos los demás casos

izabera
fuente
0

Java, 397 bytes

public class Numpad {public static void main(String[] args){Scanner input=new Scanner(System.in);int in=input.nextInt();int h=in/100;int u=in%10;int t=(in%100)/10;boolean out=false;input.close();if(in<10)out=true;else if( h==0){int decider=Math.abs(t-u);if((decider==1)||(decider==3)||(decider==4))out=true;}else{if ( Math.abs(h-t) == Math.abs(t-u))out=true;}System.out.println("RESULT : "+out);}}
Nefi knomore
fuente
Soy nuevo en esto ... disculpe amablemente cualquier olvido.
Nefi knomore
Hola y bienvenidos al sitio! Edité su publicación para que la sección de código se muestre como código y agregué un recuento de bytes, que es estándar para las respuestas aquí. Esta competencia es una competencia de código de golf , lo que significa que el objetivo final es hacer que su código sea lo más breve posible. Por ejemplo, puede usar nombres cortos de variables y definir una función en lugar de una clase completa. No soy bueno en Java, pero hay algunos consejos más disponibles aquí . Debe intentar acortar su código y luego editar la nueva versión en su publicación.
DJMcMayhem