コードの99個のバグ


47

コードの99個のバグ

ボトルが減少する代わりにバグが増加するコンピューターサイエンス向けの「99本のビールボトル」をインターネットに再投稿することがよくあります。ここでは例のTシャツ

さまざまな言語で再帰や乱数が生成される可能性を確認し、最も効率的な方法を見つけることは興味深いと思います。

99本のビールを扱うには他にもいくつかの課題がありますが、その数は増えたり減ったりしているようには見えません!

チャレンジ

あなたのプログラムや関数は何も入力せずに印刷すべきです

コードの99個のバグ

コードの99個のバグ

片方を下ろしてパッチを当てる

コードのXバグ

(空行)

Xは、前の整数から1を引いたものに[-15,5]の範囲のランダムな整数を加えたものです。
マイナス1をランダムな整数にマージして、範囲[-16,4]を許可できます。
範囲は排他的であるため、マイナス1プラス(-16,6)または(-17,5)になります。

ランダムな整数は、均等に分散する必要はなく、すべて可能である必要があります。

プログラムは常に99個のバグで始まります。

「1個のバグ」の文法エラーは無視できます。

バグの数が0または負の場合、プログラムは停止し、印刷されます

コードに0個のバグ

負の数のバグがあってはなりません。エンディングは次のようになります

コードのYバグ

コードのYバグ

片方を下ろしてパッチを当てる

コードに0個のバグ

(空行)

コードに0個のバグ

末尾の改行は許容されます。

  • コードは、完全なプログラムまたは関数にすることができます。
  • 入力はありません。
  • 出力はstdoutまたは返される必要があります。
  • STDOUTに必要なテキストがある限り、logs / STDERRの警告/エラーは問題ありません。詳細はこちらをご覧ください。

これはコードゴルフなので、バイト単位の最短コードが勝ちです。

出力例

毎回-11のバグに対応したビンの出力例を貼り付けます


1
関連:1 2(違い:このチャレンジでは、出力は任意に長くなる可能性があります)。
user202729

16
より現実的なシナリオは、乱数の符号が反転した場合です!
スチューウィーグリフィン

9
クラッシュ、最大整数へのオーバーフローなどの負の数に遭遇すると、プログラムにバグがなければならないという要件が要件に含まれていないことに失望しています;)。
アロ

3
「ランダムな整数は、均等に分散する必要はなく、すべて可能である必要があります。」xkcd.com/221を
Ivo Beckers

2
残念なことに、99には乱数生成がありません。
ジョナサンアラン

回答:


18

R182の 140 138 135バイト

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

オンラインでお試しください!

乱数の生成にはかなり優れていますが、Rは文字列と印刷にはひどいです。 JayCeは約10億バイトを見つけ、これをゴルフする新しい方法を見つけ続けています!


1
JayCeはこれらすべてのバイトをどこで見つけましたか?それは単なる偶然でしたか、それともJayCeは積極的に彼らを探していましたか?
スチューイーグリフィン



+5コストがもう2バイト増えていませんか?どうしてsample(26,6))
森林生態学者

2
@theforestecologist PPCGへようこそ!質問をよく見ることをお勧めします...前にマイナス記号がありますsample
-JayCe

11

Java 8、161 160バイト

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のおかげで-1バイト。

オンラインでお試しください。

説明:

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

あなたはr何のために使っていないようですか?
OOBalance

1
削除,rはまだ機能しているようです
カミルドラカリ

@OOBalanceおっと..そこに着いた理由がわからない..>。>気づいてくれてありがとう。
ケビンクルーッセン

1
i-= ... + 5は1つを節約します(範囲は[-15,5]ではなく[-16 4]であると思いますが)
ジョナサンアラン

1
@OOBalanceはいrはjavaを使用しているため使用されません;-)
Anand Rockzz

10

PowerShellの137の 135 133 131バイト

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

オンラインでお試しください!

「コードのバグ」セクションは$b、後で使用するために保存されます。に設定$a99、でforループに入ります$a。まず、二つの文字列の配列を作成し," "*2た文字列があることで、"X bugs in the code"

次は文字列"Take one down and patch it around"です。次に、範囲から整数を$a選択して増分しRandomます[-16,4]。その後$a、ifを使用して最小ゼロになるようにクランプしますif($a-lt0){$a=0}。次に、文字列"Y bugs in the code"

最後に、ループが終了した後、文字列"0 bugs in the code"をパイプラインに配置します。これらの文字列はすべてパイプラインから収集され、暗黙的にWrite-Outputそれらの間の改行が無料で提供されます。

forループの代わりにループを使用して2バイトを保存しましたwhile独自のセクションに
移動$bして2バイトを保存しました。
Adrian Blackburnのおかげで2バイト節約されました。


