99 помилок у коді


47

99 помилок у коді

Адаптація "99 пляшок пива на стіні" для інформатики, де збільшуються помилки замість зменшення пляшок, часто розміщується в Інтернеті. Приклад футболки тут .

Я думаю, що буде цікаво побачити потенційну рекурсію та генерацію випадкових чисел на величезній кількості мов та знайти найефективніші способи це зробити.

Є 99 інших завдань, які стосуються 99 пляшок пива, але жодна кількість, схоже, не має зростаючої та меншої кількості!

Виклик

Ваша програма чи функція не повинні вводити, а потім друкувати

99 помилок у коді

99 помилок у коді

Зніміть один і заклейте його

X помилок у коді

(порожній рядок)

Де X - попереднє ціле число мінус 1 плюс випадкове ціле число в діапазоні [-15,5].
Ви можете об'єднати мінус 1 у випадкове ціле число, отже, дозволити діапазон [-16,4].
Діапазони можуть бути ексклюзивними, тому мінус один плюс (-16,6) або (-17,5).

Випадкові цілі числа не повинні бути розподілені рівномірно, вони просто мають бути можливими.

Програма завжди починається з 99 помилок.

Ви можете ігнорувати граматичну помилку "1 помилка".

Програма повинна зупинятися, коли кількість помилок дорівнює 0 або негативна, і друкувати

0 помилок у коді

Ніколи не повинно бути негативної кількості помилок. Закінчення має виглядати так

Y помилок у коді

Y помилок у коді

Зніміть один і заклейте його

0 помилок у коді

(порожній рядок)

0 помилок у коді

Прийнятний новий рядок є прийнятним.

  • Ваш код може бути повноцінною програмою або функцією.
  • Введення немає.
  • Вихід повинен бути stdout або повернутий.
  • Попередження / помилки в журналах / STDERR добре, якщо STDOUT має необхідний текст. Дивіться тут для отримання додаткової інформації.

Це код-гольф, тому найкоротший код у байтах виграє.

Приклад Вихід

Кожного разу вставте приклад прикладу для сміття для -11 помилок


1
Пов'язані: 1 2 (різниця: у цьому виклику вихід може бути довільно довгим).
користувач202729

16
Більш реалістичним буде сценарій, якби знак випадкового числа був перевернутий!
Стюі Гріффін

9
Я розчарований, що вимоги не включають, що програма повинна мати помилку, коли виникає негативне число, наприклад, збій, переповнення до max int або подібне;).
Алло

3
"Випадкові цілі числа не повинні бути розподілені рівномірно, вони просто мають бути можливими." нагадав мені xkcd.com/221
Іво Бекерс

2
Прикро, що 99 не має генерації випадкових чисел.
Джонатан Аллан

Відповіді:


18

R , 182 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 знайшов близько мільярда байт, і продовжує знаходити нові способи гольфу!


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

-1 байт завдяки @JonathanAllan .

Спробуйте в Інтернеті.

Пояснення:

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
я - = ... + 5 зберігає один (хоча я думаю, що діапазон повинен бути [-16 4], а не [-15,5])
Джонатан Аллан

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для подальшого використання. Набори $aдо 99, входить в forпетлю на $a. Спочатку ми створюємо масив з двох рядків ," "*2, при цьому рядок є the "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цикл замість whileциклу.
Збережено два байти, перемістившись $bна власний розділ.
Збережено два байти завдяки Адріану Блекберну.


Ви можете замінити $ a = (0, $ a) [$ a-gt0]; з If ($ a-lt0) {$ a = 0} на пару байтів
Адріан

@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: Це? Я не читав тієї частини.
Мухаммед Салман


6

Python 2 , 151 байт

Хороший трюк j=i+max(-i,randint(-16,4))Джо Кінга, експлуатація дозволила нерівномірно розподілитись

Збережені пари байтів завдяки 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

Спробуйте в Інтернеті!


1
Ви можете зберегти байт за допомогою j=max(0,i+randint(-16,4)).
Мнемонічний

Крім того , це "помилка в в коді.
Мнемонічний

Використовуючи 0 для порівняння, можна зробити не всі числа можливими. Дякуємо за те, що "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 помилок у коді \ n".

W›θ⁰«

Повторіть, поки залишилася позитивна кількість помилок.

ײ﹪ζθ

Роздрукуйте кількість помилок у коді двічі.

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

Роздрукуйте "Візьміть один і обклейте його навколо".

≧⁺⁻⁴‽²¹θ

Додайте випадкову кількість помилок між -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)}

Спробуйте в Інтернеті!

Дякуємо Мухаммаду Салману за відсутню console.logзаміну та Оліверу за покращення x тесту

Дякуємо l4m2 за те, що гольф на 8 байт


Я не фахівець з вузлів, але я вважаю, що "програма повинна зупинятися, коли кількість помилок дорівнює 0 або негативна" означає, що вам потрібно x<=0?console.log("\n"+0+a):f(x)в кінці.
NoOneIsHere

1
Добре вибач. І ще одне: якщо вам потрібно повторити анонімну функцію, вам потрібно її чітко назвати (+2 байти)
NoOneIsHere

1
чи не можна останнього "console.log" замінити на "c"?
Сем Дін

1
Також правильно @NoOneIsHere. Вам потрібна ця fдекларація. Проголосували до оновлення, щоб виправити це. (Також моє посилання теж потребує оновлення)
Мухаммад Салман

2
Я намагаюся зробити тут ваш код не працює, якщо функція не викликається f, що ви не можете припустити.
NoOneIsHere

6

Python 3 , 156 138 байт

Завдяки відповіді Джонатана 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до 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 , виконуючи її заяви. Така поведінка схожа на switch caseбез break.

