Jangan bingung dengan Kata Sandi Uskup .
Diberikan string, jawab (kebenaran / kepalsuan atau dua nilai yang konsisten) jika itu merupakan kata sandi yang kuat terhadap uskup .
Kata sandi kuat terhadap uskup jika itu adalah string yang terdiri dari huruf bergantian (dalam a-h
) dan digit (dalam 1-8
) sedemikian rupa sehingga setiap pasangan karakter dapat diartikan sebagai kotak pada papan catur, dan jika Anda menempatkan pion putih pada setiap kotak bernama dalam kata sandi, maka tidak ada cara bagi uskup putih untuk melakukan perjalanan, dalam sejumlah gerakan berurutan, dari kotak mana pun di baris pertama ( 1
) ke kotak mana saja di baris terakhir ( 8
).
Contohnya
Kata sandi kuat terhadap para uskup
a1b1c1d1e1f1g1h1
a8b8c8d8e8f8g8h8
a1b2c3d4d5f5f4g3g4h2b5
h4g4f4e4c4b4a4c3e3
a1b1c1d1e1f1g1a8b8c8d8e8f8g8
b4b5d4d5f4f5g3h5
Misalnya,
a1b1c1d1e1f1g1a8b8c8d8e8f8g8
sesuai dengan posisi danb4b5d4d5f4f5g3h5
sesuai dengan posisi
Kata sandi lemah terhadap uskup
a4c4e4g4g5d6f6e3d2b2
(terbentuk dengan baik tetapi tidak kuat - terima kasih Jo King untuk contoh ini!)b1c1d1e1f1g1h1a8b8c8d8e8f8g8
(terbentuk dengan baik tetapi tidak kuat)h4g4f4e4c4b4a4c3
(terbentuk dengan baik tetapi tidak kuat)d4
(terbentuk dengan baik tetapi tidak kuat)b4b5d4d5f4f5g2h5
(terbentuk dengan baik tetapi tidak kuat)correct horse battery staple
(bentuknya buruk)1a1b1c1d1e1f1g8a8b8c8d8e8f8g
(bentuknya buruk)a
(bentuknya buruk)aa
(bentuknya buruk)
sumber
1
melalui8
dalam kasus tes pertama? Itu tidak dapat melakukan perjalanan ke setiap kolom, karenaa
kolom itu sepenuhnya diisi dengan pion, tetapi dapat melakukan perjalanan ke setiap baris tanpa masalah, bukan? Saya merasa saya kehilangan sesuatu ..: SJawaban:
Ruby,
115182163 byteCobalah online!
Pengembalian
1
untuk yang kuat dannil
untuk yang lemah. (The +67 byte adalah untuk memperhitungkan "mundur.")Beberapa trik yang digunakan:
Alih-alih rentang numerik
0..99
, kami menggunakan rentang string'00'..'99'
sehingga angka secara otomatis dibiarkan menjadi 2 digit dan dikelompokkan. Ini membuat di luar batas memeriksa sangat pendek - cocok dengan regex/[09]/
.Di dalam fungsi helper, sambil membangun daftar koordinat baru
[x-11, x-9, x+9, x+11]
, kami secara bersamaan menugaskanz[x]
ke9
dalam proses, yang kebetulan merupakan nilai kebenaran (menandai kotak yang dikunjungi).Di baris terakhir, kami ingin memeriksa bahwa array
z[81,9]
tidak mengandung9
. Kami melakukan ini dengan menghapus semua instance dari9
(z[81,9]-[9]
), lalu meminta elemen ke-9 dari array yang dihasilkan ([8]
). Karena kita tahu array awalnya memiliki 9 elemen, jika ada yang dihapus, kita akan dapatkannil
, sedangkan jika semuanya tetap, kita akan mendapatkan elemen terakhir dari array (yang selalu terjadi1
).sumber
Python 2 ,
330318313309370 byteCobalah online!
Coba versi praktis online!(asli dapat mengambil 4 ^ 32 operasi untuk memeriksa sepenuhnya, saya sarankan menggunakan ini jumlah byte yang sama)
Bukan solusi super pendek - Saya tidak tahu cara membuat versi fungsi lambda dari g lebih pendek dari g itu sendiri.
-4 byte berkat Quuxplusone
+61 byte yang menghitung mundur (terima kasih telah menunjukkan bahwa Jo King dan untuk tips golf)
sumber
q=r=1
akan lebih pendek dariq=1 r=1
, kan? Danif r:
lebih pendek dariif r>0:
.Python 2 ,
490476474Cobalah online!
Ini bekerja dengan "mengisi banjir." Pertama-tama kita membuat daftar
a
kuadrat mana yang berbatasan dengan kuadrat lainnya. Lalu kami membuat satu setx
pengecualian (berdasarkan kata sandi). Kemudian kita menginisialisasi satu setr
kotak yang dapat dijangkau, yang dimulai hanya sebagai baris pertama (minus pengecualian), dan berulang kali "banjir" keluar dari sana, 99 kali, yang seharusnya lebih dari cukup. Akhirnya, kami menguji untuk melihat apakah ada kotak di baris terakhir yang berakhir pada set yang dapat dijangkau. Jika demikian, kami memiliki kata sandi yang lemah! Jika tidak, kami memiliki kata sandi yang kuat.Kerugian, mungkin mendiskualifikasi (saya tidak tahu aturan biasanya di sini): Jika kata sandi tidak terbentuk (seperti "baterai kuda yang benar"), maka kami membuang pengecualian alih-alih kembali
False
. Tapi kami selalu kembaliTrue
jika kata sandinya kuat!Minus 16 byte, terima kasih kepada Jo King. Kami berbaris
a
di satu tempat yang digunakan, dan terus-menerus melipat beberapa matematika.sumber
for
s yang saya tidak bisa melihat cara menghapus. Saya menemukan bahwa menggantirange(99)
denganrepr(f)
karya pada mesin lokal saya tetapi tidak pada penerjemah tio.run ... tapi kemudian saya menemukan[1]*99
itu lebih pendek lagi! Sehingga menghemat 4 byte lagi.for
s yang saya tidak bisa melihat cara menghapus - Oh! Tampaknya Python memperlakukan33for
sebagai dua token (sedangkanfor33
akan menjadi satu token). Hari ini saya belajar. Kurang 2 byte lagi, kalau begitu.Bersih , 285 byte
Cobalah online!
$[]
adalah$ :: [[Int]] [Char] -> Bool
terdiri dengan argumen pertama, memberikan\ [Char] -> Bool
.Fungsi ini bekerja dengan menggunakan string dua karakter sekaligus, segera mengembalikan false jika string dalam format yang tidak valid segera setelah melihat bagian yang tidak valid. Begitu string telah diproses, itu menempatkan seorang uskup di setiap kotak kosong di satu sisi papan dan menggerakkan mereka dengan segala cara yang mungkin 64 kali dan memeriksa apakah ada posisi akhir di baris target.
sumber
True
untuka1b1c1d1e1f1g1
? Bukannya saya mengerti apa-apa tentang cara kerjanya. :)Bahasa Wolfram (Mathematica) ,
339316358353345 byte-23 byte terima kasih kepada @Doorknob.
+42 byte yang menghitung mundur.
Cobalah online!
Saya menulis ulang sebagian besar dari ini untuk menjelaskan kemunduran, saya pikir mungkin ada cara yang lebih mudah untuk mendefinisikan grafik
g
, Mathematica memilikiGraphData[{"bishop",{8,8}}]
grafik semua gerakan yang dapat dilakukan oleh seorang uskup di papan catur ( Grafik Uskup ), tetapi grafik ini mencakup koneksi lebih lanjut dari tetangga diagonal terdekat. Jika ada yang tahu cara yang lebih singkat untuk melakukannya, beri tahu saya. Penghargaan untuk konstruksi grafik diberikan untuk jawaban MathematicaSE ini .Pengembalian
True
untuk kata sandi yang kuat,False
untuk kata sandi yang lemah / buruk. Perhatikan bahwa untuk sebagian besar kata sandi yang tidak dibentuk dengan benar, ia akan menghasilkan banyak pesan kesalahan dan kemudian kembaliFalse
. Jika ini tidak sesuai dengan aturan maka mereka dapat ditekan dengan mengubahf[n_]:=...
kef[n_]:=Quiet@...
biaya 6 byte.Tidak Disatukan:
Kerusakan:
Membawa argumen string dan membaginya menjadi daftar string yang masing-masing panjangnya
m
.Mengembalikan
False
jika ada pesan kesalahan yang dihasilkan, yang merupakan cara kita menangkap string yang terbentuk buruk (yaitu menganggap mereka terbentuk dengan baik, pasti menghasilkan kesalahan di telepon).Mengambil string posisi gadai dan membaginya sedemikian rupa sehingga
"a2h5b"
menjadi{{"a","2"},{"h","5"},{"b"}}
, kemudianLetterNumber
akan mengubah huruf menjadi angka (a -> 1
, dll) danFromDigits
mengubah angka menjadi bilangan bulat. Jika string tidak terbentuk dengan baik, langkah ini akan menghasilkan kesalahan yang akan ditangkap olehCheck
, kembaliFalse
. Kedua angka ini kemudian dikonversi menjadi bilangan bulat yang sesuai dengan kotak di papan tulis.Buat grafik semua tepi diagonal tetangga terdekat dengan posisi pion dihapus.
Ini adalah daftar simpul awal dan akhir yang tidak dihuni masing-masing
Loop atas simpul awal dan akhir, untuk setiap pasangan
FindPath
akan menjadi daftar jalur di antara mereka. Jika tidak ada jalur di antara mereka, itu akan menjadi daftar kosong, jadiLength@
kembali0
. Jika tidak ada jalan sama sekali, makam
akan menjadi nol, dan kami kembaliTrue
, jika tidak kembaliFalse
.sumber
True
danFalse
dapat1>0
dan0>1
masing - masing.p[1]@#&/@
setara dengan adilp@1/@
.Sequence@@
dapat diganti dengan##&@@
. Alih-alih{LetterNumber[#[[1]]],FromDigits[#[[2]]]}&/@
, Anda bisa menggunakan{LetterNumber@#,FromDigits@#2}&@@@
.p@1/@
, tetapi saya melihat ide umum. Saya kirap@1 = StringPartition[#,1]&
, itu agak membingungkan saya, saya kira karenap
mengambil dua argumen dua cara yang berbeda, satum_
dan yang lain seperti#...&
, saya kira ini hanya masalah prioritas. Masuk akal jugap@m = p[m]
.f
yang membutuhkan argumen tunggal,f@#&
memiliki perilaku yang sama dengan adilf
- di sini,f
adalahp[1]
. (Kemudian saya mengubah[]
notasi menjadi@
, yang selalu identik kecuali untuk diutamakan.)