Anda mungkin telah melihat yang satu ini di Die Hard: With a Vengeance ... Pertanyaan ini didasarkan pada Puzzle Kendi 3 dan 5 Liter yang terkenal, tetapi dengan kemiringan yang sedikit berbeda.
Golf beberapa kode yang ketika diberi bilangan bulat antara 1 dan 100 akan memberi Anda instruksi tercepat untuk mengukur ke dalam tangki, jumlah liter air yang sesuai dari air mancur, menggunakan kendi 3 liter dan kendi 5 liter.
Tidak ada gradasi pada salah satu kendi; air mancur berlimpah dalam pasokan air, dan tangki diasumsikan dikosongkan pada awal setiap pelaksanaan kode.
Anda tidak dapat mengakses air dari tangki setelah masuk ke dalam tangki.
Format eksekusi adalah sebagai berikut:
Memasukkan:
4
sebagai contoh.
Keluaran
Keluarkan setiap langkah bernomor, seperti yang ditunjukkan, diikuti oleh penghitungan volume tabung 5L, tabung 3L dan tangki. Format penghitungan juga ditunjukkan di bawah ini. Jumlah langkah juga harus ditampilkan di akhir langkah.
1) Fill 5L jug
5L: 5, 3L: 0, T: 0
2) Pour from 5L jug into 3L jug
5L: 2, 3L: 3, T: 0
3) Empty 3L jug
5L: 2, 3L: 0, T: 0
4) Pour from 5L jug into 3L jug
5L: 0, 3L: 2, T: 0
5) Fill 5L jug
5L: 5, 3L: 2, T: 0
6) Pour from 5L jug into 3L jug
5L: 4, 3L: 3, T: 0
7) Pour from 5L jug into tank
5L: 0, 3L: 3, T: 4
Volume measured out in 7 turns
Contoh 2
Memasukkan: 8
Keluaran:
1) Fill 5L jug
5L: 5, 3L: 0, T: 0
2) Pour from 5L jug into tank
5L: 0, 3L: 0, T: 5
3) Fill 3L jug
5L: 0, 3L: 3, T: 5
4) Pour from 3L jug into tank
5L: 0, 3L: 0, T: 8
Volume measured out in 4 turns
Konvensi
Fill xL jug
- Mengisi kendi terkait ke atas dari air mancurEmpty xL jug
- mengosongkan isi kendi terkait ke dalam air mancurPour from xL jug into yL jug
- Tuang isi dari kendi xL ke dalam kendi yLPour from xL jug into tank
- Tuang isi tabung xL ke dalam tangki
Kode terpendek menang.
sumber
Jawaban:
Rubi,
407376365331324323Ini agak sulit dibaca ...
Mengambil input pada STDIN. Contoh run untuk N = 10:
sumber
T-SQL 2012:
14101302Upaya quixotic lain pada pertanyaan dalam SQL, tetapi yang ini menawarkan kesempatan yang menyenangkan untuk bermain dengan beberapa opsi fungsi jendela baru di versi 2012. Selain itu, ia mengeksploitasi CTE rekursif, yang mungkin tidak mengesankan di sebagian besar bahasa pemrograman, tetapi rekursi dalam SQL seperti beralih dari kuda dan kereta ke Ferrari.
Mesin di jantung ini ada di jalur 5-12, yang menggunakan CTE rekursif dan fungsi jendela untuk membangun tabel sebagian besar angka yang diperlukan untuk menyelesaikan masalah. Perhatikan secara khusus tes untuk 3, 4, 6, atau 9, yang memastikan pendekatan optimal untuk solusi dengan 3s dari angka-angka tersebut dan seterusnya. (Secara teknis, ini adalah ikatan untuk 4 antara pendekatan 3-1 dan 2-2, tetapi melakukannya dengan cara ini membuat saya banyak karakter.) Maka itu masalah sederhana untuk bergabung dengan tabel pencarian dari langkah-langkah optimal untuk berbagai potongan masalah dan gunakan fungsi jendela lain untuk memberi nomor langkah dengan benar.
Jika Anda tidak memiliki MS SQL di sekitar, mainkan di SQLFiddle.
Hasil untuk input 42:
Edit:
Golf peningkatan skor yang layak oleh
sumber
Javascript: 481
Upaya pertama dalam bermain golf, saran sangat dihargai
Ini kacau dengan beberapa angka karena tidak memeriksa apakah lebih baik untuk menuangkan 3 atau 5, contoh: 9 memberi 9 belokan, bukan 6, saya mungkin memperbaikinya nanti
Rekatkan di konsol
Dari 553 hingga 481 terima kasih kepada @WallyWest
sumber
n=["3L jug","5L jug","tank"];l=[0,0,0];t=[3,5,0];h=0;c=console;function e(d){l[d]=t[d];c.log(++h+") Fill "+n[d]);k()}function m(d,g){s=l[d];f=l[g];b=s+f>t[g];l[g]=b?t[g]:f+s;l[d]=b?s-(t[g]-f):0;c.log(++h+") Pour from "+n[d]+" into "+n[g]);k()}function k(){c.log("5L: "+l[1]+", 3L: "+l[0]+", T: "+l[2])}a=prompt();for(t[2]=a;4<a;)e(1),m(1,2),a-=5;2<a&&(e(0),m(0,2),a-=3);1<a&&(e(1),m(1,0),m(1,2),a=0);0<a&&(e(0),m(0,1),e(0),m(0,1),m(0,2));c.log("Volume measured out in "+h+" turns")
untuk 481 karakter ...if
sJawa, 610
Saya mengambil solusi dari Sumedh dan memutarnya. Saya ingin memasukkannya ke dalam komentar tetapi reputasi saya tidak cukup :(. Ini adalah 40% lebih sedikit, saya pikir itu setidaknya harus dibagikan. Namun masih jauh dari pertama ...
Berikut adalah ungolfed:
NB: ini hanya berfungsi pada jalankan pertama. Jalankan kembali dan hasilnya akan salah (karena variabel global).
Versi berikut ini aman, tetapi kami kehilangan 2 karakter, mulai dari 610 hingga 612:
Output sampel untuk N = 69:
sumber
Jawa: 984
Ini kodenya
Input dari baris perintah. misalnya: java X 4
sumber
main(String[]s)
,int n=Integer.parseInt(s[0]),t=0,c=0;
,java.io.PrintStream q=System.out;
. Juga, dimungkinkan untuk menulis yang pertamawhile
sebagai satu atau dua karakter lebih pendekfor
. Selanjutnya, AndaString
berulang, Anda dapat mencoba menyimpan bagian berulang dalam variabel atau membuat fungsi yang membuatnya hanya menggunakan satu cetakanString
.Python 2.7 - 437
Bukan kode terpendek, tapi saya pikir ini adalah cara paling optimal untuk menyelesaikan ini.
Seperti yang saya nyatakan dalam komentar, cara paling optimal untuk menghitung ini:
divmod(amount,5)
. Ini akan memberi Anda salah satu dari 4,3,2,1 sebagai sisanya.Yang tersisa 1 atau 2 sebagai sisanya. Gunakan solusi optimal untuk keduanya yang dapat diketahui sebelumnya sebagai:
Kode:
Dan output untuk 4L dalam 7 langkah:
sumber
Smalltalk (Smalltalk / X),
568 560516masukan dalam n:
anak laki-laki ini jelas merupakan program yang paling dikaburkan yang pernah saya tulis ...
Sunting: Beberapa Smalltalks lainnya mungkin tidak mengizinkan variabel ruang kerja yang diautodikasi otomatis dan Anda harus menambahkan pernyataan. Juga bindWith: mungkin berbeda (expandWith: '<p>').
contoh output untuk n = 17:
sumber
C,
567609versi tidak valid sebelumnya:
dan di sini adalah kode degolfed:
sumber
C (
480465 byte)Versi optimal (menambahkan 10 byte)
Sepertinya lebih banyak bermain golf di sini - fungsi output membunuh saya. Ini harus memberikan solusi optimal (jumlah langkah paling sedikit). Mirip dengan kode lain di sini, ia mengisi dan mengosongkan kendi 5L sampai mencapai di bawah 5 dan kemudian beralih ke kendi 3L. Ini menguji 2 kasus khusus (6 dan 9) dan jika menemukan mereka beralih ke kendi 3L. Petunjuk untuk mendapatkan 1L dan 2L dikodekan dengan keras.
Versi yang lebih mudah dibaca:
Suntingan:
Uji output untuk n = 11 (versi optimal):
sumber
T-SQL (2012):
794689580Terinspirasi oleh jawaban T-SQL @ Jonathan-Van-Matre yang dikombinasikan dengan algoritma @ Lego-Stormtroopr . Saya ingin melakukan ini karena saya sangat menikmati tantangan 99 Botol Bir .
Saya mencoba untuk menjaga
OVER
fungsi window ( ) minimal dalam preferensi fungsi matematika / bool.SQLFiddle ada di sini .
Memasukkan:
11
Dapat dibaca oleh manusia:
sumber
input = 8
input = 11
Python 3 (417 karakter)
Dijelaskan
Perhatikan bahwa kita memiliki 4 objek, yaitu, kendi 3L, kendi 5L, tangki, dan foutain. Satu-satunya operasi yang dapat kita lakukan adalah memindahkan air dari satu objek
a
ke objek lainnyab
. Inilah fungsinyao(a, b)
dilakukan dalam kode saya, memindahkan air dan mencetaknya dan terus menghitung.Trik
N=['3L jug','5L jug','tank',0]
. Di sini saya perlu elemen terakhir untuk menghindariIndexError
. Selain itu, dapat digunakan sebagai variabel penghitungan global, tanpaglobal
kata kunci ekspansif . Sebagai contoh,N[3] += 1
Karena
0 <= a < 4, 0 <= b < 4
dalam fungsio(a, b)
, kita dapat menyandikan(a, b)
ke dalam hex digit menggunakan(a << 2) | b
, dan mendekode menggunakandivmod(x, 4)
. Dengan trik ini, semua 5 solusi (reminder=0, 1, 2, 3, 4
), dapat dikodekan ke dalam array['','c1c12','d46','c2','d434d46']
, yang sedikit lebih pendek dari bentuk aslinya:A=[ (), ((3,0),(0,1),(3,0),(0,1),(0,2)), ((3,1),(1,0),(1,2)), ((3,0),(0,2)), ((3,1),(1,0),(0,3),(1,0),(3,1),(1,0),(1,2)) ]
Output Sampel (n = 17)
sumber
COBOL (IBM Enterprise COBOL) 192 baris dengan 72 karakter
Ini adalah Bukti Konsep untuk Pertanyaan, dan awal dari satu untuk Golf-COBOL :-)
Pertanyaannya menanyakan yang tercepat. Jadi, terapkan paralelisme. Bahkan satu orang dapat dengan mudah mengisi satu kendi 3L dan satu kendi 5L secara bersamaan.
Cukup bagi input dengan delapan, juga sisakan sisanya. Lakukan pengisian cepat 5L / 3L dengan jumlah delapan kali pas, kemudian tangani yang tersisa satu hingga tujuh liter.
Sisanya yang paling menarik adalah empat liter. Melakukannya sebagai satu liter ditambah tiga liter mendorong lebih sedikit air di sekitar, hanya 18 liter vs 23 untuk kemungkinan lain.
Kode (bekerja)
Ini mendapatkan banyak sekali pesan diagnostik untuk kode yang dimulai di tempat yang salah dan kekurangan perhentian penuh yang diperlukan.
Tidak satu pun dari diagnostik menunjukkan dampak pada kode objek. Jadi, meskipun sudah rusak RC = 8 saya tahu objeknya akan baik-baik saja, jadi tautkan dan jalankan.
Berikut adalah output untuk satu hingga delapan liter. Setelah itu, semua hasil dapat intuisi. 17 dan 100 dimasukkan sebagai contoh paralelisme.
Masih banyak yang bisa dilakukan untuk memeras program dalam karakter, output yang benar adalah yang terpenting terlebih dahulu. Menghitung karakter ketika mereka berada di garis panjang tetap adalah hal yang sama sekali berbeda.
Output sampel:
sumber