99 bug dalam kode

47

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

Sam Dean
sumber
1
Terkait: 1 2 (perbedaan: dalam tantangan ini hasilnya bisa panjang sembarang).
user202729
16
Skenario yang lebih realistis adalah jika tanda nomor acak dibalik!
Stewie Griffin
9
Saya kecewa, bahwa persyaratannya tidak termasuk bahwa program tersebut harus memiliki bug setelah angka negatif ditemukan, seperti menabrak, meluap ke max int atau sejenisnya;).
allo
3
"Bilangan bulat acak tidak harus terdistribusi secara merata, mereka harus memungkinkan semuanya." mengingatkan saya pada xkcd.com/221
Ivo Beckers
2
Sayang 99 tidak memiliki generasi nomor acak.
Jonathan Allan

Jawaban:

18

R , 182 140 138 135 byte

n=99;while(n)cat(n,b<-" bugs in the code
",n,b,"take one down and patch it around
",n<-max(0,n-sample(21,1)+5),b,"
",c(n,b)[!n],sep="")

Cobalah 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!

Giuseppe
sumber
1
Di mana JayCe menemukan semua byte itu? Apakah itu hanya kebetulan atau apakah JayCe aktif mencari mereka?
Stewie Griffin
Jadikan
Bukankah +5biaya Anda 2 byte lagi? kenapa tidak adil sample(26,6))?
theforestecologist
2
@theforestecologist Selamat Datang di PPCG! Saya sarankan Anda melihat lebih dekat pada pertanyaan ... ada tanda minus di depansample
JayCe
11

Java 8, 161 160 byte

v->{String s="",t=" bugs in the code\n";for(int i=99;i>0;s+=i+t+i+t+"Take one down and patch it around\n"+((i-=Math.random()*21+4)<0?0:i)+t+"\n");return s+0+t;}

-1 byte terima kasih kepada @JonathanAllan .

Cobalah online.

Penjelasan:

v->{                   // Method with empty unused parameter and String return-type
  String s="",         //  Result-String, starting empty
         t=" bugs in the code\n";
                       //  Temp-String we use multiple times
  for(int i=99;i>0;    //  Start `i` at 99, and loop as long as it's larger than 0
    s+=                //   Append to the result-String:
       i+t             //    The first line of the verse
       +i+t            //    The second (duplicated) line of the verse
       +"Take one down and patch it around\n"
                       //    The third line of the verse
       +((i-=Math.random()*21-4)
                       //    Decrease `i` by a random integer in the range [-16, 4]
         <0?0:i)       //    If `i` is now negative, set it to 0
        +t+"\n");      //    And append the fourth line of the verse
  return s             //  Return the result,
         +0+t;}        //  appended with an additional line for 0 at the very end
Kevin Cruijssen
sumber
Sepertinya Anda tidak menggunakan rapa pun?
OOBalance
1
Menghapus ,rtampaknya masih berfungsi: Coba online!
Kamil Drakari
@OOBalance Ups .. Tidak yakin mengapa saya mendapatkannya di sana ..>.> Terima kasih telah memperhatikan.
Kevin Cruijssen
1
i - = ... + 5 menghemat satu (walaupun saya pikir kisarannya harus [-16 4] bukan [-15,5])
Jonathan Allan
1
@OOBalance ya r tidak digunakan, karena dia menggunakan java ;-)
Anand Rockzz
10

PowerShell , 137 135 133 131 byte

$b=' bugs in the code';for($a=99;$a){,"$a$b"*2;"Take one down and patch it around";$a+=-16..4|Random;if($a-lt0){$a=0}"$a$b`n"}"0$b"

Cobalah online!

