Tantangan Anda adalah bermain golf program yang meniru aliran transmisi data. Program Anda harus membaca input dari stdin dan mengeluarkannya langsung ke stdout. Untuk membuat masalah lebih menarik, aliran output 'salah', dan harus memenuhi beberapa persyaratan:
- Seharusnya ada peluang 10% bahwa setiap karakter digeser +1 kode ascii (ex 'a' menjadi 'b', '9' menjadi ':'), dll.
- Input dan output hanya mencakup nilai ascii yang dapat dicetak ('!' Hingga '~', desimal 33 hingga desimal 126, inklusif). Jika +1 acak terjadi pada '~' (desimal 126), a '!' (desimal 33) yang seharusnya menjadi keluaran.
- Jika tiga karakter digeser secara acak berturut-turut, program harus menampilkan "ERROR CODE 4625: ERROR YANG TIDAK DAPAT DIKECUALIKAN, SILAHKAN HUBUNGI ADMINISTRATOR SISTEM ANDA" (mengikuti baris baru opsional) dan menghentikan eksekusi.
Untuk menyederhanakan masalah, berikut adalah beberapa kriteria lain:
- Anda dapat berasumsi bahwa input akan selalu valid; artinya, itu hanya akan berisi nilai '!' melalui '~'.
- Program harus berlanjut sampai tiga karakter secara acak bergeser dalam satu baris; aman untuk mengasumsikan bahwa EOF tidak akan pernah terjadi.
- Keacakan harus berbeda di seluruh proses; jika generator nomor acak Anda perlu diunggulkan untuk mendapatkan hasil yang unik setiap kali dijalankan, maka kode Anda perlu diunggulkan.
- Anda harus menulis sebuah program, bukan fungsi.
- Anda harus mengambil input dari stdin dan menulis output ke stdout.
- Anda tidak boleh menggunakan perpustakaan atau sumber daya eksternal apa pun.
- Kode Anda harus memiliki intrepreter atau kompiler yang tersedia secara bebas dan berfungsi.
Aturan standar kode-golf berlaku. Pemenang adalah siapa pun yang memposting program terpendek dua minggu dari sekarang (Kamis, 20 Februari, 2014).
Jawaban:
Befunge-98,
166159156155148Yang ini meningkatkan jawaban Befunge luar biasa lainnya dengan probabilitas yang benar (1/10) dan sedikit lebih kompak:
sumber
x
digunakan di dua tempat sebagai "goto." Pembungkus tepi (ab) digunakan secara luas, termasuk kontrol yang mengalir melalui celah ruang antaraASE
danCONTACT
. Penghitung "3-in-a-row" disimpan di bagian bawah tumpukan; backslash digunakan untuk bertukar dan mengaksesnya di mana diperlukan.?
instruksi (salah satunya dihantam oleh dua jalur, sehingga kemungkinan masih tepat 1/10) dan membuat beberapa penyesuaian kecil lainnya untuk mengurangi 7 karakter lagi!C, 168 karakter
Penyemaian solusi PRNG ini mengambil keuntungan dari kenyataan bahwa OS modern mengubah lokasi stack dalam memori pada setiap run, sebagai langkah dasar terhadap eksploitasi stack-smashing.
sumber
c
sepenuhnya dengan memindahkangetchar()
panggilan keputchar()
dan menggunakan beberapa matematika mewah ...c
sehingga Anda dapat mengujigetchar()
nilai terhadap 126 selain meneruskannyaputchar()
.putchar((getchar()-33+(rand()%10?i=0:1))%94+33))
harus bekerja. Menggunakan solusi Anda sebagai basis, itu membuat saya turun hingga 165 karakter.Ruby, 156
sumber
:3while
?:3
sebenarnya adalah akhir dari pernyataan ini:e=r>0?e-r :3
yang menetapkan nilai e (jumlah kesalahan berurutan yang tersisa sebelum kita batalkan) berdasarkan r (1 jika karakter terakhir yang diproses adalah kesalahan, 0 jika tidak). Ini hanya didorong melawan sementara untuk menghemat ruang:>while
tanpa ruang sebelumnya? Itu sangat tidak jelas dan tidak bisa dibaca! ;)Gelombang - 359
Terbuka untuk saran agar sepenuhnya mematuhi aturan tantangan.
Saya akan berusaha membuatnya lebih kecil / lebih baik - saya ingin mempostingnya ketika sedang bekerja, sebelum saya istirahat.
Pasti ada beberapa cara untuk menurunkannya.
Tidak golf -
sumber
Befunge-93 (206)
Ini memiliki 142 karakter non-spasi. Secara teknis itu tidak sesuai, karena memiliki probabilitas 1/9 bukan 1/10 untuk kesalahan.
Jalankan sebagai
cat /dev/urandom | tr -dc '!-~' | ./befungee.py -c 100 ../rand
.Dengan input ini,
!!!!aaaaaaa~~~~~~~~~~
kami mendapatkan output yang!"!!aabaaba~~~!~~~~!!
mengindikasikan bahwa kesalahan ditangani dengan benar.sumber
PHP 190
itu semakin jauh saya bisa golf itu, tetapi saya pikir itu cukup bagus bahwa itu kurang dari 100 karakter dari yang terkemuka
sumber
C # -
346330313309297288278274Agak lama tetapi melakukan pekerjaan.
sumber
c=n==0?c+1:0
lebih pendek daric+=(n==0?1:-c)
...(n==1?1:0)
lebih pendek dari(n==1?n--:(--n-n))
(dan tentu saja kemudian berubahn==0
menjadin==1
)(false)
? Jika ada, bukankah Anda mau(true)
?shbash, di OSX,211,208,203,200,196, 185Sedikit lebih baik dari 10% karena acak akan menghasilkan angka antara 0 dan 32767, jadi benar-benar 3,277 dalam peluang 32,768 (10.0006%).
Terima kasih, @Gilles (tetapi tidak yakin apa yang Anda maksud tentang restrukturisasi sementara. Ada beberapa ide lain di kamar mandi juga.
sumber
[ $RANDOM -gt 3276 ]
menjadi((RANDOM>3276))
dan[ $[t++] -eq 2 ]
ke((t++==2))
. Saya pikir Anda juga dapat menyimpan beberapa karakter dengan menata ulang sebagaiwhile read -n1 a;((RANDOM>3276))&&…
.while read...
bagian itu?while …;do :;done
atauuntil …;do :;done
, Anda harus dapat mencukur beberapa karakter.C,
260257237225189174Golf pertama saya, saran sangat dihargai.
7 sangat acak.
Kompilasi akan memberi Anda peringatan.
Terima kasih atas bantuan dari kotak roti dan Josh.
sumber
#include
; C akan menerima (dengan peringatan) panggilan ke fungsi yang tidak dideklarasikan (dalam batas). Gunakan variabel global untuk mendapatkan inisialisasi nol otomatis. Temukan cara untuk menggunakan operator ternary alih-alihif
/else
pernyataan. Menggunakanfor
di tempatwhile
memberi lebih banyak peluang untuk mengurangi jumlah pernyataan tingkat atas dan menghilangkan tanda kurung di sekitar badan loop. Banyak lagi yang bisa disebutkan: periksa solusi C lain di situs ini.n
danc
pada lingkup global. Ini akan memungkinkan Anda untuk menjatuhkanint
deklarasi serta membiarkan inisialisasi menjadi nol secara otomatis.c
nilai yang tidak diinisialisasi disrand
. Saya kira saya bisa menggunakan&c
atau&n
sebagai gantinya, itulah kotak roti yang digunakan.