Koddaki 99 hata


47

Koddaki 99 hata

Şişelerin azalması yerine böceklerin arttığı bilgisayar bilimleri için "duvarda 99 şişe bira" nın uyarlanması çoğu kez internet çevresinde yeniden yayınlanmaktadır. Örnek T-Shirt İşte .

Çok sayıda dilde potansiyel yinelemenin ve rastgele sayı oluşumunu görmek ve bunu yapmanın en etkili yollarını bulmak ilginç olacağını düşünüyorum.

99 şişe birayla ilgili yapılabilecek bazı zorluklar var ancak hiçbirinin artan ve azalan bir numarası yok!

Meydan okuma

Programınız veya işleviniz giriş yapmamalı ve sonra yazdırmalıdır.

Koddaki 99 hata

Koddaki 99 hata

Bir tane al ve yama yap

Koddaki X hata

(boş çizgi)

X'in önceki tamsayı eksi 1 artı menzil içindeki rastgele bir tamsayı olduğu durumda [-15,5].
Eksi 1'i rasgele tamsayıda birleştirerek [-16,4] aralığına izin verir.
Aralıklar özel olabilir, eksi bir artı (-16,6) veya (-17,5) olabilir.

Rastgele tamsayıların eşit bir şekilde dağıtılması gerekmez, hepsinin de mümkün olması gerekir.

Program her zaman 99 hata ile başlar.

"1 hata" nın gramer hatasını görmezden gelebilirsiniz.

Hata sayısı 0 veya negatif olduğunda program durmalı ve yazdırılmalıdır.

Koddaki 0 ​​hata

Hiçbir zaman negatif bir hata olmamalıdır. Sonu gibi görünmeli

Koddaki Y hataları

Koddaki Y hataları

Bir tane al ve yama yap

Koddaki 0 ​​hata

(boş çizgi)

Koddaki 0 ​​hata

Sondaki yeni satır kabul edilebilir.

  • Kodunuz tam bir program veya işlev olabilir.
  • Giriş yok.
  • Çıktı stdout veya iade edilmelidir.
  • Günlüklerde / STDERR'deki uyarılar / hatalar, STDOUT gerekli metne sahip olduğu sürece tamamdır. Daha fazla bilgi için buraya bakınız .

Bu kod-golf yani bayt cinsinden en kısa kod kazanır.

Örnek çıktı

Her seferinde -11 hata için ayarlanmış bin örnek çıkışını yapıştırın


1
Related: 1 2 (fark: bu zorlukta çıktı isteğe bağlı olarak uzun olabilir).
user202729

16
Rastgele sayının işareti çevrildiyse daha gerçekçi bir senaryo olur!
Stewie Griffin

9
Hayal kırıklığına uğradım, gereksinimlerin çökme, taşma, maksimum int ya da benzerleri gibi olumsuz bir sayı ile karşılaşıldığında programın bir hataya sahip olması gerektiğini içermemesi beni hayal kırıklığına uğrattı;).
allo

3
“Rasgele tamsayıların eşit bir şekilde dağıtılması gerekmiyor, hepsinin de mümkün olması gerekiyor.” xkcd.com/221
Ivo Beckers

2
Bu bir utanç 99 rasgele sayı üretimi yoktur.
Jonathan Allan

Yanıtlar:


18

R , 182 140 138 135 bayt

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="")

Çevrimiçi deneyin!

rastgele sayı üretiminde makul derecede iyi olmasına rağmen, R karakter dizileri ve baskıda korkunçtur. JayCe bir milyar bayt buldu ve bunu golf için yeni yollar bulmaya devam ediyor!


1
JayCe bütün bu baytları nerede buldu? Sadece oldu mu yoksa JayCe aktif olarak onları mı arıyordu?
Stewie Griffin



Is not +5sana başka 2 bayt mal? neden sadece sample(26,6))?
forestecolog

2
@ theforestecologist PPCG'ye Hoşgeldiniz! Soruyu daha yakından incelemenizi öneriyorum ... önünde eksi işareti varsample
JayCe

