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 имеет требуемый текст. Смотрите здесь для получения дополнительной информации.
Это код-гольф, поэтому выигрывает самый короткий код в байтах.
Ответы:
R ,
182140138135 байтПопробуйте онлайн!
будучи достаточно хорошим в генерации случайных чисел, R ужасен в строках и печати.JayCe нашел около миллиарда байтов и продолжает искать новые способы игры в гольф!источник
+5
стоит вам еще 2 байта? почему не простоsample(26,6))
?sample
Java 8,
161160 байт-1 байт благодаря @JonathanAllan .
Попробуйте онлайн.
Объяснение:
источник
r
ни для чего?,r
кажется, все еще работает: попробуйте онлайн!PowerShell ,
137135133131 байтПопробуйте онлайн!
Раздел «Ошибки в коде» сохраняется
$b
для последующего использования. Устанавливает$a
в99
, входит вfor
цикл$a
. Сначала мы создаем массив из двух строк," "*2
, причем строка является"X bugs in the code"
.Далее просто строка
"Take one down and patch it around"
. Затем мы увеличиваем$a
, выбираяRandom
целое число из диапазона[-16,4]
. После этого мы фиксируем$a
минимальный ноль, используя ifif($a-lt0){$a=0}
. Тогда строка"Y bugs in the code"
.Наконец, после завершения цикла мы помещаем строку
"0 bugs in the code"
в конвейер. Все эти строки собираются из конвейера, и неявноеWrite-Output
дает нам новые строки между ними бесплатно.Сохранено два байта с использованием
for
цикла вместоwhile
цикла.Сохранены два байта, перемещаясь
$b
в свой собственный раздел.Сохранено два байта благодаря Адриану Блэкберну.
источник
JavaScript (Node.js) , 127 байт
Попробуйте онлайн!
Пояснение:
Спасибо @tsh за идею рекурсии и реализации (сэкономлено несколько байтов)
Любые предложения по гольфу в дальнейшем приветствуются.
источник
0+
удален? Вроде нужен выходной.05AB1E , 59 байт
Попробуйте онлайн!
источник
Python 2 , 151 байт
Хороший трюк
j=i+max(-i,randint(-16,4))
Джо Кинга, использование которого допускает неравномерное распределениеСохранено пару байтов благодаря Mnemonic
Попробуйте онлайн!
источник
j=max(0,i+randint(-16,4))
.Древесный уголь , 81 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Начните с 99 ошибок в коде.
Сохраните сжатую строку «% d ошибок в коде \ n».
Повторите, пока остается положительное количество ошибок.
Выведите количество ошибок в коде дважды.
Выведите на печать «Снять один и залатать его вокруг».
Добавьте случайное количество ошибок в диапазоне от -17 (эксклюзив) до 4 (включительно).
Выведите количество оставшихся ошибок или 0, если отрицательно.
Оставьте пустую строку между стихами.
После последнего стиха снова выведите 0 ошибок в коде.
источник
JavaScript,
189176168162 байтаПопробуйте онлайн!
Спасибо Мухаммеду Салману за недостающую
console.log
замену и Оливеру за улучшение теста xСпасибо за l4m2 для игры в гольф на 8 байтов
источник
x<=0?console.log("\n"+0+a):f(x)
в конце.f
заявление. Отклонено до обновления, чтобы исправить это. (Моя ссылка тоже нуждается в обновлении)f
, чего вы не можете предположить.Python 3 ,
156138 байтБлагодаря Python 2 ответа Джонатана для
id
трюкаПопробуйте онлайн!
Объяснение:
источник
Октава ,
149148 байтСохранение одного байта путем изменения
randi(21)
и%i
на21*rand
и%.f
.%.f
обеспечивает вывод с плавающей точкой с нулевыми десятичными знаками (т. е. и целое число).Введено несколько разрывов строк вместо запятых и точек с запятой для удобства чтения. Это неправильно, но это не длиннее, чем в одной строке.
Попробуйте онлайн!
Объяснение:
Использование
p((x+=21*rand-17)*(x>0)
вместоmax
сохраняет байт, но выводит последняя строка-0 bugs ...
вместо0 bugs
. Это работает сrandi(21)-17
, но тогда это - та же самая длина как та выше. Попробуйте онлайн!источник
КОБОЛ (GnuCOBOL),
317294279270 байтовПопробуйте онлайн!
Ungolfed
Примечание: последнее предложение по-прежнему печатается, потому что COBOL выполняет всю программу, а после
perform until
цикла «проваливает» метку a , выполняя свои операторы. Это поведение похоже наswitch case
безbreak
.PS: числа отображаются не совсем так, как требуется, но COBOL не так хорош в автоматическом преобразовании чисел в довольно текстовое представление.
источник
-=
ini-=Math.random()*21-4
), который подразумевает круглые скобки вокруг всего правого операнда. Я забыл сделать их явными, но теперь я думаю, что это исправлено.VBA:
212163 байтаЭто решение основано на вчерашнем Chronocidal. Это мой первый пост, и у меня недостаточно репутации, чтобы комментировать его пост.
Эта редакция содержит два улучшения.
While/Wend
вместоFor/Next
сохранения нескольких символов.GoSub
иExit Sub
иReturn
линии , необходимые для ее поддержки.Редактировать:
3. Удалены пробелы и символы, которые редактор VBA автоматически добавит обратно. См. Советы по игре в гольф в VBA
4. Добавил предложения от @EricF, затем увидел, что его алгоритм вставки в корзину был еще меньше, поэтому я заменил свой алгоритм на его и удалил пробельные. Изменение ключа добавлялось
vbLF
к выходной строке, поэтомуDebug.Print
не нужно вызывать его так часто. Престижность EricF .Это было забавное испытание. Если вам известен такой онлайн-переводчик, как TIO для VB6 / VBScript / VBA, пожалуйста, оставьте комментарий.
Если вы хотите протестировать этот код и установить Microsoft Excel, Word, Access или Outlook (только для Windows), нажмите Alt + F11, чтобы открыть IDE VBA. Вставьте новый модуль кода (Alt + I, M) и очистите
Option Explicit
. Затем вставьте код и нажмите F5, чтобы запустить его. Результаты должны появиться в «Немедленном окне» (нажмите Ctrl + G, если вы его не видите).источник
c
вместо того , чтобы использовать вc>0
качестве условия while, и используетеc=Iif(c<0,0,c)
вместоIf c<0 [...]
: pastebin.com/nFGtGqdELaTeX ,
368304293287245240 байтНесмотря на то, что они не очень конкурентоспособны по сравнению с другими программами с точки зрения байтов, я просто хотел посмотреть, как это сделать в LaTeX.
Более читабельно:
Улучшения (за редактирование):
\if
пункт для\repeat
как\else
\value{b}=x
работает для инициализации, но не в цикле (вместо\setcounter{b}{x}
)\relax
следует использовать для пункта 3, но это также может быть достигнуто путем вставки пробела. Удалены\else
, используются команды TeX вместо LaTeX, так как они короче, и заменены\'
на~
.источник
\ifnum\value{b}<1
чем<0
?C
169165 байтовСпасибо @ceilingcat за сохранение четырех байтов!
Попробуйте онлайн!
источник
SAS, 210 байт
Ungolfed:
Может сохранить несколько байтов, если предупреждения в журнале разрешены (поместите их
&a
в&b
переменную макроса, но при этом появится первоначальное предупреждение).источник
PHP, 126 байт
Запустите в командной строке, используя
php -r 'code here'
:источник
ABAP , 295 байт
... потому что, черт возьми, нет!
Это, конечно, неконкурентоспособно по сравнению с другими языками, но мне даже удалось уменьшить его с 330 байтов, которые я написал изначально, поэтому я считаю это личной победой.
Поскольку ABAP не допускает строки длиннее 255 символов, мне пришлось заменить пробел на разрыв строки. В Windows это первоначально увеличило размер до 296 байт из-за CRLF, но он работает нормально только с LF. ABAP, конечно, требует много пробелов, так что это не страшно.
WRITE просто выводит текстовый графический интерфейс, так что я думаю, что это похоже на стандартный вывод? Я мог бы, вероятно, сохранить некоторые байты здесь, используя структуру или таблицу, но из-за того, как SAP обрабатывает смешанные структуры (содержащие символы и числа), подход, который я себе представлял, будет работать только в системах, не поддерживающих Юникод ... Что я лично считаю не идти, несмотря на наличие доступа к обоим.
Функциональный модуль для случайных чисел - единственный, который я мог найти в нашей системе, я полагаю, что это может быть модуль с более коротким именем или параметрами. Без понятия!
Более или менее читаемый код, комментарии включены:
Спасибо за вызов!
Моему боссу: Пожалуйста, не увольняйте меня, я просто учусь!
источник
Чисто ,
245234 байтаПопробуйте онлайн!
источник
C #,
184181 байтМой первый ответ Code Golf!
(На основе ответа Java от @Kevin Cruijssen)
Попробуйте онлайн!
источник
C (gcc) ,
141137 байтЯ использовал макросы препроцессора для большой справедливости (предупреждение: TV Tropes)
Попробуйте онлайн!
источник
T-SQL, 188 байт
SQL допускает возврат внутри строковых литералов, так что это помогает.
CONCAT()
делает неявное преобразование в текст, поэтому мне не нужно беспокоиться оCAST
илиCONVERT
.источник
JavaScript, 138 байт
Показать фрагмент кода
источник
QB64 , 134 байта
От моего брата.
источник
Pyth ,
9492 байтаПопробуйте онлайн
Предыдущая версия: 94 байта
источник
Желе , 61 байт
Niladic ссылка, которая также работает как полная программа.
Попробуйте онлайн! (вывод сбрасывается после завершения выполнения, но он печатает абзац за абзацем)
Как?
источник
Perl, 132 байта
источник
VBA:
225233 байта{РЕДАКТИРОВАТЬ} Добавлено недостающее
rnd()*
Примечания:
Используется
GoSub
для печати тройной строки, потому что она немного короче, чем назначение строки переменной иDebug.Print
ее добавление .Debug.Print
без аргументов печатает пустую строку (без нуля или пустой строки).WorksheetFunction.Max
Строка будет слишком длинной, поэтому я использовал «если меньше, чем», чтобы предотвратить негативы.С отступом и комментариями
источник
rnd() *
туда - я думаю, что я был занят подсчетом, если было меньше символовDim c%
(то есть "c - целое число") и сбросилInt()
Python 2 ,
138 134 133 131127 байт-1 Спасибо Джо Кингу (переставить так, чтобы использовать логику,
bugs-=min(bugs,randomNumber)
а неbugs=max(0,bugs-randomNumber)
). Это позволило принудительно завершить использование ошибки деления на ноль, сохранив еще 6 байтов!Попробуйте онлайн!
источник
Рубин: 149 байт
Должно работать практически в любой версии Ruby> = 1.8
Я думаю, что можно было бы оптимизировать строки немного больше, но в целом я очень доволен этим - в частности, комбо-оператором присваивания / сравнения / разбиения и злоупотребления необязательными скобками.
Примечание: на выходе технически есть два завершающих символа новой строки; если это необходимо учитывать, то оно увеличивается на 4 символа.
источник
\n
(нет\r
).Zsh , 133 байта
Попробуйте онлайн!
Это использует некоторые функции 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))
.источник