Anda harus membuat lapangan golf 18-lubang secara acak.
Contoh output:
[3 4 3 5 5 4 4 4 5 3 3 4 4 3 4 5 5 4]
Aturan:
- Program Anda harus menampilkan daftar panjang lubang dengan tepat 18 lubang
- Setiap lubang harus memiliki panjang 3, 4 atau 5
- Panjang lubang harus ditambah hingga 72 untuk seluruh kursus
- Program Anda harus dapat menghasilkan setiap kemungkinan konfigurasi lubang dengan beberapa probabilitas non-nol (probabilitas masing-masing konfigurasi tidak harus sama, tetapi jangan ragu untuk mengklaim pujian tambahan jika ini masalahnya)
4
, dan satu-satunya kemungkinan adalah3
,4
, atau5
, solusi yang mungkin kelas yang {no 3's or 5's
,one 3 and one 5
,two 3's and two 5's
, ...,nine 3's and nine 5's
}. Ini dapat dihitung dengannCr(18,0)*nCr(18,0) + nCr(18,1)*nCr(17,1) + nCr(18,2)*nCr(16,2) + ... + nCr(18,9)*nCr(9,9) = 44,152,809
. Ini berarti kira11.4%
- kira semua kemungkinan kombinasi adalah solusi yang valid(44,152,809 / 3^18)
.sum(factorial(18)/factorial(x)/factorial(y)/factorial(z) for x in range(25) for y in range(25) for z in range(25) if 3*x+4*y+5*z == 72 and x+y+z == 18)
memberikan44152809L
Jawaban:
k (
18 1716 karakter)Kembali ke pendekatan awal, beri kredit ke CS untuk peningkatan.
Pendekatan lain (17 karakter), metode yang sama dengan solusi J, H / T ke CS
Versi lama:Tidak rentan terhadap stack-overflow dan beroperasi dalam jumlah ruang yang tetap.
sumber
K, 28
sumber
J,
201817 karakterIni bekerja dengan cara yang sama seperti jawaban sebelumnya kecuali bahwa 9 angka acak adalah 0 atau 1 dan dinegasikan sebelum ditambahkan. Ini berarti ada
-1
s sebanyak ada1
s. Menambahkan 4 memberi saya daftar3
s,4
s dan5
s yang menambahkan hingga 72 setiap kali.Jawaban sebelumnya:
Hasilkan 9 lubang pertama secara acak
?9#3
, kemudian salin dan balikkan(,2-])
(mengubah 3 menjadi 5 dan 5 menjadi 3) untuk menghasilkan 9. final. Ini menjamin bahwa total akan menjadi 72 (karena setiap 3 akan memiliki pencocokan 5 yang total rata-rata per lubang adalah 4 dan 4x18 = 72). Itu kemudian secara acak mengocok hasilnya({~?~@#)
untuk memastikan bahwa setiap kombinasi adalah mungkin.sumber
Kode mesin x86 16-bit di bawah MS-DOS - 45 byte
Hexdump:
Biner kode Base64:
Kode sumber aktual dengan beberapa komentar:
Kompilasi dengan
nasm 18h.asm -o 18h.com
dan jalankan di bawah MS-DOS (atau Dosbox), atau NTVDM dari versi Windows 32-bit.Output sampel:
sumber
Mathematica
71 68 6660Dengan 6 karakter disimpan oleh saran Tally.
Semua hasil yang mungkin adalah mungkin, tetapi mereka tidak memiliki kemungkinan yang sama.
Analisis
menghasilkan semua 10 partisi yang mungkin (kombinasi, bukan permutasi) dari 72 menjadi 18 elemen yang terdiri dari 3, 4 dan 5.
RandomChoice
memilih salah satu dari itu.RandomSample
mengembalikan permutasi dari pilihan itu.sumber
R - 41
Algoritma ini mirip dengan @ sgrieve.
sumber
GolfScript (26 karakter)
Ada beberapa kesamaan yang jelas dengan solusi Ilmari, tetapi juga beberapa perbedaan yang jelas. Secara khusus, saya mengeksploitasi fakta bahwa par rata-rata adalah 4.
sumber
{;0{3.rand+.@+}18*])72-}do
diri saya sendiri, tetapi tidak tahu bagaimana cara membuatnya lebih pendek dari sana. +1.Python 77
Kode
Keluaran
Impor benar-benar membunuh solusi ini. Menggunakan numpy untuk menghasilkan 18 angka antara 3 dan 5 dan terus menghasilkan daftar sampai jumlah daftar sama dengan 72.
sumber
GolfScript, 27 karakter
Menggunakan metode sampel penolakan yang sama dengan solusi Python sgrieve. Jadi, setiap output yang valid sebenarnya memiliki kemungkinan yang sama.
sumber
Q (25 karakter)
Asli (27)
Output sampel
Sedikit lebih pendek (25)
sumber
JavaScript,
666461 karakterSangat terinspirasi oleh TwoScoopsofPig (PHP) dan Joe Tuskan (JS).
sumber
s!=72
bisas-72
dengan menyimpan satu char. Dan semi-colon terakhir;a
tidak diperlukan untuk char lain.for(i=x;i;i--)
sebelumnya menyimpan 2 karakter darifor(i=0;i<x;i++)
, terima kasih man!Python 2, 70 byte
sunting:Inilah yang lain, mirip dengan solusi sgrieve:
Python 2, 73 byte + probabilitas yang sama
sumber
JavaScript,
1169965 bytefor(i=0,h=[];i<18;)h[i++]=5;while(h.reduce(function(a,b){return a+b})!=72){i=Math.random()*18|0;h[i]=[3,4,4][i%3]}h;
h=[0];while(h.reduce(function(a,b){return a+b})-72)for(i=0;i<18;h[i++]=[3,4,5][Math.random()*3|0])h
sumber
i is not defined
.Python,
128120116 karakterimport
pernyataan masih panjang pembunuh (hanya 23 karakter untuk mengimpor 2 fungsi di namespace)saya harap Anda tidak memerlukan hasilnya dalam waktu dekat, karena kode ini pertama mengevaluasi semua solusi yang mungkin sebelum memilih satu secara acak. mungkin solusi paling lambat untuk masalah ini.
saya mengklaim pujian ekstra untuk probabilitas yang sama dari setiap konfigurasi ...
sumber
import random,itertools
import random as r,itertools as i
lalu gunakanr
dani
bukannyarandom
danitertools
. Gunakan18*[0]
sebagai gantirange(18)
, dan[3,4,5,6]
bukannyarange(3,6)
:)choice()
fungsi. itu juga yang membuat kode ini sangat lambat ...PHP - 77 Karakter
Sama seperti solusi sgrieve, ini membangun daftar 18 lubang, memeriksa par total, dan mencetaknya atau menolaknya dan mencoba lagi. Anehnya, kedua solusi kami memiliki panjang yang sama.
Agak menjengkelkan, PHP tidak menawarkan fungsi array dengan singkatnya nama. Array_sum dan print_r membunuhku. Saran diterima.
sumber
+=
.<?while($s!=72)for($s=$i=0;18>$i;$s+=$a[++$i]=rand(3,5));print_r($a);
while(array_sum($a)!=72)for($i=0;18>$i;)$a[++$i]=rand(3,5);
{}
(karena sintaks PHP secara eksplisit mengizinkannya).Ruby 1.9 (62 karakter)
Rails (55 karakter)
Dalam
$ rails c
REPL (dalam folder Rails apa pun):Catatan: Ia bekerja dengan Ruby 1.8 jika Anda menggunakan
shuffle[0]
bukansample
.sumber
(1..18).map{rand(3)+3}
untuk mendapatkan array acak;)Lisp (
7869 karakter)(do ((c () (mapcar (lambda (x) (+ 3 (random 3))) (daftar make 18))))) ((= (terapkan '+ c) 72) c))Ini agak mirip dengan solusi Python sgrieve.
Mulai dengan c sebagai NIL, periksa jumlah 72, the
do
"fungsi kenaikan" untuk c menghasilkan daftar 18 angka antara 3 dan 5, periksa 72 lagi, busa, bilas, ulangi.Sangat menyegarkan untuk melihat
do
danloop
bermain golf bersama dengan baik.sumber
C (123 chars) - upaya efisiensi
Pipa melalui wc dan itu akan menghasilkan semua solusi 44152809 dalam 10 detik ...
Oh, well - tidak membaca pertanyaan dengan benar - tetapi mengingat kita menghasilkan semua solusi kemudian memilih yang acak dengan probabilitas yang sama adalah latihan scripting: P
sumber
Clojure - 55
Trik yang cukup menyenangkan .... mengeksploitasi struktur matematika dari masalah yang harus ada persis 3 lubang par 5 lubang par.
sumber
Python 83
Seperti solusi sgrieve, tetapi tanpa numpy
Solusi Golfing Adrien Plisson: 120-> 108 karakter
MATLAB 53
Keluaran :
sumber
randi([3,5],1,18)
alih-alih3+floor(rand(1,18)*3)
Jawa (61 karakter)
Output sampel:
sumber
C (94 karakter)
Itu
s=0
on line 1 mungkin tidak diperlukan, karena apa yang kemungkinan int diinisiasi akan sama 72? Saya hanya tidak suka membaca nilai yang tidak diinisialisasi dalam lurus C. Juga, ini mungkin memerlukan seedingrand()
fungsi.keluaran
sumber
Script Bash shell (65 karakter)
( Shuf berasal dari paket GNU coreutils. Juga, terima kasih Gareth.)
sumber
C # (143 non-spasi putih):
sumber
new Guid()
membuat GUID kosong. Untuk benar-benar menghasilkan GUID unik, Anda perlu memanggil metode statisGuid.NewGuid
.Math.Random
, tidakSystem.Random
.var r=new Random();for(;;){var e=Enumerable.Range(1,18).Select(i=>r.Next(3,6)).ToList();if(e.Sum()==72){e.ForEach(i=>Console.Write(i));break;}}
Haskell,
10410298 karakter.sumber
[1..n]>>[r]
sedikit lebih pendek darireplicate n$r
.sequence
menjadimapM
.Perl, 74
Solusi alternatif:
sumber
TXR (99 karakter)
Ungkapan ini menghasilkan daftar malas acak dari angka acak dari 3 hingga 5:
Sisa logikanya adalah loop sederhana yang memeriksa apakah 18 elemen pertama dari daftar ini berjumlah hingga 72. Jika tidak, ia akan memunculkan elemen dan mencoba lagi. The
for
Loop berisi sebuah blok implisit disebutnil
dan sebagainya(return ...)
dapat digunakan untuk mengakhiri loop dan kembali nilai.Perhatikan bahwa panjang 99 karakter termasuk baris baru yang berhenti, yang diperlukan.
sumber
APL 12
Perhatikan bahwa saya memiliki indeks asal diatur ke 0, artinya array mulai dari 0. Anda dapat mengatur ini dengan
⎕IO←0
.sumber
R, 42 byte
sample
, secara default, menarik secara merata di antara nilai yang mungkin (di sini3 4 5
).r=T
singkatanreplace=TRUE
dan memungkinkan sampel dengan penggantian.sumber
CJam,
1714 byteCJam lebih baru dari tantangan ini, tetapi ini bukan jawaban terpendek, jadi itu tidak masalah.
Uji di sini.
Untuk mempertahankan total 72, masing
3
- masing harus dipasangkan dengan5
. Jadi, inilah cara kerjanya:sumber