11

Java 8, 161 160 bayt

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;}

@JonathanAllan sayesinde -1 bayt .

Çevrimiçi deneyin.

Açıklama:

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

rHiçbir şey için kullanmadığın anlaşılıyor mu?
OOBalance

1
Kaldırma ,rhala çalışıyor gibi görünüyor: Çevrimiçi deneyin!
Kamil Drakari

@OOBalance Hata! Oraya neden ulaştığımdan emin değilim ..>.> Dikkatiniz için teşekkürler.
Kevin Cruijssen

1
i - = ... + 5 bir tane kaydeder (aralık [[-16 4] değil [-15,5] olması gerektiğini düşünüyorum)
Jonathan Allan

1
@OOBalance evet r kullanılmıyor, çünkü o java kullanıyor ;-)
Anand Rockzz

10

PowerShell , 137 135 133 131 bayt

$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"

Çevrimiçi deneyin!

"Koddaki hatalar" bölümü $bdaha sonra kullanılmak üzere kaydedilir . Kümeler $aiçin 99, bir girer forüzerinde döngü $a. Önce iki dizelerden oluşan bir dizi oluşturmak ," "*2dize olmak üzere "X bugs in the code".

Sonraki sadece dizedir "Take one down and patch it around". Ardından aralıktan $abir Randomtamsayı seçerek artırırız [-16,4]. Bundan sonra, $abir if kullanarak en az sıfır olacak şekilde kenetlenir if($a-lt0){$a=0}. Sonra dize "Y bugs in the code".

Son olarak, döngü bittikten sonra ipi "0 bugs in the code"boru hattına koyarız . Bu dizgilerin tümü boru hattından toplanır ve bir örtük Write-Outputbize aralarında ücretsiz yeni çizgiler verir.

forDöngü yerine bir döngü kullanarak iki bayt kaydedildi while. Kendi bölümüne
ilerleyerek iki bayt kurtardı $b.
Adrian Blackburn sayesinde iki bayt kurtarıldı.


$ A = (0, $ a) [$ a-gt0] yerine kullanabilirsiniz; birkaç bayt için If ($ a-lt0) {$ a = 0} ile
Adrian

@AdrianBlackburn Teşekkürler!
AdmBorkBork,

9

JavaScript (Node.js) , 127 bayt

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

Çevrimiçi deneyin!


Açıklama:

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

Özyineleme ve uygulama fikri için @tsh'e teşekkürler (bazı baytlar kaydedildi)

Bu golf için herhangi bir öneri bekliyoruz.



1
Neden 0+kaldırıldı Gerekli çıktı gibi görünüyor.
tsh

@ tsh: öyle mi? Ben o kısmı okumadım.
Muhammad Salman


6

Python 2 , 151 bayt

j=i+max(-i,randint(-16,4))Jo King'in güzel hilesi , istismarın eşit olmayan şekilde dağıtılmasını sağladı

Mnemonic sayesinde kaydedilmiş çift bayt

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

Çevrimiçi deneyin!


1
Kullanarak bir bayt kaydedebilirsiniz j=max(0,i+randint(-16,4)).
Anma

Ayrıca, 'böcek var kod'.
Anma

Wi-Fi'yi karşılaştırmak için 0 kullanılması tüm sayıları mümkün kılmaz. Hiçbir şey için teşekkürler '': D
Ölü Olasılık

Cevabımla aynı numara, 151 bayt
Jo King,

Yine de mümkün değil. 0'ın altına
Mnemonic

6

Kömür , 81 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

≔⁹⁹θ

Koddaki 99 hata ile başlayın.

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

Sıkıştırılmış dizeyi "% d bugs \ n" kodunda kaydedin.

W›θ⁰«

Kalan pozitif hata sayısı varken tekrarlayın.

ײ﹪ζθ

Koddaki hata sayısını iki kez yazdırın.

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

"Birini al ve yama at" yazdırın.

