Nummernblock-Wortsuche

20

Geben Sie bei einer Ganzzahl von 1 bis einschließlich 999 einen Wahrheitswert aus, wenn dieser horizontal, vertikal oder diagonal vorwärts oder rückwärts im 3x3-Quadrat der Ziffern 1-9 auf einem Standard- Ziffernblock angezeigt wird :

789
456
123

Wenn die Nummer nicht angezeigt wird, geben Sie einen falschen Wert aus.

Die genauen 65 Zahlen, für die Sie die Wahrheit ausgeben müssen, sind:

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

Alles andere ist falsch.

Der kürzeste Code in Bytes gewinnt.

Calvins Hobbys
quelle
Relevantes OEIS .
Fatalize
Die Eingabe kann 0 enthalten, es kann sich um eine Zeichenfolge handeln.
Calvins Hobbys
Ich sehe Luis Mendo in naher Zukunft mit einer MATL-Antwort auftauchen.
Magic Octopus Urn

Antworten:

16

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

Übernimmt die Eingabe als Zeichenfolge.

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

3 Bytes gespart dank ETHproductions

Wie es funktioniert

Wir transformieren den Nummernblock, indem wir jeder Ziffer einen Versatz zuweisen, der der Zeile entspricht, zu der sie gehört:

  • +1 für die oberste Reihe
  • 0 für die mittlere Reihe
  • -1 für die unterste Reihe.

Alle folgenden Codes werden hexadezimal dargestellt.

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

Betrachten wir alle XOR-Kombinationen dieser neuen Schlüsselcodes. Angrenzende Tasten sind in eckigen Klammern markiert.

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 

Wir können sehen, dass zwei Schlüssel genau dann zusammenhängend sind, wenn die XOR-Verknüpfung ihrer Codes zu einem der folgenden Werte führt:

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

Diese Liste kann in die folgende Binärmaske gepackt werden:

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

Daher der Test, um festzustellen, ob zwei Tastencodes (a, b) zwei zusammenhängenden Tasten entsprechen:

45242 >> (a ^ b) & 1

Für drei Tastencodes (a, b, c) benötigen wir diesen zusätzlichen Test:

b * 2 == a + c

Beispiel:

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

Demo

Dieses Snippet gibt die Liste der Wahrheitswerte aus.

Arnauld
quelle
Hier ist Coercion Ihr Freund: a-.5Gibt true für jedes Array zurück, adas (null oder) eine ganze Zahl enthält. 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, schön! 1/aist noch kürzer und sollte genauso gut funktionieren, denke ich.
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]

Die Eingabe wird als Zeichenfolge verwendet.

Golfvorschläge willkommen! : D

Yytsi
quelle
Nimmt dies die Zahl als Zeichenfolge?
FlipTack
@ Flp.Tkc Ja, das tut es. Ich werde das in der Post erwähnen. Vielen Dank!
Yytsi
@ TuukkaX gibt es einen zusätzlichen Platz in Zeichenfolge s, Sie können 1 Byte speichern.
Gurupad Mamadapur
@ GurupadMamadapur Ich verstehe nicht, warum ich meine derzeitige 72-Byte-Lösung in Ihre 74-Byte-Lösung ändern würde ...: D Und wenn Sie auf meine Zeichenfolge verweisen, shinter der ein Leerzeichen steht 84, dann sind Sie falsch, da dies erforderlich ist. Wenn es kein Leerzeichen enthalten würde, hätte die resultierende Zeichenfolge eine Kette '8448', was zu fehlgeschlagenen Testfällen führen würde. Vielen Dank für die Vorschläge!
Yytsi
@ TuukkaX Ja, Sie haben Recht mit dem zusätzlichen Leerzeichen, das verpasst wurde :)
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<@.!!<

Probieren Sie es online!

