99 bug dalam kode
Adaptasi "99 botol bir di dinding" untuk ilmu komputer di mana bug meningkat dan bukannya penurunan botol sering diposting ulang di internet. Contoh Kaos Di Sini .
Saya pikir akan menarik untuk melihat potensi rekursi dan pembuatan angka acak di berbagai bahasa dan menemukan cara paling efisien untuk melakukannya.
Ada beberapa tantangan lain yang bisa dilakukan dengan 99 botol bir, tetapi tampaknya tidak ada yang bertambah dan berkurang!
Tantangan
Program atau fungsi Anda tidak boleh mengambil input dan kemudian mencetak
99 bug dalam kode
99 bug dalam kode
Catat satu dan tempelkan
X bug dalam kode
(garis kosong)
Di mana X adalah bilangan bulat sebelumnya minus 1 ditambah bilangan bulat acak dalam kisaran [-15,5].
Anda dapat menggabungkan minus 1 ke dalam bilangan bulat acak, sehingga memungkinkan kisaran [-16,4].
Kisaran bisa eksklusif, jadi minus satu tambah (-16,6) atau (-17,5).
Bilangan bulat acak tidak harus terdistribusi secara merata, mereka harus memungkinkan semuanya.
Program selalu dimulai dengan 99 bug.
Anda dapat mengabaikan kesalahan tata bahasa "1 bug".
Program harus berhenti ketika jumlah bug adalah 0 atau negatif dan cetak
0 bug dalam kode
Seharusnya tidak pernah ada jumlah bug yang negatif. Akhirannya harus seperti
Y bug dalam kode
Y bug dalam kode
Catat satu dan tempelkan
0 bug dalam kode
(garis kosong)
0 bug dalam kode
Baris baru yang tertinggal dapat diterima.
- Kode Anda dapat berupa program atau fungsi lengkap.
- Tidak ada input.
- Outputnya harus stdout atau dikembalikan.
- Peringatan / kesalahan dalam log / STDERR tidak masalah selama STDOUT memiliki teks yang diperlukan. Lihat di sini untuk info lebih lanjut.
Ini adalah kode-golf sehingga kode terpendek dalam byte menang.
Contoh Output
Tempel contoh hasil bin yang dicurangi untuk -11 bug setiap kali
Jawaban:
R ,
182140138135 byteCobalah online!
sementara cukup baik dalam pembuatan bilangan acak, R sangat buruk dalam hal string dan pencetakan.JayCe menemukan sekitar satu miliar byte, dan terus menemukan cara baru untuk bermain golf ini!sumber
+5
biaya Anda 2 byte lagi? kenapa tidak adilsample(26,6))
?sample
Java 8,
161160 byte-1 byte terima kasih kepada @JonathanAllan .
Cobalah online.
Penjelasan:
sumber
r
apa pun?,r
tampaknya masih berfungsi: Coba online!PowerShell ,
137135133131 byteCobalah online!
Bagian "bug dalam kode" disimpan
$b
untuk digunakan nanti. Setel$a
ke99
, masuk satufor
lingkaran aktif$a
. Pertama kita membuat array dari dua string," "*2
, dengan string menjadi"X bugs in the code"
.Selanjutnya hanyalah string
"Take one down and patch it around"
. Kemudian kami menambah$a
dengan memilihRandom
integer dari rentang[-16,4]
. Setelah itu, kami menjepit$a
minimal nol menggunakan ifif($a-lt0){$a=0}
. Lalu talinya"Y bugs in the code"
.Akhirnya, setelah loop selesai, kami menempatkan string
"0 bugs in the code"
ke pipeline. Semua string tersebut dikumpulkan dari pipa, dan sebuah implisitWrite-Output
memberi kita garis baru di antara mereka secara gratis.Menyimpan dua byte menggunakan
for
loop, bukanwhile
loop.Disimpan dua byte dengan pindah
$b
ke bagiannya sendiri.Disimpan dua byte berkat Adrian Blackburn.
sumber
JavaScript (Node.js) , 127 byte
Cobalah online!
Penjelasan:
Terima kasih kepada @tsh untuk ide rekursi dan implementasi (menyimpan beberapa byte)
Setiap saran untuk bermain golf ini lebih lanjut, silakan.
sumber
0+
dihapus? Tampaknya diperlukan output.05AB1E , 59 byte
Cobalah online!
sumber
Python 2 , 151 byte
Trik yang bagus
j=i+max(-i,randint(-16,4))
oleh Jo King, mengeksploitasi distribusi yang tidak merataPasangan byte yang disimpan berkat Mnemonic
Cobalah online!
sumber
j=max(0,i+randint(-16,4))
.Arang , 81 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Mulai dengan 99 bug dalam kode.
Simpan string terkompresi "% d bug dalam kode \ n".
Ulangi sementara ada sejumlah bug positif yang tersisa.
Cetak jumlah bug dalam kode dua kali.
Cetak "Ambil satu ke bawah dan tempelkan di sekitar".
Tambahkan sejumlah bug acak antara -17 (eksklusif) dan 4 (inklusif).
Cetak jumlah bug yang tersisa, atau 0 jika negatif.
Tinggalkan baris kosong di antara ayat-ayat.
Setelah ayat terakhir, cetak 0 bug lagi dalam kode.
sumber
JavaScript,
189176168162 byteCobalah online!
Terima kasih untuk Muhammad Salman untuk
console.log
penggantian yang hilang , dan untuk Oliver atas peningkatan x testTerima kasih atas l4m2 untuk bermain golf ini dengan 8 byte
sumber
x<=0?console.log("\n"+0+a):f(x)
di akhir.f
deklarasi itu. Dipilih turun hingga diperbarui untuk memperbaikinya. (Juga tautan saya perlu pembaruan juga)f
, yang tidak dapat Anda asumsikan.Python 3 ,
156138 byteBerkat jawaban Python 2 Jonathan untuk
id
trik iniCobalah online!
Penjelasan:
sumber
Oktaf ,
149148 byteDisimpan satu byte dengan mengubah
randi(21)
dan%i
ke21*rand
dan%.f
.%.f
memastikan output adalah float dengan nol desimal (yaitu dan integer).Memasukkan banyak jeda baris alih-alih koma dan titik koma untuk memudahkan keterbacaan. Rasanya salah, tapi itu tidak lebih lama dari one-liner.
Cobalah online!
Penjelasan:
Menggunakan
p((x+=21*rand-17)*(x>0)
alih-alihmax
menyimpan byte, tetapi baris terakhir menghasilkan-0 bugs ...
bukan0 bugs
. Ini bekerja dengan baikrandi(21)-17
, tetapi kemudian sama panjangnya dengan yang di atas. Cobalah online!sumber
COBOL (GnuCOBOL),
317294279270 byteCobalah online!
Tidak disatukan
Catatan: kalimat terakhir masih dicetak, karena COBOL mengeksekusi seluruh program, dan setelah
perform until
loop itu "menerobos" label a , menjalankan pernyataannya. Perilaku ini mirip denganswitch case
tanpabreak
.PS: Angka-angka tidak ditampilkan dengan tepat seperti yang disyaratkan, tetapi COBOL tidak begitu bagus dalam mengonversi angka secara otomatis menjadi representasi tekstual yang cantik.
sumber
-=
dalami-=Math.random()*21-4
), yang menyiratkan tanda kurung di seluruh operan tangan kanan. Saya lupa untuk membuatnya secara eksplisit, tetapi sekarang sudah diperbaiki, saya pikir.VBA:
212163 BytesSolusi ini didasarkan pada yang oleh Chronocidal diposting kemarin. Ini posting pertama saya dan saya tidak punya cukup reputasi untuk mengomentari posnya.
Revisi ini mengandung dua perangkat tambahan.
While/Wend
alih-alihFor/Next
menyimpan beberapa karakter.GoSub
danExit Sub
danReturn
garis yang diperlukan untuk mendukungnya.Sunting:
3. Ruang putih dan karakter yang dihapus yang akan ditambahkan oleh editor VBA secara otomatis. Lihat Tips untuk bermain golf di VBA
4. Ditambahkan saran oleh @EricF, kemudian lihat algoritma tempat sampahnya bahkan lebih kecil sehingga saya mengganti algoritme saya dengan dan menghapusnya ruang putih. Perubahan kunci ditambahkan
vbLF
ke string output sehinggaDebug.Print
tidak harus dipanggil sesering mungkin. Kudos to EricF .Ini adalah tantangan yang menyenangkan. Jika Anda mengetahui juru bahasa online seperti TIO untuk VB6 / VBScript / VBA, silakan tinggalkan komentar.
Jika Anda ingin menguji kode ini dan menginstal Microsoft Excel, Word, Access, atau Outlook (hanya Windows), tekan Alt + F11 untuk membuka VBA IDE. Masukkan modul kode baru (Alt + I, M) dan hapus
Option Explicit
. Kemudian rekatkan kode dan tekan F5 untuk menjalankannya. Hasilnya akan muncul di Jendela Segera (tekan Ctrl + G jika Anda tidak melihatnya).sumber
c
sebagai gantic>0
sebagai kondisi Sementara Anda, dan gunakanc=Iif(c<0,0,c)
sebagai gantiIf c<0 [...]
: pastebin.com/nFGtGqdELaTeX ,
368304293287245240 byteWalaupun tidak terlalu kompetitif dibandingkan dengan program lain dalam hal byte, saya hanya ingin melihat bagaimana melakukan ini di LaTeX.
Lebih mudah dibaca:
Perbaikan (per edit):
\if
klausa untuk\repeat
a\else
\value{b}=x
berfungsi untuk inisialisasi tetapi tidak di loop (bukan\setcounter{b}{x}
)\relax
harus digunakan untuk poin 3, tetapi itu juga dapat dicapai dengan memasukkan spasi. Menghapus\else
perintah TeX yang digunakan, alih-alih LaTeX karena ini lebih pendek, dan digantikan\'
oleh~
.sumber
\ifnum\value{b}<1
bukan<0
?C,
169165 byteTerima kasih kepada @ceilingcat karena telah menghemat empat byte!
Cobalah online!
sumber
SAS, 210 byte
Tidak Disatukan:
Dapat menyimpan beberapa byte jika peringatan di log diizinkan (menempatkan
&a
ke dalam&b
variabel makro, tetapi yang menghasilkan peringatan awal).sumber
PHP, 126 byte
Jalankan di baris perintah, menggunakan
php -r 'code here'
:sumber
ABAP , 295 byte
... karena kenapa sih tidak!
Ini tentu saja tidak kompetitif dibandingkan dengan bahasa lain, tetapi saya bahkan berhasil menurunkannya dari 330 byte yang saya tulis pada awalnya, jadi saya menganggapnya sebagai kemenangan pribadi.
Karena ABAP tidak mengizinkan garis yang lebih panjang dari 255 karakter, saya harus mengganti spasi dengan satu baris. Pada Windows ini awalnya meningkatkan ukuran menjadi 296 byte karena CRLF, tetapi berjalan dengan baik hanya dengan LF di sana. ABAP tentu membutuhkan banyak ruang, jadi ini bukan masalah besar.
MENULIS hanya membuang teks GUI, jadi saya kira itu semacam stdout? Saya mungkin bisa menyimpan beberapa byte di sini dengan menggunakan struktur atau tabel, tetapi karena bagaimana SAP menangani struktur campuran (berisi karakter dan angka), pendekatan yang saya bayangkan hanya akan bekerja pada sistem non-Unicode ... yang secara pribadi saya anggap sebagai no- pergi, meskipun memiliki akses ke keduanya.
Modul fungsi untuk angka acak adalah satu-satunya yang dapat saya temukan di sistem kami, saya kira mungkin ada satu dengan nama atau parameter yang lebih pendek. Tidak ada ide!
Kode kurang lebih dapat dibaca, komentar termasuk:
Terima kasih atas tantangannya!
Untuk bos saya: Tolong jangan memecat saya, saya hanya mendidik diri sendiri!
sumber
Bersih ,
245234 byteCobalah online!
sumber
C #,
184181 byteJawaban Golf Kode pertama saya!
(Berdasarkan jawaban Java dari @Kevin Cruijssen)
Cobalah online!
sumber
C (gcc) ,
141137 byteSaya menggunakan macro preprocessor untuk keadilan besar (peringatan: TV Tropes)
Cobalah online!
sumber
T-SQL, 188 byte
SQL memungkinkan pengembalian dalam string literal, sehingga membantu.
CONCAT()
melakukan konversi implisit ke teks jadi saya tidak perlu khawatirCAST
atauCONVERT
.sumber
JavaScript, 138 byte
Tampilkan cuplikan kode
sumber
QB64 , 134 byte
Dari saudaraku.
sumber
Pyth ,
9492 byteCobalah online
Versi sebelumnya: 94 byte
sumber
Jelly , 61 byte
Tautan niladik yang juga berfungsi sebagai program lengkap.
Cobalah online!(output memerah setelah eksekusi selesai tetapi mencetak paragraf demi paragraf)
Bagaimana?
sumber
Perl, 132 byte
sumber
VBA:
225233 Bytes{EDIT} Menambahkan yang hilang
rnd()*
Catatan:
Digunakan
GoSub
untuk mencetak garis rangkap tiga, karena sedikit lebih pendek daripada menetapkan garis ke variabel danDebug.Print
memasukkannya.Debug.Print
tanpa argumen mencetak baris kosong (tidak perlu Null atau string kosong)WorksheetFunction.Max
Garis akan terlalu panjang, jadi saya menggunakan "jika kurang dari" untuk mencegah negatif.Dengan lekukan dan komentar
sumber
rnd() *
di sana - saya pikir saya sibuk menghitung-hitung jika karakternya kurangDim c%
(yaitu "c adalahInt()
Python 2 ,
138 134 133 131127 byte-1 Terima kasih kepada Jo King (mengatur ulang agar menggunakan logika
bugs-=min(bugs,randomNumber)
daripadabugs=max(0,bugs-randomNumber)
). Ini memungkinkan force-stops menggunakan pembagian dengan kesalahan nol, menghemat 6 byte lebih lanjut !Cobalah online!
sumber
Ruby: 149 byte
Harus bekerja di hampir semua versi Ruby> = 1.8
Saya pikir mungkin untuk mengoptimalkan string sedikit lebih, tetapi secara umum saya cukup senang dengan itu - khususnya pernyataan tugas pembanding / perbandingan / istirahat dan penyalahgunaan kurung opsional.
Catatan: output secara teknis memiliki dua baris baru; jika itu perlu dipertanggungjawabkan maka naik dengan 4 karakter.
sumber
\n
(tidak\r
).Zsh , 133 byte
Cobalah online!
Ini memanfaatkan beberapa fitur zsh.
while list; do list; done
dapat ditulis sebagaiwhile list {list}
printf
adalah numerik, argumen yang sesuai dievaluasi sebagai ekspresi aritmatika. Begitu:n
gratis tanpa menggunakan a$
n -= RANDOM % 21 - 4, n = n > 0 ? n : 0
sekali lagi dievaluasi tanpa harus menggunakan$((...))
,$[...]
atau serupa. The>
dan?
harus melarikan diri.printf $b
di akhir mengevaluasi argumen kosong sebagai 0 untuk%d
.$b
mana pun.$b$b"Take..."
bukan"$b${b}Take..."
.\n
, danfor((n=99;n;))
bukannyan=99;while ((n))
.sumber