≧⁺⁻⁴‽²¹θ

-17 (özel) ve 4 (dahil) arasında rastgele sayıda hata ekleyin.

﹪ζ×θ›θ⁰

Kalan böcek sayısını veya negatifse 0 yazdırın.

Ayetler arasında boş bir satır bırakın.

»﹪ζ⁰

Son ayetten sonra tekrar kodda 0 hata yazdırın.


Bu son tekrarlanan "koddaki 0 ​​hata" mı ihtiyacınız var!
Sam Dean

1
@SamDean Üzgünüm, bunu gözardı ettim, düzeltildi.
Neil

6

JavaScript, 189 176 168 162 bayt

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

Çevrimiçi deneyin!

Eksik eksiklikten dolayı Muhammed Salman ve x testinin iyileştirilmesi console.logiçin Oliver için teşekkürler

Bu 8 baytlık golf için l4m2 için teşekkürler


Düğüm uzmanı değilim, ancak inanıyorum ki "Program, böcek sayısı 0 veya negatif olduğunda durmalıdır" x<=0?console.log("\n"+0+a):f(x), sonunda ihtiyacınız olduğu anlamına gelir .
Hayır,

1
Tamam üzgünüm. Bir şey daha: eğer isimsiz bir işlevde tekrarlamanız gerekiyorsa, açıkça isimlendirmeniz gerekir (+2 bytes)
NoOneIsHere

1
Bu son "console.log" "c" ile değiştirilemez mi?
Sam Dean

1
Ayrıca @ NoOneIsHere haklı. Bu fbildiriye ihtiyacın var . Bunu düzeltmek için güncellendi kadar oy verildi. (Ayrıca bağlantımın da güncellenmesi gerekiyor)
Muhammad Salman

2
Burada yapmaya çalıştığım nokta, fonksiyon çağrılmadığında ( fvarsayamayacağınız) kodunuzun işe yaramamasıdır.
Hayır,

6

Python 3 , 156 138 bayt

Jonathan's Python 2'ye teşekkür idnumarası için teşekkürler

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)

Çevrimiçi deneyin!

Açıklama:

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

5

Octave , 149 148 bayt

Değiştirerek bir bayt Kaydedilen randi(21)ve %ikarşı 21*randve %.f. %.fçıktının sıfır ondalık basamaklı bir şamandıra olmasını sağlar (yani tam sayı).

Okunabilirliği kolaylaştırmak için virgül ve noktalı virgül yerine bir grup satır sonu ekledi. Yanlış hissettiriyor, ama tek astardan daha uzun değil.

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)

Çevrimiçi deneyin!

Açıklama:

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.