Die ersten beiden Zeilen drücken nur die Liste der Testnummern auf den Stapel. Dies erfolgt in der Reihenfolge der Größe, da es manchmal einfacher ist, eine Zahl als Versatz von der vorherigen in der Reihe zu generieren, als sie von Grund auf neu zu generieren. Sobald wir zu den größeren Zahlen gekommen sind, können wir manchmal auch ein Byte speichern, indem wir sie paarweise erzeugen, z"kV"3*\3* 258 und 321 in neun Bytes, wobei sie einzeln jeweils fünf Bytes benötigen.

Die Hauptschleife befindet sich in Zeile drei und wird von rechts nach links mit Umlauf ausgeführt. Dadurch werden nur alle Testnummern auf dem Stapel durchlaufen und der Wert selbst, der Wert% 100 und der Wert / 10 verglichen. Wenn einer dieser Werte mit der eingegebenen Zahl oder der Zahl <= 9 übereinstimmt, geben wir 1 aus und beenden den Vorgang. Wenn es keine Übereinstimmung gibt, wird die Schleife fortgesetzt. Wenn uns die Testnummern auf dem Stapel ausgehen, geben wir 0 aus und beenden.

Vielen Dank an Mistah Figgins , die mir ein paar Bytes gespart hat.

James Holderness
quelle
Ich denke, Sie können die letzte Zeile ändern 0<@.!!<, um 2 Bytes zu sparen. Dies setzt voraus, dass die Spitze des Stapels nicht Null ist, wenn die IP auf den zweiten Pfeil fällt. Probieren Sie es online!
MildlyMilquetoast
3

Jelly , 29 24 19 Bytes

5 Bytes gespart dank @ Dennis 'Vorschlag von Kund Ɠ.

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

Probieren Sie es online!

Erläuterung

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
quelle
Wenn Sie die Eingabe von STDIN lesen, werden 9s3µUŒD;;Z;ŒDµ;UKƓẇ5 Bytes gespeichert .
Dennis
Müssen Sie die Zeilen umkehren? Sie können vorwärts oder rückwärts erscheinen, 123,456,789sollten also mit789,456,123
Riley
@Riley Ich vertausche jede Zeile, nicht die Zeilen als Array. Ich glaube, ich hätte dort klarer sein können. Wie auch immer, es wird gemacht, um die Hälfte der Diagonalen zu bekommen.
PurkkaKoodari
2

Ruby, 77 Bytes

->n{!!((s='123 456 789 147 258 369 753 951 86 62 24 48 ')+s.reverse)["#{n}"]}
Vasu Adari
quelle
Sie erstellen eine Zeichenfolge mit dem Namen '123 456 789 147 258 369 753 951' + der gleichen Zeichenfolge und überprüfen, ob der Parameter in der Zeichenfolge gefunden wird, oder? Ist dies der Fall, ist diese Lösung ungültig. Zum Beispiel 86und 24wird fehlschlagen.
Yytsi
Die Regeln besagen, dass Sie nur einen Wahrheits- oder Falschwert ausgeben müssen, also keine !!oder die zugehörigen Klammern.
Jordanien
0

Bash, 75

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

gibt etwas aus und gibt für alle Werte in dieser Liste 0 zurück

druckt nichts und gibt in allen anderen Fällen 1 zurück

Izabera
quelle
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
quelle
Ich bin neu in diesem Bereich. Entschuldigen Sie bitte jeglichen Vergesslichkeitsgedanken.
Nefi Knomore
Hallo und willkommen auf der Seite! Ich habe Ihren Beitrag so bearbeitet, dass der Codeabschnitt als Code angezeigt wird, und eine Byteanzahl hinzugefügt, die für Antworten hier Standard ist. Dieser Wettbewerb ist ein Code-Golf- Wettbewerb. Das ultimative Ziel ist es, Ihren Code so kurz wie möglich zu halten. Beispielsweise können Sie kurze Variablennamen verwenden und eine Funktion anstelle einer vollständigen Klasse definieren. Ich kann Java nicht besonders gut, aber hier gibt es noch ein paar Tipps . Sie sollten versuchen, Ihren Code zu verkürzen, und dann die neue Version in Ihrem Beitrag bearbeiten .
DJMcMayhem