$ a =(0、$ a)[$ a-gt0];を置き換えることができます。If($ a-lt0){$ a = 0}で数バイト
Adrian

@AdrianBlackburnありがとう!
AdmBorkBork

9

JavaScript(Node.js)、127バイト

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

オンラインでお試しください!


説明 :

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

再帰と実装のアイデアを提供してくれた@tshに感謝します(いくつかのバイトを節約しました)

これをさらにゴルフするための提案は大歓迎です。



1
なぜ0+削除されたのですか?必要な出力のようです。
tsh

@tsh:そうですか?私はその部分を読みませんでした。
ムハンマドサルマン


6

Python 2、151バイト

j=i+max(-i,randint(-16,4))ジョー・キングによる素晴らしいトリック、悪用は不均一な分布を可能にした

ニーモニックのおかげで数バイト節約

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

オンラインでお試しください!


1
を使用してバイトを保存できますj=max(0,i+randint(-16,4))
ニーモニック

また、それはバグだコード"。
ニーモニック

0を使用してwiilを比較すると、すべての数値が可能になるわけではありません。何もありがとう 'the':D
Dead Possum

私の答えと同じトリック、151バイト
ジョーキング

とにかく不可能です。0を下回ることはできません
ニーモニック

6

、81バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

≔⁹⁹θ

コードの99個のバグから始めます。

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

圧縮文字列「%d bugs in the code \ n」を保存します。

W›θ⁰«

正数のバグが残っている間に繰り返します。

ײ﹪ζθ

コード内のバグの数を2回印刷します。

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

「1つ下に置き、パッチを当てる」を印刷します。

≧⁺⁻⁴‽²¹θ

-17(排他的)から4(包括的)までのランダムな数のバグを追加します。

﹪ζ×θ›θ⁰

残っているバグの数、または負の場合は0を出力します。

詩の間に空白行を残します。

»﹪ζ⁰

最後の詩の後、再びコードに0個のバグを出力します。


最後に繰り返される「コード内のバグが0個」が必要です!
サムディーン

1
@SamDeanすみません、見落としていました、修正しました。
ニール

6

JavaScript、189 176 168 162バイト

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

オンラインでお試しください!

不足している交換についてはMuhammad Salman、xテストの改善についてはOliverに感謝します。console.log

8バイトずつゴルフをしてくれたl4m2に感謝します。


私はノードの専門家ではありませんが、「バグの数が0または負の数になるとプログラムは停止するはずです」ということx<=0?console.log("\n"+0+a):f(x)は、最後に必要になるということです。
-NoOneIsHere

1
すみません。もう1つ:無名関数で再帰する必要がある場合は、明示的に名前を付ける必要があります(+2バイト)
NoOneIsHere

1
最後の「console.log」を「c」に置き換えることはできませんか?
サムディーン

1
@NoOneIsHereも正しい。そのf宣言が必要です。それを修正するために更新されるまで投票しました。(また、私のリンクも更新が必要です)
ムハンマドサルマン

2
ここで作成しようとしているのは、関数が呼び出されないとコードが機能しないというfことです。これは想定できません。
-NoOneIsHere

6

Python 3156 138バイト

JonathanのPython 2の回答に感謝しますidトリック

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)

オンラインでお試しください!

説明:

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

オクターブ 149 148バイト

randi(21)%iを変更して1バイトを保存21*randしました%.f%.f出力が小数ゼロの浮動小数点数(つまり整数)であることを確認します。

読みやすくするために、コンマやセミコロンの代わりに一連の改行を挿入しました。それは間違っているように感じますが、ワンライナーよりも長くはありません。

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)

オンラインでお試しください!

説明:

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.