Kullanmak p((x+=21*rand-17)*(x>0)yerine maxbir bayt kaydeder, ancak son satır -0 bugs ...yerine çıkar 0 bugs. İle çalışır randi(21)-17, ancak sonra yukarıdaki ile aynı uzunlukta. Çevrimiçi deneyin!


5

COBOL (GnuCOBOL), 317 294 279 270 bayt

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"

Çevrimiçi deneyin!

Ungolfed

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

Not: Son cümle hala basılmıştır, çünkü COBOL tüm programı yürütür ve perform untildöngüden sonra ifadesini uygulayarak a etiketini atar. Bu davranış switch caseolmadan benzer break.

Not: Sayılar tam olarak gerektiği gibi gösterilmiyor, ancak COBOL sayıları otomatik olarak metinleri göstermeye o kadar iyi değil.


1
Selam. PPCG'ye Hoşgeldiniz.
Muhammad Salman

4 eksi 4 olması gerektiğini düşünüyorum. (İ- (rand-4) == (i-rand + 4) 'a gittiğinizi tahmin ediyorum. Sayıların kaldırılması mı yoksa bu dilin bir özelliği mi? Ama altın dostu olmayan bir dille iyi iş çıkardın mı?
Sam Dean

1
@ SamDean Teşekkürler! Bu hatayı düzelttim. Hesaplanan gerçek rastlantının Kevin Cruijssen'in cevabından ilham aldığını itiraf etmeliyim . Ancak , tüm sağ işlenenin etrafındaki parantezi ima eden bir bileşik atama operatörü ( -=in i-=Math.random()*21-4) kullanır . Onları açık hale getirmeyi unuttum, ama şimdi düzeltildi, sanırım.
MC İmparatoru

@ MCEmperor şimdi bana iyi görünüyor!
Sam Dean

+4 kullanıp parantezleri kaydedemez misiniz?
raznagul

4

VBA: 212 163 Bayt

Bu çözüm, dün yayınlanan Chronocidal'ın çözümüne dayanıyor. Bu benim ilk gönderim ve gönderisine yorum yapacak kadar itibarım yok.

Bu revizyon iki geliştirme içeriyor.

  1. While/WendBunun yerine kullanmak For/Nextbirkaç karakter kaydeder.
  2. Tek bir karakterle adlandırılmış bir Sub çağrısı yapmaktan daha kısadır GoSubve onu desteklemek için Exit Subve Returnsatırları gerekir.

Düzenleme:
3. VBA editörünün otomatik olarak geri ekleyeceği kaldırılmış boşluk ve karakterler. VBA'da golf
oynamak için İpuçları bölümüne bakınız. Beyaz boşluk. vbLFÇıktı dizgisine bir anahtar değişikliği eklendi, bu yüzden Debug.Printsık sık çağrılmayacaktı. EricF’e şeref .


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

Bu eğlenceli bir mücadele oldu. VB6 / VBScript / VBA için TIO gibi bir çevrimiçi tercüman biliyorsanız, lütfen bir yorum bırakın.

Bu kodu sınamak ve Microsoft Excel, Word, Access veya Outlook'un yüklü olmasını istiyorsanız (yalnızca Windows), VBA IDE'yi açmak için Alt + F11 tuşlarına basın. Yeni bir kod modülü yerleştirin (Alt + I, M) ve silin Option Explicit. Sonra kodu yapıştırın ve çalıştırmak için F5 tuşuna basın. Sonuçlar Hemen Penceresinde görünmelidir (göremiyorsanız Ctrl + G tuşlarına basın).


4
Siteye Hoşgeldiniz!
Buğday Sihirbazı,

1
Dizeleri birleştirirseniz, bunu cyerine c>0koşulu c=Iif(c<0,0,c)yerine kullanın ve yerine kullanın If c<0 [...]: pastebin.com/nFGtGqdE
ErikF

4

LaTeX , 368 304 293 287 245 240 bayt

Bayt açısından diğer programlarla karşılaştırıldığında gerçekten rekabetçi olmasa da, LaTeX'te bunun nasıl yapıldığını görmek istedim.

\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}

Daha okunabilir:

\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}

İyileştirmeler (düzenleme başına):

  1. "koddaki x hata" artık 4 satır yerine bir fonksiyon
  2. Rewrote \ifiçin maddeyi \repeatbir şekilde\else
  3. Görünüşe göre \value{b}=xbaşlangıç ​​için çalışıyor ama döngüde değil (yerine \setcounter{b}{x})
  4. Görünüşe göre \relax3. nokta için kullanılmalıdır, ancak bu bir boşluk ekleyerek de elde edilebilir. Kaldırılan \elsebu daha kısa olarak yerine Latex'in, kullanılan tex'in komutları, yerine \'göre ~.
  5. Bazı kodların bir nedenden dolayı rahat olması gerekmedi.

1
PPCG'ye Hoşgeldiniz.
Muhammad Salman

PPCG'ye Hoşgeldiniz! Ben senin kod çalıştırmasına değil ama olmamalı \ifnum\value{b}<1yerine <0?
JayCe,

@JayCe: Gerçekten farketmez, b bir kez 0 olduğunda yine de döngüden kaçar. B 0 olduğunda diğer durumun gerçekten basılması daha az sezgisel olabilir, ancak etkili olduğunu düşünüyorum sanırım.
Simon Klaver,

