Pencarian Kata Numpad

20

Diberikan bilangan bulat dari 1 hingga 999 inklusif, mengeluarkan nilai kebenaran jika itu muncul secara horizontal, vertikal, atau diagonal, baik maju atau mundur, di mana saja dalam 3x3 kuadrat digit 1-9 pada pad nomor standar :

789
456
123

Jika nomor tidak muncul, hasilkan nilai palsu.

65 angka pasti yang Anda butuhkan untuk menghasilkan kebenaran adalah:

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

Yang lainnya salah.

Kode terpendek dalam byte menang.

Hobi Calvin
sumber
OEIS yang relevan .
Fatalkan
Input mungkin berisi 0, bisa berupa string.
Calvin Hobi
Saya melihat Luis Mendo muncul dengan jawaban MATL dalam waktu dekat heh.
Magic Octopus Mm

Jawaban:

16

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

Mengambil input sebagai string.

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

Disimpan 3 byte berkat produk ETH

Bagaimana itu bekerja

Kami mengubah nomor pad dengan menerapkan offset ke setiap digit sesuai dengan baris miliknya:

  • +1 untuk baris teratas
  • 0 untuk baris tengah
  • -1 untuk baris bawah.

Semua kode di bawah ini diwakili dalam heksadesimal.

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

Mari kita pertimbangkan semua kombinasi XOR dari kode kunci baru ini. Kunci yang berdekatan disorot dengan tanda kurung.

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 

Kita dapat melihat bahwa dua kunci berdekatan jika dan hanya jika XORing kode mereka mengarah ke salah satu dari nilai berikut:

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

Daftar ini dapat dimasukkan ke dalam topeng biner berikut:

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

Karenanya tes untuk menentukan apakah dua kode kunci (a, b) sesuai dengan dua kunci yang berdekatan:

45242 >> (a ^ b) & 1

Untuk tiga kode kunci (a, b, c), kami memerlukan tes tambahan ini:

b * 2 == a + c

Contoh:

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

Cuplikan ini menampilkan daftar nilai-nilai kebenaran.

Arnauld
sumber
Paksaan adalah teman Anda di sini: a-.5mengembalikan true untuk setiap array yang aberisi (nol atau) satu bilangan bulat. n=>([a,b,c]=[...n].map(v=>--v+v/3|0))-.5||n%10&&n<100|b*2==a+c&&45242&1<<(a^b)
ETHproduk
@ ETProduk Ah, bagus! 1/abahkan lebih pendek dan harus bekerja dengan baik, saya pikir.
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]

Input diambil sebagai string.

Selamat datang saran bermain golf! : D

Yytsi
sumber
Apakah ini mengambil angka sebagai string?
FlipTack
@ Flp.Tkc Ya itu. Saya akan menyebutkannya di pos. Terima kasih!
Yytsi
@ TuukkaX ada ruang tambahan dalam string s, Anda dapat menghemat 1 byte.
Gurupad Mamadapur
@ GarupadMamadapur Saya tidak melihat mengapa saya akan mengubah solusi 72 byte saya saat ini ke solusi 74 byte Anda ...: D Dan jika Anda merujuk ke string saya s, yang memiliki spasi setelah 84, maka Anda salah, karena itu diperlukan. Jika tidak berisi spasi putih, string yang dihasilkan akan memiliki rantai '8448', yang akan menyebabkan kegagalan pengujian. Terima kasih atas sarannya!
Yytsi
@TuukkaX Ya Anda benar tentang spasi tambahan, melewatkan yang itu :)
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<@.!!<

Cobalah online!

Dua baris pertama hanya mendorong daftar nomor tes ke tumpukan. Ini dilakukan dalam urutan ukuran, karena kadang-kadang lebih mudah untuk menghasilkan angka sebagai offset dari yang sebelumnya dalam seri daripada menghasilkannya dari awal. Begitu kita mencapai angka yang lebih besar, kita kadang-kadang juga bisa menyimpan satu byte dengan membuatnya berpasangan, misalnya "kV"3*\3*memberi kita 258 dan 321 dalam sembilan byte, di mana secara individual mereka akan mengambil masing-masing lima byte.

Loop utama ada di jalur tiga, mengeksekusi kanan ke kiri dengan membungkus. Ini hanya mengulangi semua nomor tes pada tumpukan, membandingkan nilai itu sendiri, nilai% 100, dan nilai / 10. Jika ada yang cocok dengan angka input atau angka <= 9 maka kita menghasilkan 1 dan keluar. Jika tidak ada kecocokan, kami terus mengulang. Jika kita kehabisan nomor tes pada stack maka kita menghasilkan 0 dan keluar.

Terima kasih kepada Mistah Figgins karena telah menyelamatkan saya beberapa byte.

James Holderness
sumber
Saya pikir Anda dapat mengubah baris terakhir 0<@.!!<untuk menghemat 2 byte. Ini bergantung pada bagian atas tumpukan yang tidak nol ketika IP turun ke panah kedua. Cobalah secara Online!
MildlyMilquetoast
3

Jelly , 29 24 19 byte

Disimpan 5 byte berkat saran @ Dennis dari Kdan Ɠ.

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

Cobalah online!

Penjelasan

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
sumber
Jika Anda membaca input dari STDIN, 9s3µUŒD;;Z;ŒDµ;UKƓẇsimpan 5 byte.
Dennis
Apakah Anda perlu membalikkan baris? Mereka dapat muncul ke depan atau ke belakang, jadi 123,456,789harus sama dengan789,456,123
Riley
@Riley Saya membalikkan setiap baris, bukan baris sebagai array. Saya kira saya bisa lebih jelas di sana. Bagaimanapun, itu dilakukan untuk mendapatkan setengah dari diagonal.
PurkkaKoodari
2

Ruby, 77 byte

->n{!!((s='123 456 789 147 258 369 753 951 86 62 24 48 ')+s.reverse)["#{n}"]}
Vasu Adari
sumber
Anda membuat string yang '123 456 789 147 258 369 753 951' + string yang sama terbalik, dan memeriksa apakah parameternya ditemukan pada string, kan? Jika demikian, maka solusi ini tidak valid. Misalnya, 86dan 24akan gagal.
Yytsi
Aturan mengatakan Anda hanya perlu menampilkan nilai yang benar atau salah, jadi Anda tidak perlu !!atau kurung yang hadir.
Jordan
0

bash, 75

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

mengeluarkan sesuatu dan mengembalikan 0 untuk semua nilai dalam daftar itu

tidak mencetak apa pun dan mengembalikan 1 dalam semua kasus lainnya

izabera
sumber
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);}}
Nefi knomore
sumber
Saya baru dalam hal ini .. mohon maafkan segala pelanggaran.
Nefi knomore
Halo, dan selamat datang di situs ini! Saya telah mengedit posting Anda sehingga bagian kode ditampilkan sebagai kode dan menambahkan hitungan byte, yang merupakan standar untuk jawaban di sini. Kompetisi ini adalah kompetisi kode-golf , yang berarti tujuan utamanya adalah membuat kode Anda sesingkat mungkin. Misalnya, Anda dapat menggunakan nama variabel pendek, dan menentukan fungsi alih-alih kelas penuh. Saya tidak hebat di Jawa, tetapi beberapa tips lagi tersedia sini . Anda harus mencoba membuat kode Anda lebih pendek, dan kemudian mengedit versi baru ke dalam posting Anda.
DJMcMayhem