99 ошибок в коде

47

99 ошибок в коде

Адаптация «99 бутылок пива на стене» для информатики, где количество ошибок увеличивается вместо количества бутылок, часто публикуется в Интернете. Пример футболки здесь .

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

Есть несколько других проблем, связанных с 99 бутылками пива, но, похоже, ни у кого нет увеличивающегося и уменьшающегося количества!

Вызов

Ваша программа или функция не должны вводить данные и затем печатать

99 ошибок в коде

99 ошибок в коде

Сними один и залей его

Х ошибок в коде

(пустая строка)

Где X - предыдущее целое число минус 1 плюс случайное целое число в диапазоне [-15,5].
Вы можете объединить минус 1 в случайное целое число, следовательно, допустимый диапазон [-16,4].
Диапазоны могут быть исключительными, поэтому минус один плюс (-16,6) или (-17,5).

Случайные целые числа не должны быть равномерно распределены, они просто должны быть возможными.

Программа всегда начинается с 99 ошибок.

Вы можете игнорировать грамматическую ошибку «1 ошибка».

Программа должна остановиться, когда число ошибок равно 0 или отрицательно, и распечатать

0 ошибок в коде

Там никогда не должно быть отрицательного количества ошибок. Концовка должна выглядеть так

Y ошибок в коде

Y ошибок в коде

Сними один и залей его

0 ошибок в коде

(пустая строка)

0 ошибок в коде

Завершающая новая строка приемлема.

  • Ваш код может быть полной программой или функцией.
  • Там нет ввода.
  • Вывод должен быть в стандартный вывод или возвращен.
  • Предупреждения / ошибки в журналах / STDERR в порядке, пока STDOUT имеет требуемый текст. Смотрите здесь для получения дополнительной информации.

Это код-гольф, поэтому выигрывает самый короткий код в байтах.

Пример вывода

Пример вставки бина выводит каждый раз на -11 ошибок

Сэм Дин
источник
1
Связано: 1 2 (разница: в этом вызове результат может быть произвольно длинным).
user202729
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 нашел около миллиарда байтов и продолжает искать новые способы игры в гольф!

Giuseppe
источник
1
Где JayCe нашел все эти байты? Это просто случайность или JayCe активно их ищет?
Стьюи Гриффин
Разве это не +5стоит вам еще 2 байта? почему не просто sample(26,6))?
февраля 18:15
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, причем строка является "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в свой собственный раздел.
Сохранено два байта благодаря Адриану Блэкберну.

AdmBorkBork
источник
Вы можете заменить $ 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+удален? Вроде нужен выходной.
1818 года
@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 для сравнения сделает возможным не все числа. Спасибо, что ни за что: D
Мертвый Опоссум
Тот же трюк, что и мой ответ, 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