Bagian "bug dalam kode" disimpan $buntuk digunakan nanti. Setel $ake 99, masuk satu forlingkaran 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 $adengan memilih Randominteger dari rentang [-16,4]. Setelah itu, kami menjepit $aminimal nol menggunakan if if($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 implisit Write-Outputmemberi kita garis baru di antara mereka secara gratis.

Menyimpan dua byte menggunakan forloop, bukan whileloop.
Disimpan dua byte dengan pindah $bke bagiannya sendiri.
Disimpan dua byte berkat Adrian Blackburn.

AdmBorkBork
sumber
Anda dapat mengganti $ a = (0, $ a) [$ a-gt0]; with If ($ a-lt0) {$ a = 0} untuk beberapa byte
Adrian
@AdrianBlackburn Terima kasih!
AdmBorkBork
9

JavaScript (Node.js) , 127 byte

f=(i=99,t=` bugs in the code
`)=>i>0?i+t+`Take one down and patch it around
`+((i+=0|Math.random()*21-15)<0?0:i)+t+`
`+f(i):0+t

Cobalah online!


Penjelasan:

f = (                                          // start of our recursive function
    i=99,t=` bugs in the code                 // parameters, 1. num bugs , 2. text
`)                                           // using string literal end text with \n
=>                                          // start function
    i > 0 ?                                // if i is greater than 0
        i + t +                           // return value of i, value of t and  
    `Take one down and patch it around   // and this text 
    `                                   // + new line
    + (( i +=                          // and add 
        0|Math.random()*21-15) < 0 ?  // remove decimal from value obtained by multiplying
                                     // random number (between 0 and 1) multiplied by 21 
                                    // and then subtracting 15 from it
                                   // if that value is less than 0
        0 :                       // add 0 to i
        i                        // otherwise add value of i  
        )                       // end the parenthesis 
    + t                        // add value of t to that
    + `\n`                    // along with a new line 
    + f(i)                   // and repeat the process (this is recursive)
    :                       // if i > 0 condition not met then
        0 + t              // return 0 + t. Zero is there so the last line can be 
                          // repeated

Terima kasih kepada @tsh untuk ide rekursi dan implementasi (menyimpan beberapa byte)

Setiap saran untuk bermain golf ini lebih lanjut, silakan.

Muhammad Salman
sumber
1
Kenapa 0+dihapus? Tampaknya diperlukan output.
tsh
@ tsh: Apakah itu? Saya tidak membaca bagian itu.
Muhammad Salman
7

05AB1E , 59 byte

99[Ð16(4ŸΩ+¾‚{θ©3F“ÿ±À€†€€ƒË“Š}“ƒ¶€µ„‹€ƒš¡€•…¡“ªsõ®>#®]sDŠ»

Cobalah online!

Emigna
sumber
6

Python 2 , 151 byte

Trik yang bagus j=i+max(-i,randint(-16,4))oleh Jo King, mengeksploitasi distribusi yang tidak merata

Pasangan byte yang disimpan berkat Mnemonic

from random import*
i,s=99,'bugs in the code\n'
while i:j=max(0,i+randint(-16,4));print i,s,i,s,'Take one down and patch it around\n',j,s;i=j
print i,s

Cobalah online!

Possum Mati
sumber
1
Anda dapat menyimpan byte dengan menggunakan j=max(0,i+randint(-16,4)).
Mnemonic
Juga, itu 'bug di dalam kode'.
Mnemonic
Menggunakan 0 untuk membandingkan wiil membuat tidak semua angka mungkin. Terima kasih atas 'the': D
Dead Possum
Trik yang sama dengan jawaban saya, 151 byte
Jo King
Lagipula itu tidak mungkin. Anda tidak diizinkan masuk di bawah 0.
Mnemonic
6

Arang , 81 byte

≔⁹⁹θ≔”⧴"pWº⁴tSn/{yBⅈ⁺”ζW›θ⁰«×²﹪ζθ”↶0⪫\`3+¤⸿Zν(z¬hLÀTj'ZXεPraF”≧⁺⁻⁴‽²¹θ﹪ζ×θ›θ⁰¶»﹪ζ⁰

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

≔⁹⁹θ

Mulai dengan 99 bug dalam kode.

≔”⧴"pWº⁴tSn/{yBⅈ⁺”ζ

Simpan string terkompresi "% d bug dalam kode \ n".

W›θ⁰«

Ulangi sementara ada sejumlah bug positif yang tersisa.

ײ﹪ζθ

Cetak jumlah bug dalam kode dua kali.

”↶0⪫\`3+¤⸿Zν(z¬hLÀTj'ZXεPraF”

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.

Neil
sumber
Perlu final itu mengulangi "0 bug dalam kode"!
Sam Dean
1
@ SamDean Maaf saya mengabaikan itu, diperbaiki.
Neil
6

JavaScript, 189 176 168 162 byte

f=(x=99)=>{c=console.log;m=Math;a=` bugs in the code
`;c(x+a+x+a+"Take one down and patch it around"+(x=m.max(x+m.ceil(m.random()*21-15),0))+a)
x?f(x):c(`
`+x+a)}

Cobalah online!

Terima kasih untuk Muhammad Salman untuk console.logpenggantian yang hilang , dan untuk Oliver atas peningkatan x test

Terima kasih atas l4m2 untuk bermain golf ini dengan 8 byte

Pria acak
sumber
Saya bukan ahli simpul, tetapi saya percaya "Program harus berhenti ketika jumlah bug adalah 0 atau negatif" berarti Anda perlu x<=0?console.log("\n"+0+a):f(x)di akhir.
NoOneIsHere
1
Ok maaf Satu hal lagi: jika Anda perlu kambuh dalam fungsi anonim, Anda perlu menyebutkannya secara eksplisit (+2 byte)
NoOneIsHere
1
tidak bisakah "console.log" yang terakhir diganti dengan "c"?
Sam Dean
1
@NoOneIsHere juga benar. Anda memang membutuhkan fdeklarasi itu. Dipilih turun hingga diperbarui untuk memperbaikinya. (Juga tautan saya perlu pembaruan juga)
Muhammad Salman
2
Poin yang saya coba buat di sini adalah kode Anda tidak berfungsi jika fungsinya tidak dipanggil f, yang tidak dapat Anda asumsikan.
NoOneIsHere
6

Python 3 , 156 138 byte

Berkat jawaban Python 2 Jonathan untuk idtrik ini

r=n=99
z='%d bugs in the code\n'
while n:x=n;r+=id(r);n-=min(n,r%21-4);print((z%x)*2+'Take one down and patch it around\n'+z%n)
print(z%n)

Cobalah online!

Penjelasan:

r=n=99       #Initialise r and n to 99
z='%d bugs in the code\n'  #Save n
while n:     #Loop while n is not 0
    x=n      #Save value of n
    r+=id(r) #Modify value of r, which changes the hash value
    n-=min(n,r%21-4)  #Change n's value by a random number between 4 and -16
    print((z%x)*2+'Take one down and patch it around\n'+z%n)   #Print the message
print(z%n)  #And print the final line
Jo King
sumber
5

Oktaf , 149 148 byte

Disimpan satu byte dengan mengubah randi(21)dan %ike 21*randdan %.f. %.fmemastikan 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.

x=99;do(p=@(i)printf('%.f bugs in the code\n',i))(x)
p(x)
disp('Take one down and patch it around')
p(max([0,x+=21*rand-17]))
disp('')until x<1
p(0)

Cobalah online!

Penjelasan:

x=99;               % Initialize the number of bugs to 99
do ...  until x<1   % Loop until the number of bugs is less than 1
 (p=@(i)printf('%.f bugs in the code\n',i))(x)  % Create a function handle p that takes
                                                % the number of bugs as input and outputs
                                                % the string x bugs ... \n
 p(x)                % Call that function with the same number of bugs to get two lines
 ,disp('Take on down and patch it around')       % Outputs that line, including a newline
 ,p(max([0,x+=21*rand-17]))                    % Call p again, while updating the number
                                                 % of bugs. The number of bugs will be 
                                                 % the old one plus the random number, or 0
                                                 % if it would have turned negative
 ,disp('')        % A newline
p(0)              % Finally, the last single line.

Menggunakan p((x+=21*rand-17)*(x>0)alih-alih maxmenyimpan byte, tetapi baris terakhir menghasilkan -0 bugs ...bukan 0 bugs. Ini bekerja dengan baik randi(21)-17, tetapi kemudian sama panjangnya dengan yang di atas. Cobalah online!

Stewie Griffin
sumber
5

COBOL (GnuCOBOL), 317 294 279 270 byte

data division.working-storage section. 1 i pic S99 value 99.procedure division.perform until i=0 perform a 2 times display"Take one down and patch it around"compute i=i-(random*21- 4)if i<0 compute i=0 end-if perform a display""end-perform.a.display i" bugs in the code"

Cobalah online!

Tidak disatukan

data division.                     <-- Define the variables we want to use
working-storage section.           <-- Define global variables used in this
                                       program

1 i pic S99 value 99.              <-- Define variable i with datatype signed
                                       numeric and with two digits

procedure division.                <-- Define our program

perform until i = 0                <-- Perform the following code until i = 0
    perform a 2 times              <-- Execute the procedure called 'a' twice,
                                       see below

    display "Take one down and patch it around"   <-- Display this sentence
    compute i = i -                <-- Subtract from i some random value
        (random * 21 - 4)

    if i < 0                       <-- if i < 0
        compute i=0                <-- then assign 0 to i
    end-if
    perform a                      <-- Execute the procedure 'a'
    display ""                     <-- Display an empty string; needed because
                                       of the blank line
end-perform.

a.                                 <-- Define procedure called 'a'.
    display i " bugs in the code"  <-- Display the value of i and then the
                                       given string literal

Catatan: kalimat terakhir masih dicetak, karena COBOL mengeksekusi seluruh program, dan setelah perform untilloop itu "menerobos" label a , menjalankan pernyataannya. Perilaku ini mirip dengan switch casetanpa break.

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.

MC Emperor
sumber
1
Hai. Selamat datang di PPCG.
Muhammad Salman
Saya pikir minus 4 harus ditambah 4. Saya kira Anda pergi untuk (i- (rand-4) == (i-rand + 4) .Tapi tidak ada tanda kurung sehingga tanda perlu diubah. Juga dapat tanda-tanda dari nomor yang dihapus atau apakah itu fitur bahasa? Tapi kerja bagus dengan bahasa ramah non-emas!
Sam Dean
1
@SamDean Terima kasih! Saya memperbaiki kesalahan itu. Saya harus mengakui bahwa perhitungan acak yang sebenarnya terinspirasi dari jawaban Kevin Cruijssen . Tapi dia menggunakan operator penugasan majemuk ( -=dalam i-=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.
MC Emperor
@MCEmperor terlihat bagus untuk saya sekarang!
Sam Dean
Tidak bisakah Anda menggunakan +4 dan menyimpan kurung?
raznagul
4

VBA: 212 163 Bytes

Solusi 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.

  1. Menggunakan While/Wendalih-alih For/Nextmenyimpan beberapa karakter.
  2. Memanggil Sub bernama dengan satu karakter lebih pendek dari GoSubdan Exit Subdan Returngaris 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 vbLFke string output sehingga Debug.Printtidak harus dipanggil sesering mungkin. Kudos to EricF .


Sub b()
s=" bugs in the code"&vbLf
c=99
While c
Debug.? c &s &c &s &"Take one down and patch it around
c=c+5-Int(Rnd()*20)
c=IIf(c<0,0,c)
Debug.? c &s
Wend
End Sub

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).

Ben
sumber
4
Selamat datang di situs ini!
Wheat Wizard
1
Anda dapat menurunkannya hingga 197 karakter jika Anda menggabungkan string, gunakan csebagai ganti c>0sebagai kondisi Sementara Anda, dan gunakan c=Iif(c<0,0,c)sebagai ganti If c<0 [...]: pastebin.com/nFGtGqdE
ErikF
4

LaTeX , 368 304 293 287 245 240 byte

Walaupun tidak terlalu kompetitif dibandingkan dengan program lain dalam hal byte, saya hanya ingin melihat bagaimana melakukan ini di LaTeX.

\documentclass{proc}\newcount\b\b99\usepackage[first=-16,last=5]{lcg}\def~{\the\b\ bugs in the code\\}\def\|{\loop~~Take one down and patch it around\\\rand\advance\b\value{rand}\ifnum\b>0 ~\\\repeat\b0 ~\\~}\begin{document}\|\end{document}

Lebih mudah dibaca:

\documentclass{proc}               %shortest document class
\newcount\b                        %short variable name
\b 99                              %set the value to 99
\usepackage[first=-16,last=5]{lcg} %random number generator
%\the prints the value of the variable behind it
%\def is shorter than \newcommand and can redefine commands
\def~{\the\b\ bugs in the code\\}
\def\|{                            %the function
    \loop
        ~
        ~
        Take one down and patch it around\\
        %\rand creates a counter named rand and                                        
        %stores the random value in it
        \rand \advance\b\value{rand} 
        %if the counter is smaller than 0, it becomes 0
        \ifnum\b>0 
            ~ \\                  %extra newline as required
    \repeat
    %if b is equal or smaller than 0, set it to 0
    \b 0 
    ~ \\                          %then print like normal
    %extra print at the end
    ~
}
\begin{document}
    \|                             %calling the function
\end{document}

Perbaikan (per edit):

  1. "x bug dalam kode" sekarang menjadi fungsi alih-alih 4 baris
  2. Tulis ulang \ifklausa untuk \repeata\else
  3. Tampaknya \value{b}=xberfungsi untuk inisialisasi tetapi tidak di loop (bukan \setcounter{b}{x})
  4. Tampaknya \relaxharus digunakan untuk poin 3, tetapi itu juga dapat dicapai dengan memasukkan spasi. Menghapus \elseperintah TeX yang digunakan, alih-alih LaTeX karena ini lebih pendek, dan digantikan \'oleh ~.
  5. Beberapa kode tidak perlu rileks karena alasan tertentu.
Simon Klaver
sumber
1
Selamat datang di PPCG.
Muhammad Salman
Selamat datang di PPCG! Aku tidak menjalankan kode Anda tetapi tidak harus itu \ifnum\value{b}<1bukan <0?
JayCe
@ JayCe: Tidak masalah, sekali b adalah 0, bagaimanapun, ia lolos dari loop. Mungkin saja kurang intuitif bahwa ketika b adalah 0 case yang lain memang dicetak, tetapi secara efektif tidak ada perbedaan saya pikir.
Simon Klaver
@JayCe memperpendek kode, sekarang tidak masalah lagi;)
Simon Klaver
4

C,  169  165 byte

Terima kasih kepada @ceilingcat karena telah menghemat empat byte!

*s=" bugs in the code";f(i,j){for(i=99;i>0;i=j)printf("%d%s\n%d%s\nTake one down and patch it around\n%d%s\n\n",i,s,i,s,(j=i+rand()%19-15)<0?0:j,s);printf("0%s",s);}

Cobalah online!

Steadybox
sumber
3

SAS, 210 byte

%macro t;%let b=bugs in the code;%let a=99;%do%until(&a<=0);%put&a &b;%put&a &b;%put Take one down, pass it around;%let a=%eval(&a-%sysfunc(ranbin(0,20,.3))+4);%if &a<0%then%let a=0;%put&a &b;%put;%end;%mend;%t

Tidak Disatukan:

%macro t;
%let b=bugs in the code;
%let a=99;
%do%until(&a<=0);
  %put &a &b;
  %put &a &b;
  %put Take one down, pass it around;    
  %let a=%eval(&a-%sysfunc(ranbin(0,20,.3))+4);
  %if &a<0%then%let a=0;
  %put &a &b; 
  %put;
%end;
%mend;
%t

Dapat menyimpan beberapa byte jika peringatan di log diizinkan (menempatkan &ake dalam &bvariabel makro, tetapi yang menghasilkan peringatan awal).

Joe
sumber
Beberapa orang lain memiliki peringatan jadi saya akan pergi dengan mereka diizinkan.
Sam Dean
3

PHP, 126 byte

Jalankan di baris perintah, menggunakan php -r 'code here':

$b=" bugs in the code
";for($x=99;print$x.$b,$x;)echo"$x{$b}Take one down and patch it around
",$x-=min($x,rand(-4,16)),"$b
";
Mohon berdiri
sumber
Cobalah online!
MC Emperor
3

ABAP , 295 byte

... karena kenapa sih tidak!

REPORT z.DATA:a(16),c TYPE qfranint.a = 'bugs in the code'.data(b) = 99.WRITE:/ b,a.WHILE b > 0.WRITE:/ b,a,/'Take one down and patch it around'.CALL FUNCTION
'QF05_RANDOM_INTEGER' EXPORTING ran_int_max = 21 IMPORTING ran_int = c.b = b + c - 17.IF b < 1.b = 0.ENDIF.WRITE:/ b,a,/,/ b,a.ENDWHILE.

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:

REPORT z.
  "Define a (text) and c (random)
  DATA: a(16),
        c TYPE qfranint. "A stupid data type for a random INT

  "This is shorter than using VALUE (saves 3 bytes)
  a = 'bugs in the code'.
  "This is slightly shorter than doing ',b TYPE i' and 'b = 99'. (saves 2 bytes)
  data(b) = 99.

  "first line has to be outside of loop due to our exit condition (saved me ~5 bytes)
  WRITE: / b,a. "\n xx bugs in the code

  WHILE b > 0.
    WRITE: / b,a, "\n xx bugs in the code
    /'Take one down and patch it around'.

    "This ridiculous function for random numbers...
    "To save some bytes, I leave ran_int_min at it's default
    "of 1, and set the max to 21 instead, from which I remove
    "17 later on, resulting in a range of [-16,4]
    "Compare:
    "   ' - 17'              =  5 bytes
    "   ' ran_int_min = -16' = 18 bytes
    "(saves 13 bytes)

    CALL FUNCTION 'QF05_RANDOM_INTEGER'
        EXPORTING ran_int_max = 21
        IMPORTING ran_int = c.

    "Maximum number of bugs added:     4 = 21 - 17
    "Maximum number of bugs removed: -16 =  1 - 17
    b = b + c - 17.

    IF b <= 0.
        b = 0.
    ENDIF.

    WRITE: / b,a,/,/ b,a. "\nxx bugs in the code\n\nxx bugs in the code
  ENDWHILE.

Terima kasih atas tantangannya!
Untuk bos saya: Tolong jangan memecat saya, saya hanya mendidik diri sendiri!

Maz
sumber
3

Bersih , 245 234 byte

import StdEnv,Math.Random,System.Time,System._Unsafe,Text
f[n,v:l]b|n>0=n<+b<+n<+b+"Take one down and patch it around\n"<+max 0v<+b+"\n"+f[v:l]b=0<+b

f(scan(+)99[n rem 20-16\\n<-genRandInt(toInt(accUnsafe time))])" bugs in the code\n"

Cobalah online!

Suram
sumber
Apakah ada peluang Anda dapat menghapus tanda kutip di awal dan akhir?
Sam Dean
1
@ SamDean Oh itu hanya opsi kompiler yang saya lupa. Aku akan melemparkan dalam.
Οurous
3

C #, 184 181 byte

Jawaban Golf Kode pertama saya!

(Berdasarkan jawaban Java dari @Kevin Cruijssen)

Func<String>c=()=>{String s="",t=" bugs in the code\n";for(int i=99;i>0;s+=i+t+i+t+"Take one down and patch it around\n"+((i-=new Random().Next(21)-4)<0?0:i)+t+"\n");return s+0+t;};

Cobalah online!

Ben Noble
sumber
1
Selamat datang di PPCG :)
Shaggy
2

T-SQL, 188 byte

DECLARE @ INT=99,@b CHAR(18)=' bugs in the code
'a:PRINT CONCAT(@,@b,@,@b,'Take one down and patch it around
')SET @+=5-22*RAND()IF @<0SET @=0PRINT CONCAT(@,@b,'
')IF @>0GOTO a;PRINT '0'+@b

SQL memungkinkan pengembalian dalam string literal, sehingga membantu.

CONCAT() melakukan konversi implisit ke teks jadi saya tidak perlu khawatir CAST atau CONVERT.

BradC
sumber
2

JavaScript, 138 byte

_=>(I=i=>`Take one down and patch it around
${l=(i>0?i:0)+` bugs in the code
`}
`+l+l+(i>0&&I(i+Math.random()*21-15|0)))(99).slice(55,-25)

Darrylyeo
sumber
2

QB64 , 134 byte

Dari saudaraku.

S$="bugs in the code":I=99:WHILE I>0:?I;S$:?I;S$:?"Take one down and patch it around":I=I+INT(RND*21)-15:I=-(I>0)*I:?I;S$:?:WEND:?I;S$
ErikF
sumber
2

Pyth , 94 92 byte

J99WJ%jb[K"%d bugs in the code"K"Take one down and patch it around"Kk)[JJ=JeS,Z+J-O21 16;%KZ

Cobalah online


Versi sebelumnya: 94 byte

J99WJp%jb[K"%d bugs in the code"K"Take one down and patch it around"K)[JJ=JeS,Z+J-O21 16)b;%KZ
Sok
sumber
2

Jelly , 61 byte

;“,Ȥm46Ṛṛ⁽eɼḞF»
ÇȮ“"ḃḲɠ⁼ċTṪʠ/Ạ⁺ṗḍ^ẸƘⱮṖ8»20X+_«¥©17Ç⁷®ßÇ®?
99Ç

Tautan niladik yang juga berfungsi sebagai program lengkap.

Cobalah online!(output memerah setelah eksekusi selesai tetapi mencetak paragraf demi paragraf)

Bagaimana?

;“,Ȥm46Ṛṛ⁽eɼḞF» - Link 1, helper to construct count-text: number
 “,Ȥm46Ṛṛ⁽eɼḞF» - compressed string (list of characters) = " bugs in the code\n"
;               - concatenate the number with that list of characters

ÇȮ“"ḃḲɠ⁼ċTṪʠ/Ạ⁺ṗḍ^ẸƘⱮṖ8»20X+_«¥©17Ç⁷®ßÇ®? - Link 2, print stuff: number
Ç                                         - call the last Link (1) as a monad
 Ȯ                                        - print and yield that
                                          - ...at this point that is then printed again
                                          -    implicitly due to the start of a new leading
                                          -    constant chain below
  “"ḃḲɠ⁼ċTṪʠ/Ạ⁺ṗḍ^ẸƘⱮṖ8»                  - compressed string (list of characters)
                                          -     = "Take one down and patch it around\n"
                                          - ...once again an implicit print, same reason
                        20                - twenty
                          X               - random int from [1,20] 
                           +              - add the left argument, the number
                                17        - seventeen
                              ¥           - last two links as a dyad:
                             «            -   minimum (of rand[1,20]+n and 17) 
                            _             -   subtract
                               ©          - copy this newNumber to the register
                                  Ç       - call last Link (1) as a monad = f(newNumber)
                                          - here we get another implicit print, same reason
                                   ⁷      - a new line character
                                          - yet another implicit print, same reason
                                    ®     - recall newNumber from the register
                                        ? - if... 
                                       ®  - ...condition: recall from register again
                                          -               (i.e. if non-zero)
                                     ß    - ...then: call this Link (2) as a monad
                                          -          = Link 2(newNumber)
                                      Ç   - ...else: call the last Link (1) as a monad
                                          -          = Link 1(0) (since newNumber=0)

99Ç - Main Link: no arguments
99  - yep, you guessed it, ninety nine
  Ç - call the last Link (2) as a monad
Jonathan Allan
sumber
2

Perl, 132 byte

$c=" bugs in the code
";for($i=99;$i>0;$i+=~~rand(21)-16){print$t.$/,($t=$i.$c)x2,"Take one down and patch it around
"}print"0$c
"x2
Trenton Trama
sumber
2

VBA: 225 233 Bytes

Sub b()
For c = 99 To 0 Step -1
GoSub d
GoSub d
Debug.Print "Take one down and patch it around"
c = c + 5 - Int(rnd() * 20)
If c < 0 Then c = 0
GoSub d
Debug.Print
Next c
Exit Sub
d:
Debug.Print c & " bugs in the code"
Return
End Sub

{EDIT} Menambahkan yang hilangrnd()*

Catatan:
Digunakan GoSubuntuk mencetak garis rangkap tiga, karena sedikit lebih pendek daripada menetapkan garis ke variabel dan Debug.Printmemasukkannya.
Debug.Printtanpa argumen mencetak baris kosong (tidak perlu Null atau string kosong) WorksheetFunction.MaxGaris akan terlalu panjang, jadi saya menggunakan "jika kurang dari" untuk mencegah negatif.

 

Dengan lekukan dan komentar

Sub b()
    For c = 99 To 0 Step -1
        GoSub d '"# bugs in the code"
        GoSub d '"# bugs in the code"
        Debug.Print "Take one down and patch it around"
        c = c + 5 - Int(rnd() * 20)
        If c < 0 Then c = 0 'Non-negative
        GoSub d '"# bugs in the code"
        Debug.Print
    Next c
    Exit Sub
d: 'This is our GoSub bit
    Debug.Print c & " bugs in the code"
    Return
End Sub
Kronosidal
sumber
1
Itu cara yang sangat efisien untuk melakukan angka acak!
Sam Dean
@ SamDean Tidak yakin bagaimana saya lupa memasukkan rnd() * di sana - saya pikir saya sibuk menghitung-hitung jika karakternya kurang Dim c%(yaitu "c adalah Int()
bilangan bulat
haha jangan khawatir! Senang melihat jawaban VBA karena saya belum menggunakannya selama bertahun-tahun!
Sam Dean
2

Python 2 ,  138 134 133 131  127 byte

-1 Terima kasih kepada Jo King (mengatur ulang agar menggunakan logika bugs-=min(bugs,randomNumber)daripada bugs=max(0,bugs-randomNumber)). Ini memungkinkan force-stops menggunakan pembagian dengan kesalahan nol, menghemat 6 byte lebih lanjut !

r=n=99
t="bugs in the code\n"
while 1:r+=id(r);b=n;n-=min(n,r%21-4);print b,t,1/b|b,t,"Take one down and patch it around\n",n,t

Cobalah online!

Jonathan Allan
sumber
Ternyata saya tidak perlu membuat tuple sama sekali.
Jonathan Allan
133 byte
Jo King
@JoKing, terima kasih! (Saya benar-benar harus melihat itu karena itu lebih seperti apa yang saya lakukan dalam jawaban Jelly saya.)
Jonathan Allan
2
@JoKing ... yang berarti kita dapat memaksa berhenti dengan pembagian dengan kesalahan nol untuk menyelamatkan --two-- enam lagi :)
Jonathan Allan
2

Ruby: 149 byte

n=99;f=" bugs in the code\n";loop{puts"#{n}#{f}"*2+"Take one down and patch it around\n";(n+=rand -16..4)>0?puts("#{n}#{f}\n"):break};puts"0#{f}\n"*2

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.

DaveMongoose
sumber
Halo, dan selamat datang di PPCG! Kami menghitung trailing baris baru, tetapi jika bekerja di Linux Anda hanya dapat menghitung \n(tidak \r).
NoOneIsHere
@NoOneIsHere Terima kasih :) Saya telah memperbarui jawaban saya untuk mengklarifikasi - saya merujuk ke baris baru pada output karena pertanyaan menentukan bahwa memiliki satu dapat diterima, tetapi saya tidak yakin tentang dua.
DaveMongoose
Saya melihat. Saya pikir itu baik
NoOneIsHere
2

Zsh , 133 byte

b="%d bugs in the code
";for ((n=99;n;)){printf $b$b"Take one down and patch it around
$b
" n n n-=RANDOM%21-4,n=n\>0\?n:0};printf $b

Cobalah online!


Ini memanfaatkan beberapa fitur zsh.

  • yang berupa lingkaran alternatif :while list; do list; done dapat ditulis sebagaiwhile list {list}
  • Jika format specifier dalam printf adalah numerik, argumen yang sesuai dievaluasi sebagai ekspresi aritmatika. Begitu:
    • kami mendapatkan nilai ngratis tanpa menggunakan a$
    • n -= RANDOM % 21 - 4, n = n > 0 ? n : 0sekali lagi dievaluasi tanpa harus menggunakan $((...)), $[...]atau serupa. The >dan? harus melarikan diri.
    • The printf $bdi akhir mengevaluasi argumen kosong sebagai 0 untuk %d.
  • Pemisahan kata pada ekspansi parameter tidak aktif secara default, jadi saya tidak perlu mengutip di $bmana pun.
    • Ini memungkinkan saya untuk menulis $b$b"Take..." bukan "$b${b}Take...".

  • Menyimpan beberapa byte dengan menggunakan baris baru yang sebenarnya, bukan \n, dan for((n=99;n;))bukannyan=99;while ((n)) .
muru
sumber
Saya pikir itu harus -4. "- =" terlihat seperti komponnya sehingga ia melakukan +4 terlebih dahulu kemudian mengurangi semuanya.
Sam Dean
@SamDean oops, diperbaiki.
muru