Richard Dawkins dalam bukunya The Blind Watchmaker , menjelaskan program Weasel . Algoritme dapat dijelaskan sebagai berikut:
Mulailah dengan string acak 28 karakter. Karakter yang valid adalah semua huruf besar, dan spasi.
Buat 100 salinan string itu, dengan peluang 5% per karakter dari karakter itu diganti dengan karakter acak.
Bandingkan setiap string baru dengan target "METHINKS IT IS LIKE A WEASEL", dan berikan skor masing-masing sesuai dengan jumlah huruf dalam string yang benar dan di posisi yang benar.
Jika salah satu string baru memiliki skor sempurna (28), berhentilah.
Pilih string dengan skor tertinggi dari langkah 3. Cara Anda membuat dasi tergantung pada Anda, tetapi hanya satu string yang dapat dipilih. Ambil string yang dipilih dan lanjutkan ke langkah 2.
Pemenang akan menjadi potongan kode terpendek untuk mendapatkan jawaban yang benar saat mencetak string skor tertinggi dari setiap generasi dalam format berikut:
Jika orang dapat membantu dengan memeriksa jawaban orang lain akan sangat membantu!
Jawaban:
APL (143)
Penjelasan:
0{
...}⊃∘(C←27↑⎕A)¨?28/27
: disetelC
ke 27 huruf kapital pertama. Hanya ada 26, jadi elemen ke-27 adalah spasi. Pilih 28 item acak dariC
. Ini akan menjadi yang pertama⍵
.⍺
(Generasi) pertama adalah0
.⍵≢T←'METHINKS IT IS LIKE A WEASEL
: diaturT
ke string'METHINKS IT IS LIKE A WEASEL'
. Selama⍵
tidak sama denganT
:{
...}¨100⍴⊂⍵
: Buat 100 salinan dari⍵
. Untuk masing-masing ...9≠?28/20
: pilih 28 angka acak dari 1 hingga 20. Buat bitmask di mana masing-masing1
berarti bahwa angka acak tidak sama dengan9
. (Ini berarti peluang 5% dari a0
).⍵{⍵:⍺⋄C[?27]}¨
: untuk setiap huruf dalam⍵
, jika bit yang sesuai adalah1
, simpan surat itu, jika tidak gantilah dengan elemen yang dipilih secara acakC
.c←
: menyimpan 100 string yang termutasi dalamc
.G←{+/⍵=T}¨c
: untuk setiap elemen dalamc
, hitung skor (jumlah karakter yang cocokT
) dan simpan skor dalamG
.s←⌈/G
: temukan skor maksimum dan simpan dis
.c←⊃c/⍨G=s
: pilih item pertama daric
yang nilainya sama dengans
(maksimum), dan simpanc
kembali.⎕←(⍕⍺),':'c'-- score:',s
: cetak generasi dalam format yang diberikan (⍺
adalah generasi saat ini,c
adalah string terbaik saat ini,s
adalah skor)c∇⍨1+⍺
: Tambahkan generasi dan jalankan mutasi lagi menggunakan string terbaik saat ini (c
) sebagai input.sumber
Mathematica -
238236225Contoh output
sumber
Python (273)
sumber
K,
173167/
sumber
Python: 282 karakter tanpa titik koma
278 dengan:
sumber
JavaScript,
277246(memerlukan dukungan fungsi panah; lekukan ditambahkan hanya untuk keterbacaan)
Jangan ragu untuk mengubah
alert
keconsole.log
jika Anda ingin pengalaman eksekusi lebih menyenangkan.Ada beberapa potongan golf yang bagus di sini:
Fungsi
c
mengembalikan karakter acak dari string alfabet" ABC..."
. Fungsi mengambil argumen untuk digunakan sebagai batas atas untuk pemilihan indeks acak. Saat membuat string dasar, kami menggunakan27
, jadi fungsi berperilaku normal.Namun, kami menyalahgunakan perilaku ini dengan meminta batas atas acak 540 inci
h = c(540) || h
. Hanya 5% dari waktu yangc
benar - benar akan mengembalikan string (karena 540 * .05 = 27); 95% lainnya waktu, indeks yang dipilih secara acak jatuh melebihi panjang string, sehingga fungsi kembaliundefined
. Nilai falsey ini menyebabkan logis-OR kaskade dic(540) || h
, jadi aslinyamap
nilaih
yang digunakan (yaitu, tidak ada pengganti terjadi).Operasi penjumlahan skor dilakukan
f+=h=="METHINKS IT IS LIKE A WEASEL"[p]
, yang mengatakan "tambahkantrue
kef
jikamap
karakter saat inih
cocok dengan karakterp
th dari string WEASEL". Penambahan angka-plus-boolean memaksa hasil boolean menjadi salah satu0
atau1
, yang berartif
ditambahkan hanya ketika ada kecocokan dengan string WEASEL target.sumber
v
dinyatakan dalam kode? Tidak disebutkan di tempat lain di sana. Anda dapat menghemat 2 karakter.v
adalah argumen ke fungsi panah disimpan dalamc
:c = (v => ...)
. Jika Anda ingin mendefinisikan fungsi panah tanpa argumen, harganya dua karakter()=>...
, daripada satuv=>...
,, jadi lebih baik hanya memiliki argumen yang tidak digunakan.k=s=[28]
dan++
, saya tidak tahu!R (
245239238 karakter)Memberi:
...
sumber
0: ...
jika pertama kali Anda memintacat
Anda bertambahc
1? (+1 tetap sebagai saya mencoba sejak satu jam untuk melakukan sesuatu yang lebih pendek dan saya masih tidak bisa :))ifelse(…,h(f,1),…)
menggantikan semua posisi yang dipilih dengan karakter acak yang sama. Anda dapat menafsirkan aturan dalam arah ini, tetapi rasanya seperti menekuknya, jadi saya setidaknya menyebutkannya. Kedua, Anda menggantis=z
dalam1:100
loop, jadi Anda tidak membuat 100 salinan dari string yang sama, tetapi kadang-kadang salinan salinan. Ini sepertinya melanggar aturan bagiku, bukan hanya menekuknya.C 256
Tiga loop sederhana, inisialisasi, generasi string baru dari orang tua dan skor dihitung dengan pernyataan yang sama. Itu tidak terlalu mudah dibaca bahkan dengan lekukan.
C 252
Satu loop, dengan satu array yang menahan semua 101 string.
Versi kedua ini melanggar aturan karena mencetak string dari (setara dengan) langkah 1, tetapi entah itu mencetak string terakhir atau tidak. Saya bingung bagaimana cara memperbaikinya tanpa meledak dalam ukuran. Saya tetap mempostingnya untuk inspirasi.
C 256
Pendekatan yang berbeda, alih-alih membuat array untuk menahan 101 string hanya membuat ulang string 100 kali dan menggunakan penugasan struct untuk menyalin mudah. Inisialisasi dilakukan dengan memulai penghitung "repeat 100 times" pada -1 dan menanganinya dengan hati-hati dengan penambahan pasca-pemilihan yang dipilih secara strategis. Meskipun pendekatan yang sangat berbeda itu berakhir persis sama dengan upaya pertama - 256 karakter.
sumber
C # - 436
sumber
Lua 5.1 (502)
Versi yang diperkecil:
dan versi yang lebih mudah dibaca (dengan komentar!):
Sejujurnya meskipun ini pasti tidak akan menang, saya senang menemukan dan meminimalkan solusi yang cukup singkat untuk masalah ini! (Penekanan pada wajar): p
sumber
SAS - 374
->
Dengan linebreak / indent / komentar:
sumber
C
361331Tidak sebagus solusi Art, tapi inilah upaya (pemula) saya pada solusi C. 361 karakter jika Anda menghapus baris dan tab baru.
Sunting: Singkirkan nested loop dan gunakan larik 1D. Berharap itu akan membuat perbedaan yang lebih besar, tetapi itu hanya menyelamatkan saya 30 karakter. Ini kodenya:
Sunting: Ini adalah kode asli, tidak disunat, bagi mereka yang tertarik mengetahui bagaimana "bermain golf" dilakukan. Kode tidak menghasilkan peringatan ketika dikompilasi dengan GCC dengan -Dinding dan C99 diaktifkan. Mungkin Anda seorang pemula golf seperti saya, atau seorang pemula C seperti saya, atau mungkin Anda hanya ingin tahu. :) https://gist.github.com/cpx/97edbce4db3cb30c306a
sumber
Scala,
347341337 karakter:=>
sumber
println("%2d: %s -- score: %d".format(i,a,s(a))
bisa berubah menjadiprintln(f"$i%2d: $a%s -- score: ${s(a)}%d")
, menghemat 4 karakter!def c=(' '+:('A'to'Z'))(r(27))
memberi sayaerror: type mismatch; found : Int required: scala.collection.generic.CanBuildFrom[scala.collection.immutable.IndexedSeq[Char],Char,?]
PHP 442
Readbly:
sumber
if\for
, itu di 436. Anda juga bisa memeriksa$n>90
char lainr()
dan Andas()
. Inilah perubahan dengan komentar: ideone.com/4ecZQc%s
selalu sama panjang dan%d
dibiarkan dibenarkan, sehingga Anda dapat menggunakan berikut ini sebagai gantinya:printf("%2d: $s -- score: $l\n",$i);
Jawa (632)
Java adalah bahasa verbose yang seperti itu .. :(
sumber
Python (
330321)Versi yang dapat dibaca:
Contoh output:
sunting: menghapus beberapa karakter berdasarkan jawaban AMK dan Timtech
sumber
sum(1for c in range(28)if n[c]==t[c])
dapat disingkat menjadisum(n[c]==t[c] for c in range(28))
(-3 karakter)import random as r
kefrom random import*
lalu hapus tiga contohr.
S
? Tantangan mengharuskan dimulai dengan serangkaian karakter acak.PHP (
381 397 323 319312):Versi yang dapat dibaca:
Kredit pengoptimalan (319):
Kredit pengoptimalan (312):
sumber
for
untuk$f=N;while($f--){
selama 3 Char masing-masing. dan untuk char lainnya:$n=rand(0,26);[...]chr($n?$n+64:32)
Ruby, 218
contoh lari
sumber
Ruby -
225202203198 karakterRuby tampaknya kurang terwakili dalam tantangan ini sejauh ini jadi saya pikir saya akan mencobanya! Perbaikan disambut baik.
sumber
1
tetapi pertanyaannya menentukan0
. Jika Anda masukg=-1
maka tidak apa-apa. Mungkin ada cara yang lebih pintar tetapi saya melakukannya dengan cara itu. Cheers, sesama RubyGolfer.puts"#{g+=1}: #{$.,s=(0..99).map{n=(r=0..27).map{|i|x=[' ',*?A..?Z].sample;rand<0.05?x:s[i]||=x};[r.count{|i|n[i]=='METHINKS IT IS LIKE A WEASEL'[i]},n*'']}.max;s} -- score: #$."until$.>27
Ruby,
206200199Baris pertama adalah sebuah cara mewah untuk mendefinisikan
q=-2
,i=-1
danR=(0..27).to_a
. Semua pekerjaan dilakukan di baris ke-2:sumber
Japt v2.0a0,
112108 byteCobalah online!
-4 byte terima kasih kepada @ETHproductions.
Dibongkar & Cara kerjanya
sumber
Japt
-R
, 94 bytePendekatan yang berbeda tetapi dengan sedikit inspirasi dari solusi Bubbler .
Uji (atau Coba Online )
Penjelasan
Baris 1
Hasil akan ditugaskan ke variabel
U
.Baris 2
Hasil akan ditugaskan ke variabel
V
.Baris 3
Hasil dari baris ini secara implisit bergabung dengan baris baru dan keluaran.
sumber
Perl 5 , 219 byte
Cobalah online!
sumber
Ruby - 410
Sunting * Saat ini gagal (karena alasan tertentu [ada] sedang diatur ke 0 (type => fixnum)). Namun, desain yang sebenarnya benar, saya hanya perlu menemukan bug yang menyebabkan ini terjadi (ini sangat misterius)
sumber
Python 284
sumber
JavaScript - 312
Sudah ada solusi JS lebih pendek di atas tetapi menggunakan fungsi pointer eksperimental, jadi saya pikir saya akan melempar solusi lain yang berjalan di lingkungan JS apa pun:
sumber
Jawa:
557534Tidak dibungkus:
sumber
PHP
429426421415cetak cantik
Saya akan membutuhkan bahasa yang tidak terlalu banyak bicara lain kali
sumber
Python 2.7 - 319 byte
Tentu itu bukan yang terkecil, tapi menyenangkan untuk diprogram.
Menggunakan fungsi berulang, sehingga dapat mencapai kedalaman rekursi maksimum jika ada semacam devolusi aneh dengan string.
Terima kasih banyak kepada Sp3000 untuk bantuan golfnya.
sumber
Julia, 281 byte
Golf:
Algoritme itu sendiri tidak terlalu pintar, tetapi ada beberapa bit keren di sini. Menggabungkan berbagai karakter dengan karakter lain, kemudian mengindeks ke dalamnya:
['A':'Z',' '][rand(1:27,n)]
dan mengambil jumlah tersebut array boolean (umum, tapi saya masih mencintai ide):sum(a.=="METHINKS IT IS LIKE A WEASEL".data)
. Senang saya di bawah 300!Tidak Disatukan:
sumber