Untuk digit non-nol pada numpad standar
789
456
123
pertimbangkan untuk menempatkan ksatria catur pada angka berapa pun dan menggerakkannya dengan sejumlah lompatan berbentuk L normal, menelusuri bilangan bulat desimal positif. Bilangan bulat positif apa yang dapat diekspresikan sedemikian rupa?
Salah satunya adalah 38
, karena ksatria bisa mulai di 3
dan bergerak ke kiri dan ke atas 8
. 381
dan 383
juga dimungkinkan.
3
itu sendiri dimungkinkan jika tidak ada lompatan yang diambil (yang diizinkan). 5
juga, tetapi tidak ada angka lain yang dapat dicapai dari 5
, jadi itu adalah satu-satunya angka di mana angka itu 5
muncul.
Tulis program atau fungsi yang menggunakan bilangan bulat desimal positif (Anda dapat menganggapnya sebagai string jika diinginkan) dan mencetak atau mengembalikan nilai kebenaran jika angka tersebut dapat diekspresikan oleh seorang ksatria pada numpad dengan cara yang dijelaskan, tetapi sebaliknya menghasilkan sebuah falsy nilai.
Kode terpendek dalam byte menang. Tiebreaker adalah jawaban sebelumnya
Contohnya
Benar:
1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 18, 38, 61, 81, 294, 349, 381, 383, 729, 767, 38183, 38383, 18349276, 183492761, 618349276
Falsy:
10, 11, 50, 53, 55, 65, 95, 100, 180, 182, 184, 185, 186, 187, 188, 189, 209, 305, 2009, 5030, 3838384, 4838383, 183492760
78963214
, diulang berulang kali. Hitung jaraknya - selalu empat, satu arah atau lainnya. Saya seharusnya lebih jelas dan secara eksplisit mengatakan bahwa Anda harus menulisnya dalam urutan lingkaran.123...9
. MaafJawaban:
Jelly,
191514 byteCobalah online! atau verifikasi semua kasus uji .
Bagaimana itu bekerja
sumber
Python 2, 52 byte
Periksa apakah ada dua digit berurutan dalam string
'18349276167294381'
. Untuk mendapatkan digit berturut-turut, alih-alih melakukanzip(`n`,`n`[1:])
, fungsi berulang kali memeriksa dua digit terakhir dan menghapus digit terakhir.sumber
Retina ,
5840 byteTerima kasih kepada Sp3000 untuk menyarankan ide ini:
Cobalah online! (Sedikit dimodifikasi untuk menjalankan seluruh test suite sekaligus.)
Mencetak
1
untuk0
hasil yang benar dan salah.Penjelasan
Temukan semua kecocokan yang tumpang tindih
..
, yaitu semua pasangan digit berurutan, dan bergabunglah dengan umpan garis.Urutkan digit di setiap baris, sehingga kita hanya perlu memeriksa separuh jumlah pasangan.
Hapus semua garis yang sesuai dengan langkah yang valid.
Hitung kecocokan dari regex ini. Yaitu, jika semua baris dihapus, ini cocok dengan string kosong yang dihasilkan sekali, jika tidak gagal untuk mencocokkan dan memberikan nol sebagai gantinya.
sumber
Pyth -
3528 byteTest Suite .
sumber
Ruby, 57 byte
Fungsi anonim. Argumen adalah sebuah string.
Program dengan suite tes:
Saya baru saja mengkodekan semua kemungkinan knight move ke dalam string dan memeriksa apakah setiap 2 digit di dalam input ada di string itu.
sumber
grep 58 byte
Karena sungguh, jika Anda tidak dapat mengalahkan grep ...
sumber
5
atau185
memancarkan1
dengan baris perintah Anda, sementara5
di truthy, dan185
dalam daftar falsy.Haskell 46 byte
Contoh penggunaan:
all(`elem`q"16729438183492761").q $ "183492761"
->True
Cara kerjanya: Menggunakan string pencarian yang ditemukan di jawaban @Kevin Lau .
q
membuat daftar pasangan karakter yang berdekatan dari string, misalnyaq "1672" -> [('1','6'),('6','7'),('7','2')]
. Fungsi mengembalikan true jika semua pasangan dari input muncul di pasangan dari string pencarian.q
mengubah input satu digit ke daftar kosong, jadielem
selalu berhasil.sumber
zip<*>tail
berfungsi seperti versi terbalikzip=<<tail
? Saya pikir saya tidak mengerti apa yang digeneralisasikan oleh pelamar.<*>
didefinisikan sebagai(<*>) f g x = f x (g x)
.JavaScript (ES6),
6562 byteMengembalikan nilai true atau false. Saya sebelumnya telah mencoba solusi rekursif, yang membutuhkan 63 byte, dan
map
dan bahkanreduce
tetapi mereka membawa saya 73 byte.Sunting: Disimpan 3 byte berkat @ user81655.
sumber
match
bekerja, bukan~search
(tapi bagaimanapun, itu benar-benar curang) dan|
dapat menggantikan||
(tetapi tidak dalam versi rekursif, sayangnya.)!i|...match
bekerja karena hasil pertandingan, jika berhasil, adalah array dari string tunggal dua digit, yang|
akhirnya dipaksakan oleh operator menjadi integer yang valid.C,
8581 byteGolf:
Versi non-rekursif lama (85 byte):
Kode lama dengan ruang putih dan program utama:
Ini menerima angka yang dibatasi ruang melalui input standar dan menghasilkan 0 jika tidak-numpad-knight, atau 1 sebaliknya.
Versi rekursif 81-byte baru mencukur 4 byte.
sumber
MATL ,
383729 byteIni menggunakan gagasan @QPaysTaxes .
Outputnya adalah array 2D, kompleks, tidak kosong. Adalah benar jika semua nilainya memiliki bagian nyata yang bukan nol, dan sebaliknya salah.
Cobalah online!
sumber
05AB1E , 29 byte
Kode:
Menggunakan pengodean CP-1252 . Cobalah online! .
sumber
MATL,
25243326 byteDicukur 1 byte berkat @LuisMendo!
@ Dennis menemukan bug, dan kemudian memperbaikinya! Terima kasih!
Mengambil bilangan bulat sebagai input. Output 1/0.
Cobalah online!
sumber
A
pada akhirnya. Vektor MATL adalah benar jika mereka tidak mengandung 0.C,
14092 byteDengan asumsi ASCII
Detail Coba di sini
sumber
{,}[]
dan menyandikannya sebagaichar*
string. Juga, perhatikan bahwa Anda#define
tidak hemat biaya ketika Anda hanya menggunakannya dua kali: menghapusnya akan menghemat 4 byte.\0
di dalam array menyebabkan perilaku yang tidak terdefinisi jadi saya menggantinya denganx
<s>oldscore</s> newscore
saat mengedit untuk mencerminkan peningkatan skor, dan<!-- language-all: lang-c -->
sebelum kode Anda mulai memperbaiki penyorotan sintaksis. Saya juga berhasil mengurangi byte-count saya agak dengan menjatuhkan loop sama sekalin
dalam versi pendek?). Juga, Anda mungkin harus menyebutkan bahwa Anda mengasumsikan pengkodean ASCII - Anda akan mendapatkan nomor yang berbeda pada mesin EBCDIC.Julia,
5149 byteVerifikasi
sumber
Sebenarnya, 30 byte
Mengambil input sebagai string. Menghasilkan bilangan bulat positif untuk true dan 0 untuk false.
Cobalah online!
Penjelasan:
sumber
PowerShell v2 +,
10596 byteIterasi melalui input (yang harus dienkapsulasi dengan
""
) dengan memverifikasi bahwa indeks dari setiap pasangan karakter berurutan ada dalam string pencarian yang valid. Saya melihat Kevin Lau memiliki sesuatu yang serupa , tetapi saya datang dengan ini secara mandiri. Masing-masing indeks ditambahkan dengan+1
, karena.IndexOf()
fungsi akan kembali-1
jika string tidak ditemukan. Ini akan mengubah "tidak ditemukan" menjadi0
.Kami kemudian
-join
semua nilai integer yang dihasilkan dengan*
dan pipa itu keiex
(mirip denganeval
). Ini berarti jika salah satu dari indeks tidak ditemukan, seluruh ekspresi akan menghasilkan0
. Itu dirangkum dalam parens dan-or
akan dengan$a-eq5
untuk kasus khusus input"5"
untuk mencapai hasil keluaran kami.Tes Berjalan
sumber
C, 78 byte
Karena semua orang telah mengambil input sebagai string, saya mencoba melakukannya dalam bilangan bulat. Ia bekerja secara rekursif dari digit paling tidak signifikan (
a%10
); jika itu satu-satunya digit, maka kembalikan benar. Jika tidak, kembalikan benar hanya jika puluhan digit (b%10
) tidak dapat dicapai dari digit satuan, dan (secara rekursif), sisa input memenuhi pengujian yang sama.Tes untuk keterjangkauan bekerja dengan mengkodekan tur knight secara linear, dan mengubah setiap digit ke posisi (nol hingga tujuh) pada tur. Untuk digit
0
dan5
, kami menetapkan posisi sembilan, yang terputus dari posisi lain. Kemudian, angka-angka yang dapat saling dijangkau berbeda satu per satu (mod delapan); yaitua[x%10]-a[b%10]
± 1 atau ± 7. Jadi kami menguji perbedaan absolut (mod 6) terhadap 1.Solusi ini berfungsi untuk pengkodean karakter apa pun yang valid untuk C (yaitu digit memiliki kode yang berdekatan dari 0 hingga 9).
sumber
Java 8,
179167 BytesTempatkan int nomor pad (minus 5 dan 0) dalam lingkaran.
l
memegang indeks lingkaran int ini. Jika perbedaan dua indeks adalah +/- 3 mod 8, maka ada gerakan ksatria antara int yang sesuai dengan indeks tersebut. Perhatikan itux
adalahint[]
.Memperbarui
<2
sebagai ganti==1
sumber