Ada sungai dan ada serigala dan ayam di satu sisi sungai. Mereka memiliki rakit dan mereka semua harus ke sisi lain. Namun, rakit tidak dapat melakukan perjalanan sendiri. Rakit akan tenggelam jika ada lebih dari dua binatang di dalamnya. Tidak ada hewan yang mau basah karena sungai itu dingin dan kotor. Tidak ada hewan yang bisa melompat atau terbang di atas sungai. Juga, jika ada ayam di satu sisi, tidak mungkin ada lebih banyak serigala di sisi itu daripada ada ayam di sisi itu - serigala kemudian akan memutuskan untuk memakan ayam. Ini berarti bahwa Anda tidak dapat membawa dua serigala di rakit ke sisi dengan satu ayam.
Tugas Anda adalah membuat program / fungsi yang mengambil sejumlah serigala dan sejumlah ayam (lebih besar atau sama dengan jumlah serigala) sebagai input dan menemukan berapa kali rakit harus bergerak menyeberangi sungai. Jika tugas tidak memungkinkan, program / fungsi harus menampilkan / mengembalikan string kosong. Kemudian akan mencetak / mengembalikan satu metode tentang bagaimana hal ini dilakukan dengan cara berikut:
W if a wolf crosses the river on its own
C if a chicken crosses the river on its own
CW if a chicken and a wolf cross the river -- WC is also fine
CC if two chickens cross the river
WW if two wolves cross the river
Seperti yang dapat Anda simpulkan, rakit akan secara otomatis bergerak ke arah yang bergantian (kiri dan kanan, mulai dari kiri ke kanan ketika satu atau dua hewan pertama menyeberangi sungai). Ini tidak perlu di-output / dikembalikan. 'W', 'C', 'CW', 'CC' atau 'WW' dalam output dapat dipisahkan oleh setidaknya satu dari yang berikut:
spaces (' ')
commas (',')
newlines
Atau, Anda dapat menyimpan arah sebagai item dalam daftar (daftar kosong berarti tidak ada solusi).
Test case (keluaran dipisahkan dengan koma - input berbentuk wolves,chickens
):
1,1 -> CW
2,2 -> CW,C,CC,C,CW
1,2 -> CW,W,CW
0,10 -> CC,C,CC,C,CC,C,CC,C,CC,C,CC,C,CC,C,CC,C,CC
3,2 -> no solution
Cobalah untuk membuat kode Anda sesingkat mungkin.
sumber
Jawaban:
Perl,
179165164163157156 byteTermasuk +4 untuk
-p
Berikan serigala diikuti oleh ayam di STDIN
Output isi perahu per baris. Untuk contoh ini memberi:
river.pl
:Bekerja seperti yang ditunjukkan, tetapi ganti
\xhh
dan\n
dengan versi literalnya untuk mendapatkan skor yang diklaim.Ini mungkin akan dikalahkan oleh program yang memecahkan kasus umum (C> W> 0)
Tambahkan ke bahwa solusi sepele hanya untuk serigala dan hanya ayam dan kasus khusus hardcod untuk
2 2
dan3 3
(4 4
dan lebih tinggi tidak punya solusi). Tapi itu akan menjadi program yang membosankan.Penjelasan
Keadaan saat bidang disimpan sebagai string tunggal yang terdiri dari:
w
untuk seekor serigala di tepi sungai dengan perahuc
untuk ayam di bank dengan perahu\x88
(sedikit terbalikw
) untuk serigala di bank lain\x9c
(agak terbalikc
) untuk ayam di bank lainP
untuk sisi kanan,\xaf
(sedikit terbalikP
) untuk sisi kiri (sisi awal)\n
WC\nW\nWC\nC\n
(perhatikan hurufW
s danC
ada dalam huruf besar di sini)Array
@F
akan berisi semua status yang dapat dijangkau. Ini diinisialisasi oleh string awalwolves times "w", chickens times "c", \xaf \n
Program kemudian
@F
mengulang yang akan diperpanjang selama perulangan sehingga negara-negara baru juga diproses. Untuk setiap elemen yang dilakukannya:\n
yang mewakili posisi hewan dan perahu saat ini. Jika itu sudah terlihat sebelum lewati$a{$`x/\n/}++
grep(y/c//<y/w//&/c/,$_,~$_)
$\
dan simpan itu sejak solusi pertama ditemukan adalah yang terpendek$\||=$' x/^\w*\n/
c
danw
karakter. (Hewan-hewan di sisi lain tidak akan cocok\w
)/(\w?)(.*)(c|w)(.+)\n(?{code})^/
. Kemudian sedikit membalikkan seluruh tali sebelum\n
kecuali binatang yang dipilih untuk kapalpush@F,$1.$3.~"$`$2$4\xf5"
. Tambahkan hewan-hewan yang dipilih ke gerakan dengan menambahkan mereka:uc"$'$1$3\n"
Proses pemilihan hewan secara efektif mengocok bagian tali yang mewakili mereka dalam banyak cara. Jadi mis
wcwc
danwwcc
keduanya bisa mewakili 2 serigala dan 2 ekor ayam. Pemeriksaan status$a{$`x/\n/}++
akan membedakan dua keadaan ini secara tidak wajar, sehingga lebih banyak keadaan dari yang diperlukan akan dihasilkan dan diperiksa. Oleh karena itu program ini akan kehabisan memori dan waktu segera setelah jumlah hewan yang berbeda semakin besar. Ini diredakan hanya sedikit oleh fakta bahwa versi saat ini akan berhenti menambahkan status baru setelah solusi ditemukansumber
WC,C,WC
ada 2 serigala dan 1 ayam di tepi kanan. Game overJavaScript (ES6),
251264...244240 byteMengambil jumlah serigala dan ayam
(w, c)
dan mengembalikan salah satu solusi optimal, atauundefined
jika tidak ada solusi.Diformat dan dikomentari
Fungsi pembungkus:
Fungsi rekursif utama:
Uji kasus
Tampilkan cuplikan kode
sumber
and finds the smallest number of times the raft has to move across the river.
. jadi saya tidak berpikir ini adalah solusi yang validCJam, 133
Cobalah online
Penjelasan:
Pada dasarnya program ini melakukan BFS dan mengingat setiap keadaan yang dicapai untuk menghindari siklus tak terbatas. Status kerja diwakili seperti [[Wl Cl] [Wr Cr] M1 M2… Mn] di mana W = serigala, C = ayam, l = sisi kiri, r = sisi kanan, M = bergerak sejauh ini (awalnya tidak ada), dan gerakannya seperti "C", "WC" atau "WW" dll (praktis lebih seperti ["" "C"], ["W" "C"], ["WW" ""]], tetapi itu sama saja saat mencetak). Status yang diingat diwakili seperti [[Wl Cl] [Wr Cr] S] di mana S adalah sisi dengan perahu (0 = kiri, 1 = kanan).
sumber
Perl 6 , 268 byte
Menghasilkan rantai yang semakin panjang
(wolf count, chicken count)
negara yang untuk bank kiri, dan mengembalikan yang pertama yang cocok dengan semua aturan.Ternyata pendekatan ini tidak efisien atau terlalu ringkas, tetapi setidaknya itu menyenangkan untuk ditulis.
Saya tidak berpikir saya pernah menumpuk meta-operator
Z
(zip) danX
(cross) sebelumnya, sepertiZZ-
dan diZX*
sini - agak terkejut bahwa ini benar-benar berhasil.(Baris baru ditambahkan untuk tujuan tampilan, dan bukan bagian dari jumlah byte.)
sumber
JavaScript (ES6), 227
237Pada dasarnya ia melakukan BFS dan mengingat setiap negara yang dicapai untuk menghindari siklus tak terbatas.
Tidak seperti @ aditsu, saya tidak berpikir ada ruang untuk bermain golfKurang golf
Uji
sumber