Ricerca per parole del tastierino numerico


20

Dato un numero intero compreso tra 1 e 999 inclusi, genera un valore di verità se appare in orizzontale, verticale o diagonale, in avanti o all'indietro, ovunque nel quadrato 3x3 delle cifre 1-9 su un tastierino numerico standard :

789
456
123

Se il numero non viene visualizzato, emettere un valore errato.

Gli esatti 65 numeri di cui hai bisogno per produrre verità sono:

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

Tutto il resto è falso.

Vince il codice più breve in byte.



L'input può contenere 0, può essere una stringa.
Hobby di Calvin il

Vedo Luis Mendo presentarsi con una risposta MATL nel prossimo futuro eh.
Magic Octopus Urn

Risposte:


16

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

Accetta l'input come stringa.

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

Risparmiato 3 byte grazie a ETHproductions

Come funziona

Trasformiamo il tastierino numerico applicando un offset a ciascuna cifra in base alla riga a cui appartiene:

  • +1 per la riga superiore
  • 0 per la riga centrale
  • -1 per la riga inferiore.

Tutti i codici seguenti sono rappresentati in esadecimale.

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

Consideriamo tutte le combinazioni XOR di questi nuovi codici chiave. I tasti contigui sono evidenziati tra parentesi.

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 

Possiamo vedere che due chiavi sono contigue se e solo se XORing dei loro codici porta a uno dei seguenti valori:

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

Questo elenco può essere inserito nella seguente maschera binaria:

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

Da qui il test per determinare se due codici chiave (a, b) corrispondono a due chiavi contigue:

45242 >> (a ^ b) & 1

Per tre codici chiave (a, b, c), abbiamo bisogno di questo test aggiuntivo:

b * 2 == a + c

Esempio:

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

dimostrazione

Questo frammento restituisce l'elenco dei valori di verità.


La coercizione è il tuo amico qui: a-.5restituisce vero per qualsiasi array acontenente (zero o) un numero intero. 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, bello! 1/aè ancora più breve e dovrebbe funzionare altrettanto bene, penso.
Arnauld,

5

Python3, 72 byte

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

L'input è preso come una stringa.

Suggerimenti di golf benvenuti! : D


Questo prende il numero come una stringa?
FlipTack

@ Flp.Tkc Sì. Lo citerò nel post. Grazie!
Yytsi,

@TuukkaX c'è uno spazio aggiuntivo nella stringa s, è possibile salvare 1 byte.
Gurupad Mamadapur,

@GurupadMamadapur Non vedo perché dovrei cambiare la mia attuale soluzione di 72 byte con la tua soluzione di 74 byte ...: D E se ti riferisci alla mia stringa s, che ha uno spazio bianco dopo 84, allora non sei corretto, poiché è richiesto. Se non contenesse uno spazio bianco, la stringa risultante avrebbe una catena "8448", che porterebbe a casi di test falliti. Grazie per i suggerimenti però!
Yytsi,

@TuukkaX Sì, hai ragione riguardo allo spazio extra, lo hai perso :)
Gurupad Mamadapur,

4

Befunge, 169 161 159 byte

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<@.!!<

Provalo online!

Le prime due righe stanno semplicemente spingendo l'elenco dei numeri di test nello stack. Questo viene fatto in ordine di dimensione, poiché a volte può essere più semplice generare un numero come offset dal precedente della serie piuttosto che generarlo da zero. Una volta arrivati ​​ai numeri più grandi, a volte possiamo anche salvare un byte generandoli in coppie, ad esempio "kV"3*\3*ci dà 258 e 321 in nove byte, dove individualmente prenderebbero cinque byte ciascuno.

Il ciclo principale è sulla terza linea, eseguendo da destra a sinistra con avvolgimento. Ciò scorre solo attraverso tutti i numeri di test nello stack, confrontando il valore stesso, il valore% 100 e il valore / 10. Se uno qualsiasi di questi corrisponde al numero di input o al numero <= 9, allora emettiamo 1 e usciamo. Se non vi è alcuna corrispondenza, continuiamo il loop. Se esauriamo i numeri di test nello stack, produciamo 0 e usciamo.

Grazie a Mistah Figgins per avermi salvato un paio di byte.


Penso che puoi cambiare l'ultima riga in 0<@.!!<per salvare 2 byte. Ciò si basa sul fatto che la parte superiore dello stack è diversa da zero quando l'IP scende sulla seconda freccia. Provalo online!
Leggermente mediocre il

3

Gelatina , 29 24 19 byte

5 byte salvati grazie al suggerimento di @ Dennis Ke Ɠ.

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

Provalo online!

Spiegazione

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

Se leggi l'input da STDIN, 9s3µUŒD;;Z;ŒDµ;UKƓẇsalva 5 byte.
Dennis,

Devi invertire le file? Possono apparire in avanti o indietro, quindi 123,456,789dovrebbe essere lo stesso di789,456,123
Riley il

@Riley Invertisco ogni riga, non le righe come un array. Immagino che avrei potuto essere più chiaro lì. Comunque, è fatto per ottenere metà delle diagonali.
PurkkaKoodari,

2

Rubino, 77 byte

->n{!!((s='123 456 789 147 258 369 753 951 86 62 24 48 ')+s.reverse)["#{n}"]}

Stai creando una stringa che è '123 456 789 147 258 369 753 951' + la stessa stringa invertita e stai verificando se il parametro si trova sulla stringa, giusto? In tal caso, questa soluzione non è valida. Ad esempio, 86e 24fallirà.
Yytsi,

Le regole dicono che è necessario solo generare un valore di verità o falsità, quindi non è necessario !!o le parentesi associate .
Giordania,

0

bash, 75

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

genera qualcosa e restituisce 0 per tutti i valori in quell'elenco

non stampa nulla e restituisce 1 in tutti gli altri casi


0

Java, 397 byte

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);}}

Sono nuovo di questo ... scusate gentilmente qualsiasi oblio.
Nefi knomore

Ciao e benvenuto nel sito! Ho modificato il tuo post in modo che la sezione del codice venga visualizzata come codice e aggiunto un conteggio di byte, che è standard per le risposte qui. Questa competizione è una competizione di code-golf , il che significa che l'obiettivo finale è quello di rendere il tuo codice il più breve possibile. Ad esempio, è possibile utilizzare nomi di variabili brevi e definire una funzione anziché una classe completa. Non sono bravo in Java, ma qui sono disponibili altri suggerimenti . Dovresti provare ad accorciare il tuo codice e quindi modificare la nuova versione nel tuo post.
DJMcMayhem
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.