Sebagian besar ponsel pintar Android memungkinkan pengguna untuk menggunakan pola gesek untuk membuka telepon mereka:
Pola tertentu sah, dan yang lain tidak mungkin. Diberikan pola sapuan input, kembalikan yang benar atau salah yang menunjukkan apakah pola input yang diberikan legal atau tidak.
Memasukkan
Kotak diberi label baris-bijaksana 1 hingga 9:
1 2 3
4 5 6
7 8 9
Input adalah angka yang terdiri dari node yang dikunjungi dari awal hingga akhir. Misalnya, pola gesek di atas adalah 12357.
Input dapat berupa angka desimal, string atau daftar angka. Tidak akan berisi 0 karena tidak ada simpul 0.
Amandemen: pengindeksan 0-8 diperbolehkan karena banyak bahasa mengindeks dari 0. Jika Anda menggunakan 0-8, Anda perlu mengindikasikannya di awal jawaban Anda dan sesuaikan kasus uji.
Aturan
Setiap node dimulai sebagai tidak dikunjungi pada awalnya dan hanya dapat dikunjungi sekali. Pola apa pun yang mengunjungi sebuah simpul lebih dari sekali adalah salah.
Pola kebenaran harus mengandung setidaknya satu gesekan, jadi minimal 2 simpul.
Tidak mungkin untuk melewati simpul yang belum dikunjungi secara langsung sejalan dengan yang lain. Misalnya, 13 adalah palsu karena 2 tidak dikunjungi dan langsung sejalan.
Hanya dimungkinkan untuk melewati simpul yang dikunjungi. 42631 adalah contoh dari ini.
Garis bisa melewati sebaliknya. Misalnya, 1524 adalah kebenaran.
Asumsikan lebar simpul tidak signifikan dan mengabaikan masalah praktis (ketebalan jari, dll). Jadi 16 adalah kebenaran meskipun mungkin sedikit lebih sulit untuk dicapai dalam kenyataan.
Uji Kasus
1 -> false
12 -> true
13 -> false
16 -> true
31 -> false
33 -> false
137 -> false
582 -> true
519 -> true
1541 -> false
12357 -> true
15782 -> true
19735 -> false
42631 -> true
157842 -> true
167294385 -> true
297381645 -> false
294381675 -> true
Ini adalah kode-golf , sehingga jumlah byte terkecil yang menang.
sumber
Jawaban:
JavaScript (ES6), 64 byte
Mengambil input sebagai array angka. Nilai palsu adalah 0 atau NaN . Nilai kebenaran adalah bilangan bulat yang benar-benar positif.
Uji kasus
Tampilkan cuplikan kode
Bagaimana?
Pembukaan
Dua digit ditentang secara vertikal, horizontal atau diagonal jika:
ATAU keduanya genap dan jumlahnya 10 (gambar 2)
Selain itu, digit yang berada di antara dua digit yang berlawanan n dan p sama dengan (n + p) / 2 .
Kode sumber yang diformat
Melacak digit sebelumnya
Bendera untuk digit yang dikunjungi disimpan pada indeks negatif dalam larik input a , sehingga tidak bertabrakan dengan elemen aslinya.
Jika p diatur ke -n :
Jika digit saat ini n tidak dipilih sebelumnya,
a[-n] ^= -n
akan mengatur bendera dan membiarkanevery()
loop melanjutkan dengan iterasi berikutnya. Jika tidak, itu akan menghapus bendera dan memaksa loop gagal segera.Jika p diatur ke tidak terdefinisi :
a[undefined] ^= undefined
menghasilkan 0 , yang juga memaksa loop gagal.Mendeteksi digit yang berlawanan
Ekspresi berikut digunakan untuk menguji apakah digit saat ini n dan digit sebelumnya p menentang digit, seperti yang didefinisikan dalam pembukaan:
yang setara dengan:
Catatan: Di JS, hasil modulo memiliki tanda yang sama dengan dividen.
Ini dapat diartikan sebagai:
Oleh karena itu, ungkapan ini mengembalikan 1 jika dan hanya jika n dan -p adalah digit yang berlawanan atau mereka adalah digit ganjil yang sama. Karena digit tidak dapat dipilih dua kali, kasing ini juga sudah ditangani dengan benar.
Jika ungkapan ini mengembalikan 1 , kami menguji [p / 2] (di mana p sekarang sama dengan jumlah digit yang dinegasikan) untuk mengetahui apakah 'digit di antara' sebelumnya dikunjungi. Kalau tidak, kami menguji [0] yang dijamin benar.
Tentang iterasi pertama
Iterasi pertama adalah kasus khusus, karena tidak ada digit sebelumnya dan kami ingin itu berhasil tanpa syarat.
Kami mencapainya dengan menginisialisasi p ke 1 , karena untuk setiap n dalam [1 .. 9] :
(1 * n) % 5
tidak boleh negatif~(1 - n)
tidak bisa sama dengan 9Jawaban asli, 90 byte
Dihapus dari pos ini sehingga tidak terlalu bertele-tele. Anda bisa melihatnya di sini .
sumber
!!a[1]&
dengana[1]&&
, karena setiap nilai truthy dapat dikembalikana[1]*
bahkan lebih pendek.)has a node directly in line
, saya tidak menyadari itu akan sangat sederhana ...?a[-n]^=1:0
dengan&&a[-n]^=1
untuk -1, tidak dapat menguji (di ponsel)x86 kode mesin 32-bit,
6260 byteHexdump:
Ia menerima panjang daftar
ecx
dan penunjuk ke elemen pertamaedx
, dan mengembalikan hasilnya dial
:Ada 8 baris yang berisi simpul di tengah:
Saya mengelompokkan mereka berdasarkan perbedaan antara yang lebih besar dan yang lebih kecil.
Kemudian, saya mengonversinya menjadi tabel pencarian 2-D yang diindeks oleh setengah perbedaan dan angka yang lebih kecil:
Ini membuat bitmap "ajaib" dari 32 bit. Untuk mengindeks, kode mendorongnya ke dalam tumpukan. Kemudian, ia mengekstrak satu byte menggunakan satu indeks, dan dari byte itu, ia mengekstrak satu bit menggunakan indeks lainnya. Semua ini menggunakan satu instruksi:
Jika bitmap menunjukkan bahwa ada simpul di tengah, mudah untuk menghitung - tambahkan setengah perbedaan ke angka yang lebih kecil.
Sumber perakitan:
sumber
bt byte ptr [esp + eax], ebx
.cdq
bukanxor edx, edx
sebagaieax
nol. Juga, Anda dapat melipatdec eax
ke dalambt [esp + eax - 1], ebx
yang sama panjang tapi kemudian memungkinkan Anda untuk menghapusinc ebx
nanti. Ini akan menghemat dua byte.Python 2 ,
14013111410499 byte-2 byte terima kasih kepada Jonathan Frech
-5 byte terima kasih kepada Chas Brown
Cobalah online!
Penjelasan:
Cobalah online!
Hanya 8 pasang node yang memiliki simpul di antaranya. Sepasang node dapat direpresentasikan sebagai integer tunggal oleh rumus
2^a-2^b-1
. Jumlah ini dapat disingkat dengan modulo berulang:(2**n+~2**l)%21%15%9==5
pertama memeriksa apakah pasangan seperti itu ada, kemudianv-{l+n>>1}==v
menguji apakah simpul di antaranya, yang diberikan oleh(a+b)/2
, belum dikunjungi danq
memunculkan NameError. Dengan menggunakan perbandingan berantai antara pasangan-pasangan ini, perbandingan berikutnya hanya dilakukan ketika sebelumnya dikembalikanTrue
.sumber
Jelly ,
24 22 1918 byte-2 karena kita tidak lagi diharuskan untuk menangani daftar kosong
-1 beralih dari bergabung,,
j@
untuk menggabungkan,;
(item yang terlewatkan tidak perlu ditemui di tengah untuk metode yang digunakan, karena pada awal trio baik-baik saja )-2 beralih dari
P¬aSH
keoSH
(OK untuk memiliki dua hasil karena kita meratakan, setengah dari1
adalah0.5
yang disaring pula, dan memiliki beberapa hasil yang sama ada telah mempengaruhi pada metode yang digunakan baik)-1 Terima kasih kepada Mr Xcoder (0-diindeks input diizinkan)
Tautan monadik yang mengambil daftar bilangan bulat di dalam
[0,8]
dan mengembalikan nilai kebenaran (1
) jika sah dan nilai salah (0
) jika tidak.Cobalah online! atau lihat test-suite .
Bagaimana?
Lihat pada setiap pasangan 0-indeks yang berdekatan di dalam daftar input. Jika pembagian bilangan bulat oleh tiga dari dua berbeda dengan 2 mereka berada di baris atas dan bawah, jika modulo oleh tiga dari dua berbeda dengan 2 mereka berada di kolom kiri dan kanan. Jumlah dari pasangan-pasangan tersebut dibagi dua adalah baik simpul tengah terindeks 0 dari garis tiga simpul atau nilai non-integer - jadi nilai-nilai ini pertama kali dimasukkan di depan pasangan terindeks 0 dan kemudian node palsu (suka
0.5
atau3.5
) dihapus, daftar daftar yang dihasilkan diratakan dan kemudian diduplikasi (untuk menghasilkan entri unik yang diawetkan pesanan) dan akhirnya dibandingkan dengan input - untuk sapuan hukum semua ini akan berakhir menjadi larangan saat ilegal yang akan menambahkan mid-node yang hilang dan / atau menghapus duplikat node (perhatikan bahwa tidak ada casing khusus yang diperlukan untuk daftar input panjang 1 karena tidak memiliki pasangan yang berdekatan):Metode sebelumnya
Jelly ,
3635 byteCobalah online! atau lihat test-suite .
Bagaimana?
Mirip dengan di atas tetapi membangun semua kemungkinan tiga-node-line dan melakukan pencarian (daripada memeriksa saat menggunakan divmod untuk menguji dan mengurangi separuh jumlah untuk mid-node).
Pertama pembangunan daftar tiga-simpul-baris:
Sekarang pengambilan keputusan:
sumber
Stax , 28 byte
Menjalankannya
Ini menghasilkan 0 untuk false, dan bilangan bulat positif untuk true. Representasi ascii yang sesuai dari program yang sama adalah ini.
Gagasan umum adalah menghitung beberapa kondisi yang diperlukan untuk pola gesek legal dan melipatgandakan semuanya.
sumber
Y
register yang cerdas.v
dan memasukkannya1
sebagai nilai palsu.2
dan di atas adalah kebenaran.JavaScript, 112 byte
Mungkin beberapa bahasa berbasis regex harus lebih pendek. Tapi saya tidak tahu.
Tampilkan cuplikan kode
Berkat Neil, ubah
)(?!
untuk|
menyimpan 3 byte.sumber
144
.Retina 0.8.2 , 98 byte
Dipengaruhi oleh jawaban tsh . Saya mencoba untuk "ulangi" itu menjadi kebalikannya, cocok dengan gesekan yang tidak valid, kemudian Anti-grepping.
Cobalah online
sumber
Sekam ,
2520 byteMengambil daftar bilangan bulat dengan pengindeksan berbasis 0. Menghasilkan 0 atau 1. Cobalah secara online!
Penjelasan
Saya mencuri beberapa ide dari jawaban Jelly Jonathan Allan . Idenya sama: masukkan "simpul rata-rata" yang baru di antara setiap pasangan yang berdekatan, filter yang bukan simpul yang sebenarnya, hapus duplikat dan bandingkan dengan daftar asli. Jika daftar asli berisi duplikat, hasilnya palsu. Jika daftar melewatkan simpul yang belum dikunjungi, maka ada dalam daftar yang diproses di antara pasangan yang sesuai, dan hasilnya adalah palsu. Jika input adalah singleton, daftar yang diproses kosong, dan hasilnya palsu. Kalau tidak, itu adalah kebenaran.
sumber
C ++,
267256 byteUntuk memeriksa apakah polanya tidak melewati simpul yang belum dikunjungi, ia melakukan beberapa hal:
d
manad
perbedaan numerik antara node saat ini dan node terakhir.d
ganjil, maka tidak perlu memeriksa, itu tidak dapat melewati node.d
sama dengan4
atau8
, maka lompatan adalah antara node1-9
atau3-7
, jadi periksa node5
d
2, dan simpul tengah ((last_node + current_node)/2
) adalah 2,5 atau 8, maka periksa simpul tengahd
6, periksa sama seperti sebelumnya tetapi dengan4
,5
atau6
Parameternya adalah
int[]
dan elemennya dihitung. Ini mengembalikanint
yang dapat diartikan sebagaibool
tipesumber
!(d%2)
=>d%2<1
harus bekerja.int s[]
=>int*s
. Saya pikir itu akan berhasil.Perl, 135 byte (134 +
-n
)Versi sedikit ungolfed
Keluaran melalui kode keluar.
0
adalah kebenaran, nilai lainnya salah. Sesuai konsensus meta , output STDERR dalam kasus kegagalan diabaikan.Mungkin ada cara yang lebih cepat untuk memeriksa aturan "tidak dapat melompati" daripada sekadar mendaftar semua kemungkinan.
sumber
MATL ,
424139 byteIni menghasilkan
Di sini Anda dapat membaca mengapa output ini masing-masing benar dan salah. Cobalah online!
Atau verifikasi semua kasus uji , dengan kode footer yang mencakup tes standar untuk kebenaran / kepalsuan.
sumber
Stax ,
73726665 byte CP43779 byte saat dibongkar,
Jalankan dan debug online!
atau menjalankan uji batch , di mana
meX
adalah header sehingga Stax dapat memproses input multiline.Implementasi tanpa menggunakan hash.Outputs nomor ketat positif (sebenarnya jumlah tes gagal) untuk falsy kasus dan
0
untuk truthy yang.Penjelasan
d
membersihkan tumpukan input. Inputnya dalam variabelx
.4{cAs-5F
menghasilkan bagian pertama dari daftar simpul tengah.132396978714EE
hardcode bagian kedua dari daftar simpul tengah.L3/
Mengumpulkan semua elemen dalam tumpukan utama dan membaginya menjadi beberapa bagian yang masing-masing berisi 3 elemen, hasilnya adalah arraya
, yang merupakan array dari semua grup 3-simpul yang tidak valid.{xs:IBc0<A*++cEd:-1=sccHs|M=s{U>m|A**mE
Untuk setiap daftar simpul yang tidak valid, lakukan pemeriksaan berikut. Hasil dari hasil pemeriksaanand
ed menggunakan**
. Karena ada 8 daftar simpul yang tidak valid, hasil dari kode ini adalah array dari 8 elemen. FinalE
mengirimkan array ke elemen individualnya di stack utama.xs:I
dapatkan indeks elemen daftar simpul dalam array input.Bc0<A*++
Jika indeks "simpul tengah" (misalnya5
dalam set simpul1,5,9
) adalah-1
(yang berarti tidak ada dalam array input), ubah indeks ke9
.cEd:-1=
uji apakah dua "terminal node" (misalnya1,5
dalam set simpul1,5,9
) berdekatan dalam array input.sccHs|M=
menguji apakah indeks yang diubah dari "simpul tengah" lebih besar daripada dua "simpul terminal", yang mencakup dua kasus: "simpul tengah" tidak ada, atau "simpul tengah" muncul setelah dua "simpul terminal"s{U>m|A
menguji apakah kedua indeks dari "end node" tidak negatif. (Yaitu mereka berdua muncul di input).Dua tes tambahan dilakukan,
x%2<
menguji apakah array input adalah singleton.xu%x%=!
menguji apakah ada simpul yang telah dikunjungi dua kali.Ada 10 hasil tes pada tumpukan utama (satu untuk setiap daftar simpul yang tidak valid, ditambah dua tes tambahan).
L|+
mengumpulkan 10 elemen dan menambahkannya.|a
bisa juga digunakan yang hanya memeriksa apakah ada elemen yang benar pada array.Output tersirat.
sumber
Java,
375355 byte-20 byte terima kasih kepada Zacharý
Ini adalah port dari jawaban ini dan bekerja pada prinsip yang sama
sumber
int v(int s[]){int[]m=new int[10];int i=1,p=s[0],d,n,l=s.length;if(l<2)return 0;for(;i<l;++i){m[p]=1;if(m[s[i]]!=0)return 0;d=(d=p-s[i])<0?-d:d;if(d%2==0){n=(p+s[i])/2;if((d==4||d==8)&&n==5&&m[5]==0)return 0;if((d==2)&&(n==2&&m[2]==0||n==5&&m[5]==0||n==8&&m[8]==0))return 0;if(d==6&&(n==4&&m[4]==0||n==5&&m[5]==0||n==6&&m[6]==0))return 0;}p=s[i];}return 1;}
harus bekerja (urutan operasi)(d==2)
menjadi adild==2
, saya mengabaikan itu sebelumnya.d%2==0
=>d%2<1
Pyth , 33 byte
Suite uji.
Menggunakan pengindeksan berbasis 0.
Penjelasan
Pendekatan alternatif untuk 34 byte :
sumber
Japt , 35 byte
Cobalah online!
Sedikit tidak berbulu & Cara kerjanya
Mengaitkan ide dari solusi Jelly ini , dengan beberapa perbedaan dalam menentukan potensi lompatan:
/3
atau%3
.%3
dan memeriksa apakah perbedaannya adalah 0 atau 2. Jika perbedaannya adalah 0, kedua sel tersebut selaras secara vertikal, dan non-lompatan masih memiliki properti(X+Y)%2 != 0
.sumber
Python 2 , 97 byte
Berdasarkan jawaban Ovs tetapi 2 byte lebih pendek dan lebih samar. Konversi indeks menjadi koordinat 2d dan uji paritas. Asumsikan indeks 0-8.
Cobalah online!
sumber