@JayCe kodu kısalttı, şimdi artık önemli değil;)
Simon Klaver

4

C,  169  165 bayt

Dört bayt tasarrufu için @ceilingcat'e teşekkürler!

*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);}

Çevrimiçi deneyin!


3

SAS, 210 bayt

%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

Ungolfed:

%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

Günlüğüne uyarılar izin verilip verilmediğinden birkaç byte kaydedebilir miyim (koymak &aiçine &bmakro değişkenin, ama bu bir başlangıç uyarı oluşturur).


Diğer bazılarının uyarıları var, ben de izinle birlikte gideceğim.
Sam Dean


3

ABAP , 295 bayt

... çünkü neden olmasın!

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.

Kesinlikle diğer dillere göre daha rekabetçi değil, ancak başlangıçta yazdığım 330 byte'tan inceltmeyi bile başardım, bu yüzden kişisel bir kazanç olarak kabul ediyorum.

ABAP 255 karakterden uzun satırlara izin vermediğinden, bir satır sonuyla yer değiştirmek zorunda kaldım. Windows'ta bu başlangıçta CRLF nedeniyle boyutu 296 bayta çıkardı, ancak orada sadece LF ile iyi çalışıyor. ABAP elbette birçok alan gerektiriyor, bu yüzden bu önemli değil.

WRITE, GUI'ye metin atıyor, sanırım bu bir tür stdout gibi mi? Bir yapı veya tablo kullanarak muhtemelen burada bazı baytları kaydedebilirim, ancak SAP'nin karma yapıları (karakter ve sayı içeren) nasıl kullandığı nedeniyle, hayal ettiğim yaklaşım sadece Unicode olmayan sistemler üzerinde işe yarayacaktı. Her ikisine de erişebilse de, git.

Rasgele sayılar için işlev modülü, sistemimizde bulabildiğim tek sistemdir, sanırım daha kısa bir isim veya parametreli bir tane olabilir. Fikrim yok!

Aşağı yukarı okunabilir kod, yorumlar dahil:

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.

Mücadele için teşekkürler!
Patronuma: Lütfen beni kovma, sadece kendimi eğitiyorum!


3

Temiz , 245 234 bayt

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"

Çevrimiçi deneyin!


Başlangıçtaki ve sonundaki alıntıları kaldırma şansın var mı?
Sam Dean

1
@SamDean Oh, unuttuğum sadece bir derleyici seçeneği. Onu atacağım.
Büyük

3

C #, 184 181 bayt

İlk Kod Golf cevabım!

( @Kevin Cruijssen'in Java cevabı temel alınmıştır)

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;};

Çevrimiçi deneyin!


1
PPCG :) 'ye Hoş Geldiniz
Shaggy


2

T-SQL, 188 bayt

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, dize değişmezleri içinde döndürür, böylece yardımcı olur.

CONCAT()metne örtülü bir dönüştürme yapar, böylece CASTveya için endişelenmenize gerek kalmaz CONVERT.


2

JavaScript, 138 bayt

_=>(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)


2

QB64 , 134 bayt

Abimden.

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$

2

Pyth , 94 92 bayt

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

Çevrimiçi deneyin


Önceki sürüm: 94 bayt

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

2

Jöle , 61 bayt

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

Aynı zamanda tam bir program olarak çalışan bir niladik bağlantı.

Çevrimiçi deneyin! (yürütme tamamlandıktan sonra çıktı temizlendi, ancak paragrafa paragrafla yazdırıldı)

Nasıl?

;“,Ȥ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

2

Perl, 132 bayt

$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

2

VBA: 225 233 Bayt

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} Eksik eklendirnd()*

Notlar:
Kullanımlar GoSubbir değişkene limiti belirleyerek ve biraz daha kısa olduğu için, üçlenebilir çizgi yazdırmak için Debug.Printbunu ing.
Debug.PrintHerhangi bir argüman olmadan boş bir satır yazdırır (boş veya boş bir dizeye gerek yoktur) Bir WorksheetFunction.Maxsatır çok uzun olur, bu yüzden negatifleri önlemek için "eğer daha az" kullandım.

 