PS: Цифри не відображаються точно так, як потрібно, але COBOL не дуже добре в автоматичному перетворенні чисел на досить текстове зображення.


1
Привіт. Ласкаво просимо до PPCG.
Мухаммед Салман

Я думаю, що мінус 4 повинен бути плюс 4. Я здогадуюсь, що ти пішов (i- (rand-4) == (i-rand + 4), але дужок немає, тому знак повинен змінюватися. з числа вилучити чи це особливість мови? Але приємна робота з не золотою мовою!
Сем Дін,

1
@SamDean Дякую! Я виправив цю помилку. Я маю визнати, що фактичний випадковий підрахунок був надихнутий на відповідь Кевіна Круїссена . Але він використовує оператор складеного призначення ( -=in i-=Math.random()*21-4), який передбачає дужки навколо всього операнда праворуч. Я забув зробити їх явними, але це зараз виправлено, я думаю.
MC Імператор

@MCEmperor мені зараз добре виглядає!
Сем Дін

Ви не можете використовувати +4 та зберігати дужки?
raznagul

4

VBA: 212 163 байт

Це рішення базується на тому, який Chronocidal розмістив учора. Це моє перше повідомлення, і я не маю достатньої репутації, щоб коментувати його повідомлення.

Ця редакція містить два вдосконалення.

  1. Використання While/Wendзамість цього For/Nextзберігає кілька символів.
  2. Виклик Sub, названого одним символом, коротший, GoSubа Exit Subта Returnлінії, необхідні для його підтримки.

Редагувати:
3. Видалено пробіли та символи, які редактор VBA автоматично додаватиме. Див. Поради щодо гольфу в VBA
4. Додав пропозиції від @EricF, потім побачив, що алгоритм його вставки для пасти був ще меншим, тому я замінив свій алгоритм на його та видалив пробіл. Ключова зміна додалася vbLFдо вихідного рядка, тому Debug.Printйого не потрібно було викликати так часто. Кудос до Еріка .


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

Це було веселим викликом. Якщо ви знаєте онлайн-перекладача, наприклад TIO для VB6 / VBScript / VBA, залиште коментар.

Якщо ви хочете перевірити цей код і встановити Microsoft Excel, Word, Access або Outlook (лише для Windows), натисніть Alt + F11, щоб відкрити ID VBA. Вставте новий модуль коду (Alt + I, M) та очистіть Option Explicit. Потім вставте код і натисніть F5, щоб запустити його. Результати повинні відображатися у вікні негайного натискання (натисніть Ctrl + G, якщо ви його не бачите).


4
Ласкаво просимо на сайт!
Пшеничний майстер

1
Ви можете зменшити його до 197 символів, якщо ви комбінуєте рядки, використовуйте cзамість них c>0як свій стан "Хоча" та використовуйте c=Iif(c<0,0,c)замість If c<0 [...]: pastebin.com/nFGtGqdE
ErikF

4

LaTeX , 368 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, використовувані команди TeX замість LaTeX, оскільки вони коротші та замінені \'на ~.
  5. Деякий код чомусь не потрібно було послаблювати.

1
Ласкаво просимо до PPCG.
Мухаммад Салман

Ласкаво просимо до PPCG! Я не запускати свій код , але вона не повинна бути , \ifnum\value{b}<1а не <0?
JayCe

@JayCe: Це насправді не має значення, коли b дорівнює 0, то все одно виходить із циклу. Це може бути менш інтуїтивно зрозумілим, що коли b є 0, справді друкується інший випадок, але я думаю, що різниці немає.
Саймон Клавер

@JayCe скоротив код, тепер це вже не має значення;)
Саймон Клавер

4

C,  169  165 байт

Дякуємо @ceilingcat за збереження чотирьох байтів!

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

Спробуйте в Інтернеті!


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 це спочатку збільшило розмір до 296 байт за рахунок CRLF, але воно працює нормально лише з LF. ABAP впевнений, що вимагає багато місця, тому це не є великим питанням.

WRITE просто скидає текст на графічний інтерфейс, так що я думаю, це схоже на stdout? Я, можливо, міг би зберегти тут деякі байти, використовуючи структуру або таблицю, але завдяки тому, як 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

Желе , 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

{EDIT} Додано відсутніrnd()*

Примітки:
Використовується GoSubдля друку трискладного рядка, тому що він трохи коротший, ніж присвоєння рядку змінній та Debug.Printїї введення .
Debug.Printбез жодних аргументів друкує порожній рядок (немає необхідності в Null або порожній рядок) WorksheetFunction.MaxРядок буде занадто довгим, тому я використовував "if less than", щоб запобігти негативу.

 

З відступом та коментарями

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

Python 2 ,  138 134 133 131  127 bytes

-1 Завдяки Джо Кінгу (переставляйте так, щоб використовувати логіку, 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

Рубін: 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

Має працювати майже в будь-якій версії Ruby> = 1.8

Я думаю, що можливо, можливо оптимізувати рядки трохи більше, але в цілому я дуже задоволений цим - зокрема комбо-заявою про призначення / порівняння / перерву та зловживанням додатковими дужками.

Примітка: технічно на виході є два останніх рядки; якщо це потрібно враховувати, то він збільшується на 4 символи.


Привіт, і ласкаво просимо до PPCG! Ми підраховуємо останні рядки, але якщо він працює на Linux, можна порахувати лише \n(ні \r).
NoOneIsHere

@NoOneIsHere Спасибі :) Я оновив свою відповідь, щоб уточнити - я мав на увазі нові рядки на виході, тому що в питанні вказано, що наявність одного є прийнятним, але я не був впевнений у двох.
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 ой, виправлено.
муру
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.