Input output:
Input : String acak '0' dan '1' yang seragam, panjang, dan tak terhingga, diambil dari stdin. String diasumsikan benar-benar acak, bukan pseudo-acak. Ini seragam karena setiap karakter memiliki kemungkinan yang sama untuk menjadi '0' atau '1'.
Cermat! Inputnya panjang sekali, jadi Anda tidak bisa menyimpan semuanya dalam memori menggunakan fungsi seperti raw_input () dalam python. Jika saya tidak salah, skrip golf akan gagal dengan input yang tidak terbatas, karena mendorong seluruh input ke stack sebelum menjalankan.
Output : Dek standar acak acak acak, tanpa pelawak. Ini seragam karena semua pemesanan memiliki kemungkinan yang sama.
Setiap kartu dalam output adalah peringkatnya, A, 2-9, T, J, Q atau K yang digabungkan dengan suit, c, d, h atau s. Misalnya, 10 sekop adalahTs
Kartu-kartu geladak harus dipisahkan oleh spasi.
Anda tidak boleh menggunakan pustaka atau fungsi acak bawaan karena tidak benar-benar acak, hanya pseudo-acak.
Contoh input
Anda dapat menggunakan skrip python berikut untuk memasukkan input ke program Anda:
import sys, random
try:
while True:
sys.stdout.write(str(random.randint(0,1)))
except IOError:
pass
Jika Anda menyimpan skrip sebagai rand.py, uji program Anda dengan python rand.py | your_program
Dalam python 3 ini berjalan seperti yang diharapkan, tetapi dalam python 2.7 saya mendapatkan pesan kesalahan setelah output program saya, tetapi hanya setelah semuanya selesai, jadi abaikan saja pesan kesalahan itu.
Contoh output:
Begini cara dek harus dicetak jika kebetulan diacak menjadi urutan:
Ac 2c 3c 4c 5c 6c 7c 8c 9c Tc Jc Qc Kc Ad 2d 3d 4d 5d 6d 7d 8d 9d Td Jd Qd Kd Ah 2h 3h 4h 5h 6h 7h 8h 9h Th Jh Qh Kh As 2s 3s 4s 5s 6s 7s 8s 9s Ts Js Qs Ks
Mencetak:
Ini adalah kode golf. Kode terpendek menang.
Contoh program:
Berikut ini adalah solusi python 2.7, bukan golf.
import sys
def next():
return int(sys.stdin.read(1))==1
def roll(n):
if n==1:
return 0
if n%2==0:
r=roll(n/2)
if next():
r+=n/2
return r
else:
r=n
while(r==n):
r=roll(n+1)
return r
deck = [rank+suit for suit in 'cdhs' for rank in 'A23456789TJQK']
while len(deck)>0:
print deck.pop(roll(len(deck))),
Jawaban:
Ruby,
8987 karakterEdit: versi sebelumnya
sumber
Python 122
Penjelasan:
Kartu yang tidak digunakan disimpan dalam D. Ini hanya mendapatkan indeks acak yang valid berikutnya dari aliran input dan muncul elemen itu dari D.
Kecuali saya kehilangan sesuatu, seharusnya tidak ada bias. Skrip akan membuang semua indeks yang tidak valid>
len(D)
, tetapi ini tidak menghasilkan bias untuk angka yang lebih rendah karena setiap pop yang berurutan akan mengurangi indeks setiap elemen di masa lalu daripada saya.sumber
Perl, 80 karakter
berikut ini adalah implementasi lain yang tidak mengalami bias dan dua karakter lebih pendek:
implementasi lama (82 karakter):
deskripsi implementasi lama:
sumber
sort
, menghasilkan bias terhadap pemesanan alfabet.C,
197178161 karakterEDIT : Menggunakan fungsi acak baru, yang jauh lebih pendek - membaca bilangan bulat 4
s
dan menggunakans%64
. Setiap angka desimal 6 digit yang terbuat dari 0 dan 1 saja, diambil%64
hasilnya dalam hasil yang unik, sehingga keacakannya baik.Pendekatan ini mengkonsumsi lebih banyak bit acak, tetapi jauh lebih pendek.
Logika dasarnya sederhana - inisialisasi array 52 int dengan 0..51, shuffle (ganti elemen x secara acak dengan yang lain dari rentang 0..x), cetak berformat (n / 4 = peringkat, n% 4 = cocok) .
Satu loop, yang berjalan 104 kali, melakukan inisialisasi (52 kali pertama), pengocokan dan pencetakan (52 kali terakhir).
Angka acak dihasilkan dengan menarik
n
bit acak, hingga1<<n
setidaknya maksimum yang diinginkan. Jika hasilnya lebih dari maksimum - coba lagi.sumber
s>7?"ATJQK"[s-8]:s+50
ini lebih panjang dari yang sederhana"A23456789TJQK"[s]
. Kedua, Anda bisa menggunakant/4
dant%4
bukannyat%13
dant/13
.t
ke dalam array ketika mengeluarkanshell unix ~ 350
Ini tidak pendek atau cantik, juga tidak efisien, tetapi saya bertanya-tanya seberapa sulit untuk melakukan ini dengan utilitas shell unix standar.
Jawaban ini memotong string biner infinite menjadi panjang 6 bit dan hanya memilih yang berada dalam kisaran yang benar (1-52), di sini string biner infinite disimulasikan oleh urandom dan xxd:
Pemotongan dan seleksi dilakukan dengan lipatan, sed dan bc:
Ini menghasilkan garis-garis seperti:
Yang bisa diarahkan ke bc.
Dari aliran angka ini, urutan dek dipilih seperti ini (saya menggunakan zsh, tetapi sebagian besar shell modern harus dapat beradaptasi dengan ini):
Urutan nomor acak sekarang perlu diubah menjadi nama kartu. Urutan nama kartu mudah dibuat dengan paralel GNU:
Menggabungkan output dari dua perintah terakhir dengan menempelkan dan mengurutkan angka:
Semuanya sebagai one-liner mengerikan (hanya diuji dalam zsh):
Edit - versi bash ditambahkan
Ini adalah versi yang bekerja di bash. Saya menghapus in-shell
{ }
dan indeks array berbasis nol. Kekosongan larik diperiksa dengan ekspansi parameter, sedikit lebih efisien dan juga diadopsi dalam contoh di atas.sumber
K&R c - 275
char
literal yang tersisa denganint
literalGolf:
Cukup banyak kekerasan di sini. Saya baru saja membaca sembilan bit dari input untuk membentuk output RNG minimal, dan melakukan redraw-if-the-un-values-yang tidak digunakan pengurangan modulus pada akhir untuk mendapatkan output yang seragam untuk menyalakan shuffle pilihan.
Versi un-golfed ini berbeda karena dibutuhkan input
/dev/urandom
daripada dari format input yang dijelaskan.sumber
"TJQKA"
dan"cdhs"
?int
s. Saya mengerti. Mungkin masih layak untuk menyimpan semua tanda baca. Bahkan mungkin faktorchar
keluargetchar
danputchar
dengan makro pucat gila ...#define N
dan diakhiri dengan baris baru yang dianggap sebagai karakter dan itu 11, ditambah bit yang Anda ganti. Tentu ada beberapa karakter lagi dalam mengganti beberapa atau semua karakter literal dengan literal int, tapi sudah terlambat di sini ... mungkin saya akan melakukannya lain kali.PHP, 158 karakter
Baris baru telah ditambahkan untuk menghentikan blok kode mendapatkan scrollbar, mereka dapat dengan aman dihapus.
Sebelum saya diberitahu untuk menambahkan
<?php
, beri tahu Anda dapat memanggil PHP tanpa tag ini dengan mudah, menggunakan:cat golf.php | php -a
De-golf dan berkomentar:
Ada dua kesalahan yang diharapkan, yang tidak mempengaruhi output program.
Yang pertama adalah karena
$a
tidak diinisialisasi, tetapi NULL dikonversi ke 0 dan program berlanjut.Yang kedua adalah karena aliran karakter tampaknya mendapatkan baris baru dari suatu tempat, bahkan jika itu tidak disediakan (PHP yang bagus), dan itu adalah indeks yang tidak ditentukan dalam array. Ini adalah karakter input terakhir, dan tidak memengaruhi output.
sumber