КОБОЛ (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"

Попробуйте онлайн!

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

Примечание: последнее предложение по-прежнему печатается, потому что COBOL выполняет всю программу, а после perform untilцикла «проваливает» метку a , выполняя свои операторы. Это поведение похоже на switch caseбез break.

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

MC Emperor
источник
1
Здравствуй. Добро пожаловать в PPCG.
Мухаммед Салман
Я думаю, что минус 4 должно быть плюс 4. Я предполагаю, что вы пошли на (i- (rand-4) == (i-rand + 4). Но скобок нет, поэтому знак нужно менять. Также знаки могут из чисел убрать или это особенность языка? Но хорошая работа с языком, не дружественным к золоту!
Сэм Дин,
1
@ SamDean Спасибо! Я исправил эту ошибку. Я должен признать, что фактически вычисленная случайная величина была вдохновлена ответом Кевина Круйссена . Но он использует составной оператор присваивания ( -=in i-=Math.random()*21-4), который подразумевает круглые скобки вокруг всего правого операнда. Я забыл сделать их явными, но теперь я думаю, что это исправлено.
MC Emperor
@MCEmperor выглядит хорошо для меня сейчас!
Сэм Дин
Разве вы не можете использовать +4 и сохранить скобки?
Разнагул
4

VBA: 212 163 байта

Это решение основано на вчерашнем Chronocidal. Это мой первый пост, и у меня недостаточно репутации, чтобы комментировать его пост.

Эта редакция содержит два улучшения.

  1. Использование While/Wendвместо For/Nextсохранения нескольких символов.
  2. Вызов Sub с именем , один символ короче GoSubи Exit Subи Returnлинии , необходимые для ее поддержки.

Редактировать:
3. Удалены пробелы и символы, которые редактор VBA автоматически добавит обратно. См. Советы по игре в гольф в VBA
4. Добавил предложения от @EricF, затем увидел, что его алгоритм вставки в корзину был еще меньше, поэтому я заменил свой алгоритм на его и удалил пробельные. Изменение ключа добавлялось 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

Это было забавное испытание. Если вам известен такой онлайн-переводчик, как TIO для VB6 / VBScript / VBA, пожалуйста, оставьте комментарий.

Если вы хотите протестировать этот код и установить Microsoft Excel, Word, Access или Outlook (только для Windows), нажмите Alt + F11, чтобы открыть IDE VBA. Вставьте новый модуль кода (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

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

Попробуйте онлайн!

Steadybox
источник
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

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

Может сохранить несколько байтов, если предупреждения в журнале разрешены (поместите их &aв &bпеременную макроса, но при этом появится первоначальное предупреждение).

Джо
источник
У некоторых других есть предупреждения, так что я пойду с ними, они разрешены.
Сэм Дин
3

PHP, 126 байт

Запустите в командной строке, используя 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
";
PleaseStand
источник
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 просто выводит текстовый графический интерфейс, так что я думаю, что это похоже на стандартный вывод? Я мог бы, вероятно, сохранить некоторые байты здесь, используя структуру или таблицу, но из-за того, как SAP обрабатывает смешанные структуры (содержащие символы и числа), подход, который я себе представлял, будет работать только в системах, не поддерживающих Юникод ... Что я лично считаю не идти, несмотря на наличие доступа к обоим.

Функциональный модуль для случайных чисел - единственный, который я мог найти в нашей системе, я полагаю, что это может быть модуль с более коротким именем или параметрами. Без понятия!

Более или менее читаемый код, комментарии включены:

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"

Попробуйте онлайн!

Οurous
источник
Есть ли шанс, что вы можете удалить цитаты в начале и в конце?
Сэм Дин
1
@ SamDean О, это просто опция компилятора, о которой я забыл. Я брошу , что в.
Οurous
3

C #, 184 181 байт

Мой первый ответ Code Golf!

(На основе ответа Java от @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;};

Попробуйте онлайн!

Бен Нобл
источник
1
Добро пожаловать в PPCG :)
Shaggy
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.

BradC
источник
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)

darrylyeo
источник
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$
ErikF
источник
2

Pyth , 94 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
Sok
источник
2

Желе , 61 байт

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

Niladic ссылка, которая также работает как полная программа.

Попробуйте онлайн! (вывод сбрасывается после завершения выполнения, но он печатает абзац за абзацем)

Как?

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

Примечания:
Используется GoSubдля печати тройной строки, потому что она немного короче, чем назначение строки переменной и Debug.Printее добавление .
Debug.Printбез аргументов печатает пустую строку (без нуля или пустой строки). 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
Chronocidal
источник
1
Это очень эффективный способ делать случайные числа!
Сэм Дин
@SamDean Не уверен, как я забыл включить rnd() * туда - я думаю, что я был занят подсчетом, если было меньше символов Dim c%(то есть "c - целое число") и сбросилInt()
Chronocidal
ха-ха, не беспокойся! Приятно видеть ответ VBA, поскольку я не использовал его в течение многих лет!
Сэм Дин
2

Python 2 ,  138 134 133 131  127 байт

-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

Попробуйте онлайн!

Джонатан Аллан
источник
Оказывается, мне вообще не нужно создавать кортежи.
Джонатан Аллан
133 байта
Джо Кинг
@ 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 символа.

DaveMongoose
источник
Здравствуйте и добро пожаловать в 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 ой, исправлено.
Муру