Girinti ve yorumlar

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

1
Bu rasgele sayılar yapmanın çok etkili bir yolu!
Sam Dean

@SamDean Oraya nasıl eklemeyi unuttuğumdan emin değilim rnd() * - Sanırım daha az karakter Dim c%Int()
içeriyorsa

Endişelenme haha! Yıllardır kullanmadığım bir VBA cevabını görmek güzel!
Sam Dean

2

Python 2 ,  138 134 133 131  127 bayt

-1 Jo King sayesinde ( bugs-=min(bugs,randomNumber)yerine mantığı kullanacak şekilde yeniden düzenleyin bugs=max(0,bugs-randomNumber)). Bu, bir 6- byte tasarruf ederek sıfır hatayla bölmeyi kullanarak zorla bırakmaya izin verdi !

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

Çevrimiçi deneyin!


Anladığım kadarıyla, hiçbir zaman tote yaratmaya ihtiyacım yok.
Jonathan Allan


@JoKing Teşekkürler! (Jelly
Jonathan Allan

2
@JoKing ... demek ki --two-- altı tane daha kazanmak için sıfır hatayla bölmeyle ayrılmaya zorlayacağımız anlamına gelir :)
Jonathan Allan

2

Yakut: 149 bayt

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

Hemen hemen her Ruby sürümünde çalışmalı> = 1.8

Dizeleri biraz daha optimize etmenin mümkün olabileceğini düşünüyorum, ancak genel olarak ondan oldukça memnunum - özellikle de combo Assort / compare / break ifadesi ve isteğe bağlı parantezlerin kötüye kullanılması.

Not: Çıktının teknik olarak iki izleyen yeni satırı vardır; Bu hesaba katılması gerekiyorsa, 4 karakter artar.


Merhaba ve PPCG'ye hoş geldiniz! İzleyen yeni satırları sayıyoruz, ancak Linux'ta çalışıyorsa sadece \n(hayır \r) sayısını sayabilirsiniz .
HayırOneIsHere

@NoOneIsHere Teşekkürler :) Açıklığa kavuşturmak için cevabımı güncelledim - Çıktıdaki yeni satırlara atıfta bulunuyordum, çünkü soru bir tanesinin kabul edilebilir olduğunu belirtir, ancak iki tanesinden emin değildim.
DaveMongoose

Anlıyorum. Bence bu iyi
HayırOneIsHere

2

Zsh , 133 bayt

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

Çevrimiçi deneyin!


Bu, birkaç zsh özelliğinden faydalanır.

  • Alternatif bir ilmek oluşturmak : while list; do list; doneşu şekilde yazılabilirwhile list {list}
  • Bir format belirteci printfsayısal ise, karşılık gelen bağımsız değişken bir aritmetik ifade olarak değerlendirilir. Yani:
    • nkullanmadan ücretsiz olarak değerini alıyoruz$
    • n -= RANDOM % 21 - 4, n = n > 0 ? n : 0Yine kullanımına gerek kalmadan değerlendirilir $((...)), $[...]veya benzer. >Ve ?kaçan gerekiyordu.
    • printf $bSonunda 0 olarak boş bir bağımsız değişken değerlendirir %d.
  • Parametre genişletme sırasında sözcük bölme varsayılan olarak kapalıdır, bu nedenle $bhiçbir yere alıntı yapmak zorunda değilim .
    • Bu benim $b$b"Take..."yerine yazmama izin veriyor "$b${b}Take...".

  • Bunun yerine \nve for((n=99;n;))yerine yeni satırları kullanarak birkaç bayt kaydedildi n=99;while ((n)).

Bence -4 olmalı. "- =" bileşiğine benziyor, böylece önce +4 yapıyor, sonra hepsini çıkarıyor.
Sam Dean

@ SamDean ayy, düzeltildi.
muru
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.