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.