p((x+=21*rand-17)*(x>0)代わりにmaxを使用するとバイトが節約されますが、最後の行はの-0 bugs ...代わりに出力されます0 bugs。で動作しますがrandi(21)-17、上記の長さと同じです。オンラインでお試しください!


5

COBOL(GnuCOBOL)、317 294 279 270バイト

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"

オンラインでお試しください!

非ゴルフ

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

注:COBOLはプログラム全体を実行し、perform untilループの後、文aを実行してラベルaを「フォールスルー」するため、最後の文が引き続き出力されます。この動作は、switch casewithoutに似ていbreakます。

PS:数字は必要に応じて正確に表示されませんが、COBOLは数字をきれいなテキスト表現に自動変換するのにはあまり適していません。


1
こんにちは。PPCGへようこそ。
ムハンマドサルマン

マイナス4はプラス4であると思うの数字を削除するか、それがその言語の特徴ですか?しかし、非ゴールドフレンドリーな言語で素晴らしい仕事!
サムディーン

1
@SamDeanありがとう!私はその間違いを修正しました。実際にランダムに計算されたものは、ケビンクルーッセンの答えからインスピレーションを得たことを認めました。しかし、彼は複合代入演算子(-=in i-=Math.random()*21-4)を使用しています。これは、右側のオペランド全体を括弧で囲んでいます。それらを明示的にするのを忘れていましたが、今では修正されていると思います。
MC皇帝

@MCEmperorは今、私には良さそうです!
サムディーン

+4を使用してブラケットを保存できませんか?
raznagul

4

VBA:212 163バイト

このソリューションは、昨日投稿されたChronocidalのソリューションに基づいています。これは私の最初の投稿であり、彼の投稿にコメントするほどの評判はありません。

このリビジョンには2つの機能強化が含まれています。

  1. 使用するWhile/Wend代わりに、For/Nextを、数文字節約されます。
  2. 単一文字で名前のサブを呼び出すと、より短くなるGoSubExit SubReturnそれをサポートするのに必要なライン。

編集:
3. VBAエディターが自動的に追加する空白と文字を削除し ました。VBA4. でのゴルフのヒントを参照してください。
空白。キーの変更はvbLF出力文字列に追加されていたのでDebug.Print、頻繁に呼び出す必要はありませんでした。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

これは楽しいチャレンジでした。VB6 / VBScript / VBAのTIOのようなオンラインインタープリターを知っている場合は、コメントを残してください。

このコードをテストし、Microsoft Excel、Word、Access、またはOutlookをインストールする場合(Windowsのみ)、Alt + F11を押してVBA IDEを開きます。新しいコードモジュール(Alt + I、M)を挿入し、クリアしOption Explicitます。次に、コードを貼り付け、F5キーを押して実行します。結果がイミディエイトウィンドウに表示されます(表示されていない場合はCtrl + Gを押します)。


4
サイトへようこそ!
小麦ウィザード

1
あなたは、文字列を組み合わせて使用する場合は、197個の文字にそれを得ることができるc代わりにc>0、あなたのwhile条件として、及び使用c=Iif(c<0,0,c)の代わりにIf c<0 [...]pastebin.com/nFGtGqdE
ErikF

4

LaTeX368 304 293 287 245 240バイト

バイトの点で他のプログラムと比較して実際には競争力はありませんが、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}

より読みやすい:

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

改善点(編集ごと):

  1. 「コードのx個のバグ」が4行ではなく関数になりました
  2. \if節を書き直した\repeatとして\else
  3. どうやら \value{b}=x初期化のために動作しますが、ループ内ではありません(代わりに\setcounter{b}{x}
  4. どうやら\relax、ポイント3に使用する必要がありますが、スペースを挿入することでも実現できます。を削除し\else、LaTeXの代わりにTeXコマンドを使用しまし\'~。これらは短いため、に置き換えられました。
  5. 一部のコードは、何らかの理由でリラックスする必要がありませんでした。

1
PPCGへようこそ。
ムハンマドサルマン

PPCGへようこそ!私はあなたのコードを実行していませんが、そう\ifnum\value{b}<1ではあり<0ませんか?
JayCe

@JayCe:本当に問題ではありません。bが0になると、とにかくループをエスケープします。bが0の場合、elseケースが実際に出力されることはあまり直感的ではないかもしれませんが、事実上、違いはないと思います。
サイモンクラバー

@JayCeはコードを短縮しましたが、今では問題ではありません;)
サイモンクラバー


3

SAS、210バイト

%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

ゴルフをしていない:

%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

ログに警告が許可されている場合は、いくつかのバイトを保存することができます(置き&a&bマクロ変数が、それは、最初の警告を生成します)。


他のいくつかは警告がありますので、許可されたまま進みます。
サムディーン


3

ABAP、295バイト

...なぜそうではないのか!

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.

確かに他の言語に比べて競争力はありませんが、最初に書いた330バイトからスリム化することさえできたので、個人的な勝利としてカウントします。

ABAPでは255文字を超える行を許可しないため、スペースを改行に置き換える必要がありました。Windowsでは、CRLFにより最初はサイズが296バイトに増加しましたが、LFのみで問題なく動作します。ABAPは確かに多くのスペースを必要とするため、これは大した問題ではありません。

WRITEは単にテキストをGUIにダンプするだけなので、それは標準出力に似ていると思いますか?おそらく構造またはテーブルを使用することでここでいくつかのバイトを節約できますが、SAPが混合構造(文字と数字を含む)を処理する方法のため、私が想像したアプローチは非Unicodeシステムでのみ機能します...両方にアクセスできるにもかかわらず、行きます。

乱数用の汎用モジュールは、私たちのシステムで見つけることができる唯一のものです。短い名前またはパラメーターを持つものがあると思います。わからない!

多かれ少なかれ読みやすいコード、コメントが含まれています:

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.

挑戦してくれてありがとう!
私の上司に:私を解雇しないでください、私はただ自分自身を教育しています!


3

クリーン245 234バイト

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"

オンラインでお試しください!


最初と最後に引用符を削除できる可能性はありますか?
サムディーン

1
@SamDeanああ、それは私が忘れてしまったコンパイラオプションです。私はそれを投げます
。–



2

T-SQL、188バイト

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では文字列リテラル内での戻りが許可されているため、これが役立ちます。

CONCAT()は暗黙的にテキストに変換されるため、CASTまたはを心配する必要はありませんCONVERT


2

JavaScript、138バイト

_=>(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バイト

兄から。

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

Pyth94 92バイト

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

オンラインで試す


以前のバージョン:94バイト

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

ゼリー、61 バイト

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

完全なプログラムとしても機能するニラディックリンク。

オンラインでお試しください!(実行が完了すると出力はフラッシュされますが、段落ごとに出力されます)

どうやって?

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

$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バイト

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

{編集} 不足しているものを追加しましたrnd()*

注: 3行を印刷するために
使用GoSubします。これは、行を変数に割り当ててDebug.Printingするよりも少し短いためです。
Debug.Print引数を指定しないと、空行が出力されます(Nullまたは空の文字列は不要です)WorksheetFunction.Max

 

インデントとコメント付き

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
これは、乱数を実行する非常に効率的な方法です!
サムディーン

@SamDean rnd() * そこに含めるのを忘れた-少ない文字Dim c%(つまり、「cは整数」)である場合、集計するのに忙しかったと思う Int()
-Chronocidal

ハハ心配なし!私は何年も使っていないので、VBAの回答を見てうれしいです!
サムディーン

2

パイソン2 138の134 133 131  127バイト

-1 Jo Kingに感謝します(ロジックbugs-=min(bugs,randomNumber)ではなくを使用するように再配置しますbugs=max(0,bugs-randomNumber))。これにより、ゼロによる除算エラーを使用した強制終了が可能になり、さらに6バイトが!

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

オンラインでお試しください!


タプルを作成する必要はまったくありません。
ジョナサンアラン


@JoKingありがとう!(ゼリーの答えで私がやっていることに近いので、私は本当にそれを見つけたはずです。)
ジョナサンアラン

2
@JoKing ...つまり、ゼロによる除算エラーで強制的に終了して、2つから6つを節約できることを意味します。)
ジョナサンアラン

2

Ruby:149バイト

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

1.8以上のRubyのほとんどすべてのバージョンで動作するはずです

文字列をもう少し最適化することも可能かもしれませんが、一般的にはかなり満足しています。特に、コンボの割り当て/比較/ブレークステートメントとオプションの括弧の乱用です。

注:出力には技術的に2つの末尾の改行があります。それを説明する必要がある場合は、4文字上がります。


こんにちは、PPCGへようこそ!末尾の改行もカウントしますが、Linuxで動作する場合は、カウントすることしかでき\nません(いいえ\r)。
-NoOneIsHere

@NoOneIsHereありがとう:)答えを更新して明確にしました-質問では1つでも問題ないことを示しているので、出力の改行に言及していましたが、2つについてはわかりませんでした。
DaveMongoose

そうですか。大丈夫だと思う
-NoOneIsHere

2

Zsh、133バイト

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

オンラインでお試しください!


これは、いくつかのzsh機能を利用します。

  • 代替ループ状while list; do list; doneのように記述することができますwhile list {list}
  • の書式指定子printfが数値の場合、対応する引数は算術式として評価されます。そう:
    • n使用せずに無料で値を取得します$
    • n -= RANDOM % 21 - 4, n = n > 0 ? n : 0 使用せずに再び評価されます $((...))$[...]または類似。の>?エスケープする必要がありました。
    • printf $b終わりのための0と空の引数を評価%d
  • パラメータ展開での単語分割はデフォルトでオフになっているため、引用する必要はありません $bどこにも。
    • これにより、の$b$b"Take..."代わりに書くことができます"$b${b}Take..."

  • \nおよびのfor((n=99;n;))代わりに実際の改行を使用して、数バイトを節約しましたn=99;while ((n))

-4にすべきだと思います。「-=」はその化合物のように見えるため、最初に+4を実行してから、すべてを減算します。
サムディーン

@SamDeanおっと、修正しました。
ムル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.