1, 2, Fizz, 4, Buzz


148

Вступ

Під час наших останніх зусиль зібрати каталоги найкоротших рішень для стандартних вправ програмування, ось перша в історії виклик PPCG FizzBuzz. Якщо ви хочете побачити інші виклики в каталозі, є "Hello World!" і "Чи є це число простим?" .

Виклик

Напишіть програму, яка друкує десяткові числа від 1 до 100 включно. Але для кратних з трьох друкуйте "Fizz" замість числа та для кратних п'яти друкуйте "Buzz". Для чисел, кратних як три, так і п'ять, друкуйте “FizzBuzz”.

Вихідні дані

Виведенням буде список номерів (і Fizzes, Buzzes та FizzBuzzes), розділених новим рядком (або \nабо \r\n). Прийнятний новий рядок прийнятний, але провідний новий рядок - ні. Крім вашого вибору нового рядка, вихід повинен виглядати саме так:

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz

Єдиним винятком із цього правила є постійний вихід перекладача вашої мови, який неможливо придушити, наприклад привітання, кольорові коди ANSI або відступ.

Подальші правила

  • Йдеться не про пошук мови з найкоротшим підходом до гри FizzBuzz, це про пошук найкоротшого підходу з кожної мови. Тому жодна відповідь не буде позначена як прийнята.

  • Подання оцінюються в байтах у відповідному попередньому кодуванні, як правило (але не обов'язково) UTF-8. Деякі мови, як-от папки, трохи складні, якщо засумніватися, будь ласка, запитайте про Meta.

  • Ніщо не може бути надруковано в STDERR.

  • На відміну від наших звичних правил, сміливо користуйтесь мовою (або мовною версією), навіть якщо вона є новішою, ніж ця проблема. Якщо хтось хоче зловживати цим, створивши мову, де порожня програма генерує вихід FizzBuzz, то вітаю, щоб прокласти шлях для дуже нудної відповіді.

    Зауважте, що повинен бути перекладач, щоб подати заявку можна перевірити. Дозволяється (і навіть рекомендується) писати цього перекладача самостійно для раніше не виконаної мови.

  • Якщо ваша обрана мова є тривіальним варіантом іншої (потенційно більш популярної) мови, на яку вже є відповідь (подумайте, основні або діалекти SQL, оболонки Unix або тривіальні похідні Brainfuck, як Alphuck та ???), подумайте про додавання примітки до існуючої відповідь, що те саме або дуже схоже рішення є найкоротшим в іншій мові.

  • Оскільки вихід фіксований, ви можете жорстко кодувати вихід (але це може бути не найкоротшим варіантом).

  • Ви можете використовувати попередні рішення, доки ви не зараховуєте оригіналу автора програми.

  • Стандартні лазівки інакше заборонено.

В якості побічної записки, будь ласка, не зволікайте нудних (але дійсних) відповідей мовами, де для гольфу не так багато; вони все ще корисні для цього питання, оскільки він намагається скласти каталог максимально повно. Однак, перш за все, надсилайте відповіді мовами, де авторам доводилося докладати зусиль, щоб розібратися у коді.

Каталог

var QUESTION_ID=58615;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk";var OVERRIDE_USER=30525;var answers=[],answers_hash,answer_ids,answer_page=1,more_answers=true,comment_page;function answersUrl(index){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(index,answers){return"https://api.stackexchange.com/2.2/answers/"+answers.join(';')+"/comments?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(data){answers.push.apply(answers,data.items);answers_hash=[];answer_ids=[];data.items.forEach(function(a){a.comments=[];var id=+a.share_link.match(/\d+/);answer_ids.push(id);answers_hash[id]=a});if(!data.has_more)more_answers=false;comment_page=1;getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:true,success:function(data){data.items.forEach(function(c){if(c.owner.user_id===OVERRIDE_USER)answers_hash[c.post_id].comments.push(c)});if(data.has_more)getComments();else if(more_answers)getAnswers();else process()}})}getAnswers();var SCORE_REG=/<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;var OVERRIDE_REG=/^Override\s*header:\s*/i;function getAuthorName(a){return a.owner.display_name}function process(){var valid=[];answers.forEach(function(a){var body=a.body;a.comments.forEach(function(c){if(OVERRIDE_REG.test(c.body))body='<h1>'+c.body.replace(OVERRIDE_REG,'')+'</h1>'});var match=body.match(SCORE_REG);if(match)valid.push({user:getAuthorName(a),size:+match[2],language:match[1],link:a.share_link,});else console.log(body)});valid.sort(function(a,b){var aB=a.size,bB=b.size;return aB-bB});var languages={};var place=1;var lastSize=null;var lastPlace=1;valid.forEach(function(a){if(a.size!=lastSize)lastPlace=place;lastSize=a.size;++place;var answer=jQuery("#answer-template").html();answer=answer.replace("{{PLACE}}",lastPlace+".").replace("{{NAME}}",a.user).replace("{{LANGUAGE}}",a.language).replace("{{SIZE}}",a.size).replace("{{LINK}}",a.link);answer=jQuery(answer);jQuery("#answers").append(answer);var lang=a.language;lang=jQuery('<a>'+lang+'</a>').text();languages[lang]=languages[lang]||{lang:a.language,lang_raw:lang.toLowerCase(),user:a.user,size:a.size,link:a.link}});var langs=[];for(var lang in languages)if(languages.hasOwnProperty(lang))langs.push(languages[lang]);langs.sort(function(a,b){if(a.lang_raw>b.lang_raw)return 1;if(a.lang_raw<b.lang_raw)return-1;return 0});for(var i=0;i<langs.length;++i){var language=jQuery("#language-template").html();var lang=langs[i];language=language.replace("{{LANGUAGE}}",lang.lang).replace("{{NAME}}",lang.user).replace("{{SIZE}}",lang.size).replace("{{LINK}}",lang.link);language=jQuery(language);jQuery("#languages").append(language)}}
body{text-align:left!important}#answer-list{padding:10px;width:290px;float:left}#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table>


1
Nothing can be printed to STDERR. Це правда лише під час запуску чи також при компілюванні (якщо припустити, що це окремий крок?)
AShelly

@AShelly Тільки під час запуску
Beta Decay

Я не впевнений, що мені подобається те, що ви жорстко закодували 100 у виклик. Таким чином, програма, яка просто генерує очікуваний результат, є дійсним записом, але не цікава для цього завдання. Я думаю, що проблема повинна очікувати, що програма введе кількість елементів для виведення.
Тімві

6
@Timwi Хоча я погоджуюся, що це зробить це (лише трохи) цікавішим, я дуже часто бачив FizzBuzz як строго від 1 до 100 (наприклад, у кодексі Вікіпедії та Розетти). Якщо мета - мати "канонічний" виклик ФБ, це має сенс.
Геобіт

58
"Ванільний фізбуз" звучить дуже смачно.
iamnotmaynard

Відповіді:


76

Пітон 2, 56

i=0;exec"print i%3/2*'Fizz'+i%5/4*'Buzz'or-~i;i+=1;"*100

6
Данг, це кривавий геній. Чи можу я вкрасти вашу ідею помножити рядок на mod-результат?
AdmBorkBork

@TimmyD Вперед.
feersum

15
Інший метод 56 (з тут ): i=1;exec"print'FizzBuzz'[i%-3&4:12&8-i%5]or i;i+=1;"*100. Хто-небудь хоче, щоб спробувати жорсткі пошукові вирази, щоб спробувати оптимізувати розбиття бітів?
xnor

1
Дуже приємна техніка, я люблю поділ результату за модулем, щоб зробити його бінарним! У мене є поліпшення, щоб зменшити ваш метод до 54 знаків ... Звичайно, я б не опублікував це як відповідь без вашого дозволу (оскільки це ~ 95% ваша відповідь);)
Tersosauros

2
@Tersosauros Далі ... мій метод не дуже важко знайти і, без сумніву, багато людей самостійно виявили.
feersum

76

Шестикутник , 91 байт

Дякую за щедроту :)

Нічого собі, я ніколи б не уявляв, що зможу перемогти шестикутне рішення Мартина . Але - хто б це заграв - я це зробив. Після декількох днів відмови, тому що я не мав ні шестикутника, ні езотерициду, щоб перевірити своє рішення Я неправильно зрозумів кілька аспектів специфікації, тому я створив кілька неправильних «рішень», використовуючи лише ручку та папір та текстовий редактор. Ну і нарешті я подолав свою лінь і клонував обидва сховища, завантажив VisualStudio і компілював їх. Нічого собі, чим вони корисні! Як бачите, я далеко не той, кого ви назвали програмістом (я маю на увазі, давай! У мене навіть не було встановлено VisualStudio, і я майже не маю поняття, як скласти програму);)

Ще мені знадобилося деякий час, щоб знайти робоче рішення, і це досить тісно і хаотично, але ось воно у всій красі:

Fizzbuzz в шестикутник розміром 6:

3}1"$.!$>)}g4_.{$'))\<$\.\.@\}F\$/;z;u;<%<_>_..$>B/<>}))'%<>{>;e"-</_%;\/{}/>.\;.z;i;..>(('

Шестикутна форма:

      3 } 1 " $ .
     ! $ > ) } g 4
    _ . { $ ' ) ) \
   < $ \ . \ . @ \ }
  F \ $ / ; z ; u ; <
 % < _ > _ . . $ > B /
  < > } ) ) ' % < > {
   > ; e " - < / _ %
    ; \ / { } / > .
     \ ; . z ; i ;
      . . > ( ( '

І прекрасна передача, завдяки шестикутнику Colour Timwi :

Colorized Hexagony FizzBuzz solution

Отже, ось 110-секундна GIF-анімація на 2 секунди в секунду, що показує потік програми під час перших 6 номерів 1, 2, Fizz, 4, Buzz, Fizz, перші 220 тиків програми (натисніть на зображення для повного розміру):

enter image description here

Моя користь, завдяки програмному забезпеченню для складання Natron, анімація вказівника була все ще нудною для створення, але керованою. Збереження 260 зображень пам'яті було менш кумедним. На жаль, Езотерицид не може зробити це автоматично. У будь-якому разі насолоджуйтесь анімацією!

Зрештою, коли ви обмотаєте голову навколо моделі пам’яті та досить протиконтактного обгортання доріжок, що перетинають межі шестикутника, з Гексагоні не так важко працювати. Але гольф у нього може бути болем у задника. ;)

Це було весело!


1
Дуже хороша! :) Ось що я отримую, забувши спробувати бокову довжину 6. ;) (Цікаво було б побачити, чи моє рішення легше входить у бічну довжину 6.)
Мартін Ендер

@ MartinBüttner Я б хотів це побачити :)
ML

2
Я менш програміст, ніж ви, бо що таке Visual Studio? : P
Rɪᴋᴇʀ

5
На жаль, Езотерицид не може зробити це автоматично. - Будь ласка, йдіть прямо вперед і подайте пропозицію про функцію , я можу обійтись цим робити якийсь день :)
Timwi

1
(На жаль, це з'являється після 6 місяців останньої відповіді) Ви можете відіграти 1 байт з кінця програми, змістивши сірий шлях на 1 байт і помістивши "Скасування оп" в помаранчевій доріжці, наприклад. 3}1"$.!$>)}g4_'{$))}\<$\.\.@\;F\$/;z;u;<%<_>_..$>B/<>}))'%<>{>;e"-</_%;\/{}/>.\)(z;i;..>('Тепер є додаткова (після z, яке можна "скасувати" за допомогою a) або помістивши z туди. Тепер це а), який натискає всі команди на помаранчевий шлях 1 галочкою пізніше, і повернувся з не-оп, який був у рядку 3. Btw Я також встановив Visual Studio саме завдяки Hexagony Colorer та Esoteric IDE: P
Сонячний каламбур

44

Лабіринт , 94 байти

"):_1
\ } 01/3%70.105
" :   @ "     .
"  =";_""..:221
+  _
"! 5%66.117
_:= "     .
="*{"..:221

Sub-100! Це було весело.

Пояснення

Почнемо з короткого букваря на Лабіринті - сміливо пропускайте це, якщо ви вже знайомі з основами:

  • Лабіринт має дві стеки - основний стек і допоміжний стек. Обидва стеки мають нескінченну кількість нулів у нижній частині, наприклад, +у порожній стек додає два нулі, таким чином натискаючи на нуль.

  • Контрольний потік у Лабіринті визначають стики, які дивляться у верхній частині стека, щоб визначити, куди йти далі. Негативні засоби поверніть ліворуч, нуль означає йти прямо вперед, а позитивні - повернути праворуч ... але якщо ми вдаримось про стіну, то повернемо напрямок. Наприклад, якщо можливі лише прямо вперед і повернути ліворуч, але верхня частина стека позитивна, то, оскільки ми не можемо повернути праворуч, ми замість цього повернемо ліворуч.

  • Цифри в "Лабіринті поп xі натиск" 10*x + <digit>, що дозволяє легко нарощувати велику кількість. Однак це означає, що нам потрібна інструкція натиснути 0, щоб почати нове число, яке знаходиться _в Лабіринті.

Тепер перейдемо до фактичного коду!

enter image description here

Червоний

Виконання починається з "верхнього лівого кута, що є NOP. Далі ), який збільшує верхню частину стека, висуваючи 1 на перший прохід і збільшуючи nкожен наступний прохід.

Далі копіюємо nз :. Оскільки nпозитивний, ми повертаємо праворуч, виконуючи }(переміщуємо верхню частину основного стека на допоміжну) і :. Ми потрапили в глухий кут, тож перевертаємось і страчуємо }і :ще раз, залишаючи стоси як

Main [ n n | n n ] Aux

Ще раз n- позитивний, і ми повертаємо праворуч, виконуючи _101/який ділиться nна 101. Якщо n101, то n/101 = 1ми перетворюємось на те @, що завершує програму. Інакше наша нинішня ситуація така

Main [ n 0 | n n ] Aux

Помаранчевий 1 (мод 3)

3перетворює верхній нуль у 3 ( 10*0 + 3 = 3) і %виконує модуль. Якщо n%3є позитивним, перетворюємо право на жовтий ". Інакше ми виконуємо 70.105.122:.., які виводимо Fizz. Зауважте, що нам не потрібно штовхати нові нулі, _оскільки n%3в цьому випадку було нуль, тому ми можемо використовувати нескінченні нулі в нижній частині стека. Обидві стежки знову зустрічаються у світло-блакитному кольорі.

Блакитний

Зараз знаходиться вершина стека n%3, що може бути позитивним, тому _;просто натискає на нуль і негайно спливає його, щоб переконатися, що ми йдемо прямо вперед, а не перетворюємось на @. Потім ми використовуємо =для обміну вершинами основних та допоміжних стеків, даючи:

Main [ n | n%3 n ] Aux

Помаранчевий 2 (мод 5)

Це така ж ситуація і раніше, за винятком того, що 66.117.122:..видає , Buzzякщо n%5дорівнює нулю.

Темно-синій

Попередній розділ залишає стеки як

Main [ n%5 | n%3 n ] Aux

{зміщує n%3спинку до основної *стеки і множить два модулі.

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

Main [ n 0 | 0 ] Aux

В іншому випадку, якщо обидва модулі ненульові, то продукт ненульовий, і ми перетворюємо право на зелений. =обміняє вершини штабелів, даючи

Main [ n | (n%5)*(n%3) ] Aux

після чого ми використовуємо :для дублювання n, повертаємо праворуч, а потім використовуємо !для виведення n.

Фіолетовий

На цьому етапі основний стек містить один або два пункти, залежно від того, який шлях пройшов. Нам потрібно позбутися нуля з жовтого шляху, і зробити це ми використовуємо +, що виконує n + 0в певному порядку для обох випадків. Нарешті, \виводить новий рядок, і ми знову на старті.

Кожна ітерація підштовхує додатковий (n%5)*(n%3)до допоміжного стека, але в іншому випадку ми робимо те ж саме знову.


7
Любляче пояснення.
The_Basset_Hound

29

Perl 5, 49 байт

46 байт сценарій + 3 байти -E"..."

Використання say(що вимагає -E"...") може зменшити це ще до 46 байт, оскільки sayавтоматично включає новий рядок (Спасибі @Dennis !):

say'Fizz'x!($_%3).Buzz x!($_%5)||$_ for 1..100

Perl 5, 50 байт

print'Fizz'x!($_%3).Buzz x!($_%5)||$_,$/for 1..100

Ви можете зберегти кілька байтів за допомогою say.
Денніс

Ви зламали табло ...
LegionMammal978

@ LegionMammal978 Так. Так, я зробив ... Я спробую перетворити назву тоді! Арг!
Дом Гастінгс

Чи не -E"..."8 байт? Пробіл + тире + опція + аргумент (+ цитування).
Ерік Аутгольфер

1
@EriktheGolfer, так як я опублікував це, консенсус полягає в тому, що -Eце 0 байтів, але оскільки відповідь primo була набрана за винятком цитат, я вирішив зробити це справедливим і включити цитати в моє і +1 для -E. Причина це прийнято , як безкоштовно в Perl зазвичай запускається з допомогою perl -eі perl -Eне більш байт (я думав , -M5.010чи use 5.010може бути вільним , як добре, але , можливо , НЕ перечитуючи мета пост). При додаванні -pабо -nце зараховується як +1, як ви б працювали з perl -pe. Сподіваюся, що це допомагає! Мета посилання: meta.codegolf.stackexchange.com/a/7539
Дом Гастінгс

27

Рубін, 50 байт

Потрібна версія 1.8, яка, здається, популярна серед гравців у гольф:

1.upto(?d){|n|puts'FizzBuzz
'[i=n**4%-15,i+13]||n}

У сучасному Ruby, ви замінюєте ?dз 100для розчину 51 байт.

Це, здається, світовий рекорд.


1
Це дьявольське, люблю це.
Камден Нарзт

?dпросто 100. У FizzBuzzрядку є новий рядок, це дійсно в Ruby. string[i, s]- це фрагмент, починаючи з символу i(0-індексується), продовжуючи sсимволи, ігноруючи індекси, що вказують поза рядка. Якщо аргумент до putsвже має новий рядок, він відсікається. Формула повинна бути простою для читання? Тут робиться вся робота. Я б не знайшов його без допомоги якихось справді професійних гольфістів Рубі.
Лінн

бічна примітка: якщо вам було дозволено додати 0 на початку введення (ви не є), 2 байти можна зберегти, використовуючи ?e.timesзамість цього.
Шельваку

Чи можете ви пояснити, [i=n**4%-15,i+13]будь ласка, частину? Не можу обернути голову навколо цього
Пікколо

2
@Piccolo Чи допомагає цей фрагмент ? Якщо i==-14шматочок виходить за межі, ми отримуємо nil. Якщо i==-9ми розріжемо i+13==4символи, починаючи з 9-го символу з кінця, так 'Fizz'. Якщо i==-5ми розріжемо 8 символів, починаючи з 5-го символу з кінця, так 'Buzz\n'. (Ми намагаємося нарізати 8, але їх всього 5, тому отримуємо 5.) Et cetera.
Лінн

26

Java, 130 байт

Це для останніх версій Java (7+). У старших з них можна трішки enumвідголити, але я не думаю, що логіка стає коротшою, ніж ця (86 всередині main).

class F{public static void main(String[]a){for(int i=0;i++<100;)System.out.println((i%3<1?"Fizz":"")+(i%5<1?"Buzz":i%3<1?"":i));}}

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

Хм. Я знаю, що статичний трюк роздруковується на більш жорсткий, але я подумав, що енюм пробігає чисто.
Приємно

4
побили мене на 14 байт! Використання <1 замість == 0 - це чудовий спосіб заощадити!
ESP

2
class F{public static-> interface F{staticin java 8
TheNumberOne

1
Це не зовсім так, як працюють ентузіасти. Вам доведеться це зробити enum F{;public..., так що ви насправді не економили жоден байт.
HyperNeutrino

23

Піт, 30

VS100|+*!%N3"Fizz"*!%N5"Buzz"N

Спробуйте тут

Пояснення:

VS100|+*!%N3"Fizz"*!%N5"Buzz"N
VS100                            : for N in range(1,101)
     |                           : logical short-circuiting or
      +*!%N3"Fizz"               : add "Fizz" * not(N % 3)
                                 : Since not gives True/False this is either "" or "Fizz"
                  *!%N5"Buzz"    : Same but with 5 and Buzz
                             N   : Otherwise N
                                 : The output of the | is implicitly printed with a newline

23

Сітчаста , 317 139 134 132 70 63 60 55 байт

.100{`^
_
*\(a`(___)+
Fi;$&
\b(_{5})+$
Bu;
;_*
zz
'_&`.

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

Пояснення

.100{`^
_

Це .глобальний безшумний прапор, який вимикає неявний вихід у кінці програми. 100{загортає решту програми в цикл, який виконується за 100 ітерацій. Нарешті, сам етап просто вставляє a _на початку рядка, що ефективно збільшує лічильник одинарних циклів.

*\(a`(___)+
Fi;$&

Більше налаштування. *\(загортає залишок програми в групу, друкує її результат за допомогою зворотного підводного рядка, але також ставить всю групу в сухий проміжок, а це означає, що її результат буде відмінено після друку, щоб наш лічильник циклу насправді не був змінений . aє спеціальним модифікатором регулярних виразів, який закріплює регулярний вираз на всій рядку (що зберігає байт при використанні ^та$ явно).

Сама атомна стадія піклується Fizz. Подільність 3можна легко перевірити одинаково: просто перевірити, чи можна записати число як повторення ___. Якщо це так, ми додаємо Fi;до рядка. Точка з комою є такою, що перед цифрою для наступного етапу ще є межа слова. Якби ми перетворили лінію в Fizz___...положення між zі _не вважали б її межею, тому що регулярне вираження розглядає як букви, так і підкреслення як символи слова. Однак крапка з комою також дозволяє нам видалити zzдублювання з Fizzі Buzz.

\b(_{5})+$
Bu;

Ми робимо саме те саме для подільності 5і Bu;, хоча нам не потрібно тримати _цей час. Так ми отримали б такі результати

_
__
Fi;___
____
Bu;
Fi;______
...
Fi;Bu;
...

Це дозволяє дуже легко позбутися підкреслення лише в тих рядках, які містять Fizz, а також заповнюючи zzs:

;_*
zz

Тобто, ми перетворюємо кожну крапку з комою, zzале ми також споживаємо всі _одразу після неї. На даний момент ми закінчили роботу з FizzBuzz уніарно. Але виклик хоче десяткового виведення.

'_&`.

&вказує на умовний: цей етап виконується лише в тому випадку, якщо рядок містить підкреслення. Тому Fizz, Buzzі FizzBuzzітерації залишаються недоторканими. У всіх інших ітераціях (тобто тих, які не поділяються ні на 3, ні на 5), ми просто підраховуємо кількість символів, перетворюючи результат у десятковий.



20

Perl 5, 45 байт

say((Fizz)[$_%3].(Buzz)[$_%5]or$_)for+1..100

Потрібен -Eваріант, що рахується як один. Це потрібно запустити з командного рядка, тобто:

perl -Esay((Fizz)[$_%3].(Buzz)[$_%5]or$_)for+1..100

Котирування навколо команди не потрібні, якщо один уникає використання прогалин, або будь-яких інших символів , які можуть виступати в якості командного рядка роздільників ( |, <, >, &і т.д.).


Perl 5, 48 байт

print+(Fizz)[$_%3].(Buzz)[$_%5]||$_,$/for 1..100

Якщо параметри командного рядка рахуються як один, -lзбереже один байт (замінивши $/). За класичними правилами Perlgolf , однак, це буде рахувати 3: один для -, один для l, а один для необхідного місця.


Ви можете використовувати sayза допомогою -Eперемикача, який має відстань редагування від 1 до -e, тому він повинен рахуватися як 1 байт.
Денніс

Ей, примо, я відчуваю, що я обманюю свою відповідь за використання say, я припустив, що -Eможе бути використаний замість цього, -eякий би звів вас до 44, а не до 46. Я не думаю, що це справедливо, що я забиваю по-іншому для вас, який переважний бальний механізм? Я взагалі використовую, printщоб цього уникнути! Найближчим до консенсусу було б це ?
Дом Гастінгс

Моя особиста думка полягає в тому, що кожен додатковий байт у командному рядку повинен набирати 1. Зокрема say, якщо ваш код можна записати в одному рядку, уникаючи будь-яких розділювачів ОС, оцініть 1 бал -E. Якщо вам потрібно використовувати лапки, наприклад -E"$a||$b", оцінка 3. Якщо ви не можете отримати їх в одному рядку, наберіть 5 балів -M5.01. Але в цей момент вам, мабуть, було б краще скористатися -l. Я не погоджуюся, що він повинен бути безкоштовним за замовчуванням з двох причин: 1) поліпшення є тривіальним і нецікавим, і 2) не існує версії інтерпретатора, для якої він включений за замовчуванням.
примо

20

бджолиний віск ,104 89 81 байт

Щільніша упаковка дозволяє вирізати ще 8 байт.

Найкоротше рішення (81 байт), однаковий потік програми, різна упаковка.

p?@<
p?{@b'gA<
p@`zzuB`d'%~5F@<f`z`<
 >~P"#"_"1F3~%'d`Fiz`b
 d;"-~@~.<
>?N@9P~0+d

Зміна концепції дозволило мені скоротити код на 15 байт. Я хотів позбутися подвійного тесту mod 5 у рішенні, тому я реалізував прапор.

Коротке пояснення:

якщо n%3=0Fizz надрукується, і прапор буде встановлено. Прапор реалізується просто натисканням верхнього значення lstack на gstack (інструкція f).

Якщо n%5=0, то або n%3=0(випадок FizzBuzz), або n%3>0(випадок Buzz). В обох випадках Buzz надрукується, а прапор скидається, вискакуючи стек, поки він не порожній (інструкція ?).

Тепер цікаві випадки:

Якщо n%5>0тоді ми мали n%3=0(друкуючи справу Fizz, n не слід друкувати), або n%3>0(Fizz не була надрукована, тому n має бути надруковано). Час перевірити прапор. Це реалізується натисканням довжини gstack на вершину gstack (інструкція A). Якщо n%3 was 0тоді довжина гстака дорівнює> 0. Якщо n%3 was >0довжина gstack дорівнює 0. Простий умовний стрибок гарантує, що n надрукується лише у тому випадку, якщо довжина gstack дорівнювала 0.

Знову після друку будь-якого з n, Fizz та / або Buzz та нового рядка gstack вискакує двічі, щоб переконатися, що він порожній. gstack або порожній [], що призводить до [0]після вказівки A(довжина натискання gstack на gstack), або він містить один нуль ( [0], результат n% 3), що призводить до [0 1], оскільки [0] має довжину 1. Вискакує з порожній стек не змінює стек, тому можна сміливо двічі проскакувати.

Якщо придивитись ближче, то можна побачити, що в принципі я склав

>      q
d`Fizz`f>

в

<f`z`<
d`Fiz`b

що допомагає позбутися всього витраченого простору між Aі <в кінці наступного ряду в старій версії нижче:

q?{@b'gA<       p      <

Нове концепційне рішення (89 байт), включаючи анімоване пояснення:

q?@ <
 q?{@b'gA<       p      <
p?<@`zzuB`b'%~5F@<f`zziF`b'<
>N@9P~0+.~@~-";~P"#"_"1F3~%d

Шестикутна форма:

   q ? @   <
    q ? { @ b ' g A <               p             <
 p ? < @ ` z z u B ` b ' % ~ 5 F @ < f ` z z i F ` b ' <
> N @ 9 P ~ 0 + . ~ @ ~ - " ; ~ P " # " _ " 1 F 3 ~ % d

Анімація перших 326 тиків при 2 кадрів в секунду, з локальними та глобальними стеками, і вихід на STDOUT.

beeswax FizzBuzz animation


Для порівняння, нижче наводяться накладки на шляху більш старого, більш складного рішення. Можливо, це також гарне рішення з візуальної точки зору;)

Program with path overlay


2
Це так само божевільно і красиво, як і Гексагонія. Майте +1!
ETHproductions

@ETHproductions Мені все ж потрібно спробувати Hexagony, але, як я можу сказати з мовних специфікацій, мій бджолиний віск навіть не наблизився до божевілля Гексагонії.
ML


Як ви робите ці анімації?
baordog

18

> <> , 68 66 65 64 байт

1\2+2foooo "Buzz"<
o>:::3%:?!\$5%:?!/*?n1+:aa*)?;a
o.!o"Fizz"/oo

Єдина хитрість - примножити залишки як умова друкування номерів. Таким чином, якщо одна з них 0, ми не будемо друкувати номер.

Ви можете спробувати тут .

Збережено один байт завдяки Sp3000 та ще один завдяки випадковим. Дуже дякую!


1
Дуже добре гольф, я люблю повторне використання "\" на першому рядку та на другому.
cole

1
-1 байт, якщо ви пересунете oв кінці другого рядка порожній пробіл на початку рядка, я вважаю.
Sp3000

@ Sp3000 Дійсно, я витратив на гольф стільки часу, я не знаю, як це не прийшло в голову
Аарон,

1
Кому потрібен фіз-гуд, коли можна мати foooo Buzz?
caird coinheringaahing

17

gs2 , 28 27 (без f)

Hex:

1b 2f fe cc 04 46 69 7a 7a 09 07 42 75 7a 7a 19 06 27 2d d8 62 32 ec 99 dc 61 0a

Пояснення:

1b    100
2f    range1 (1..n)
fe    m: (map rest of program)

cc    put0 (pop and store in register 0)
04    string-begin
Fizz
09    9
07    string-separator
Buzz
19    25
06    string-end-array (result: ["Fizz"+chr(9) "Buzz"+chr(25)])

27    right-uncons
2d    sqrt
d8    tuck0 (insert value of register 0 under top of stack)
62    divides
32    times (string multiplication)
ec    m5 (create block from previous 5 tokens, then call map)

99    flatten
dc    show0 (convert register 0 to string and push it)
61    logical-or
0a    newline

Вбудовування 3 і 5 в константу рядків не працює, оскільки \x05закінчується літеральним рядком.

Примітка. Цю проблему можна вирішити в 1 байті з gs2 за допомогою вбудованого f.


16

C, 85 байт

i;main(){for(;i++<=99;printf("%s%s%.d\n",i%3?"":"Fizz",i%5?"":"Buzz",(i%3&&i%5)*i));}

-2 завдяки пискуватим.


Спроба компілювати тут, але gccне розпізнає новий рядок у рядку як \ n. Це дає мені помилку компіляції. Чи потрібно мені передавати якийсь параметр компілятору? До речі, ви пропустили <=у своєму дописі (я порахував 88 байт з <= ... тому я припускаю, що він відсутній).
wendelbsilva

ой. пропустив помилку в попередженнях. Додає 2 символи.
AShelly

Глобальні змінні ініціалізуються до нуля, тому замість цього main(i)спробуйте i;main(). Тоді ви зможете позбутися від i--початку for()циклу. Вам також не потрібен розрив лінії. Це повинно знизити кількість байтів до 85.
кричуще осифраж

2
Залежно від того, як ви хочете отримати UB, ви можете зробити 73, 74 або 75 байт. Ось моя відповідь на 74 байти .
Лінн

1
OMG Я витратив, можливо, 3 години, намагаючись отримати цю річ лише на один байт менший. Ось ви йдете. Замініть (i%3&&i%5)*iна те, що i%3*i%5?i:0я лягаю спати
Альберт Реншо

16

CJam, 35 байт

100{)_[Z5]f%:!"FizzBuzz"4/.*s\e|N}/

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

Як це працює

100{)_[Z5]f%:!"FizzBuzz"4/.*s\e|N}/
100{                             }/  For each integer I between 0 and 99:
    )_                                 Increment I and push a copy.
      [Z5]                             Push [3 5].
          f%                           Map % to push [(I+1)%3 (I+1)%5].
            :!                         Apply logical NOT to each remainder.
              "FizzBuzz"4/             Push ["Fizz" "Buzz"].
                          .*           Vectorized string repetition.
                            s\         Flatten the result and swap it with I+1.
                              e|       Logical OR; if `s' pushed an empty string,
                                       replace it with I+1.
                                N      Push a linefeed.

3
Більш просте рішення:100{):I3%!"Fizz"*I5%!"Buzz"*+Ie|N}/
aditsu

16

МУМПА, 56 54 байти

f i=1:1:100 w:i#5=0 "Fizz" w:i#3=0 "Buzz" w:$X<3 i w !

Що це w:$X<3 i, запитаєте ви? $Xє магічною змінною ("внутрішньою"), яка зберігає горизонтальне положення вихідного курсору (як кількість символів з лівого краю терміналу). wє скороченою формою WRITEкоманди. Синтаксис command:condition argsє посткондиційним - "якщо condition, тоді зроби command args".

Тож ми перевіряємо, чи був курсор виводу просунутим більше двох символів (це означало б, що принаймні один "Fizz"або "Buzz"записаний у термінал), а якщо ні - записуємо iдо терміналу. $XЗмінний - і , отже, цей вид глибокої невіддільності від терміналу - це перший клас особливість свинки. Yikes.


15

Желе , 24 20 байт

³µ3,5ḍTị“¡Ṭ4“Ụp»ȯµ€G

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

Як це працює

³µ3,5ḍTị“¡Ṭ4“Ụp»ȯµ€G  Main link. No input.

³                     Yield 100.
 µ                    Begin a new, monadic chain.
                 µ€   Apply the preceding chain to all integers n in [1, ..., 100].
  3,5ḍ                Test n for divisibility by 3 and 5.
      T               Get all truthy indices.
                      This yields [1] (mult. of 3, not 5), [2] (mult. of 5, not 3),
                      [1, 2] (mult. of 15) or [].
        “¡Ṭ4“Ụp»      Yield ['Fizz', 'Buzz'] by indexing in a dictionary.
       ị              Retrieve the strings at the corr. indices.
                ȯ     Logical OR hook; replace an empty list with n.
                   G  Grid; join the list, separating by linefeeds.

знову ніхто не вийшов з гольф-деннісу (крім відповіді HQ9 + стиль)
noɥʇʎԀʎzɐɹƆ

15

мозковий ебать, 206 байт

++>+++++>>>>>++++++++++[>+>>+>>+>+<<<[++++<-<]<,<,-<-<++<++++[<++>++++++>]++>>]>
[+[[<<]<[>>]+++<[<.<.<..[>]]<<-[>>>[,>>[<]>[--.++<<]>]]+++++<[+[-----.++++<<]>>+
..<-[>]]<[->>,>+>>>->->.>]<<]<[>+<<<,<->>>+]<]

Відформатовано:

++>+++++>>>>>
++++++++++[>+>>+>>+>+<<<[++++<-<]<,<,-<-<++<++++[<++>++++++>]++>>]
>
[
  +
  [
    [<<]
    <[>>]
    +++<
    [
      Fizz
      <.<.<..
      [>]
    ]
    <<-
    [
      >>>
      [
        ,>>[<]
        >[--.++<<]
        >
      ]
    ]
    +++++<
    [
      Buzz
      +[-----.++++<<]
      >>+..
      <-
      [>]
    ]
    <[->>,>+>>>->->.>]
    <<
  ]
  <[>+< <<,<->>>+]
  <
]

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

Макет пам'яті є

0 a 122 105 70 b f 0 t d1 s d2 c d 10 0

де fцикли на 3, bцикли на 5 - d1це цифри, d2десятки цифр, sпрапор для того, чи слід друкувати десятки цифр, dцикли на 10 - cце простір для копіювання дляd , t- це робочий простір, який містить 0 або небажані дані, або прапор не -ділі-на-3, і aвизначає завершення програми шляхом зміщення покажчика після друку Buzz 20 разів.


14

C #, 128 126 125 124 байт

class A{static void Main(){for(var i=0;i++<100;)System.Console.Write("{0:#}{1:;;Fizz}{2:;;Buzz}\n",i%3*i%5>0?i:0,i%3,i%5);}}

89 байт без кодової панелі.

Зроблено із застосуванням C # умовного форматування .

З двома секційними роздільниками ; друкується Fizz або Buzz, якщо значення від їх стану дорівнює нулю.


Збережено всього 4 байти завдяки @RubberDuck, @Timwi та @Riokmij.


Було б коротше зателефонувати Writeта додати новий рядок безпосередньо до рядка, правда?
RubberDuck

Це також один байт коротше записати i%3*i%5>0?i:0замість i%3*i%5==0?0:i.
Тімві

Ви можете зберегти ще один байт у forоператорі, скориставшисьfor(var i=0;i++<100;)
Найкін

1
Можна зберегти ще три байти, використовуючи String Interpolation з C # 6.0 та вставляючи аргументи формату в сам рядок (наприклад $"{(i%3*i%5>0?i:0):#}...\n")
LiamK

1
можна сьогодні зі 121 байтом -class A{static void Main(){for(var i=0;i<100;)System.Console.Write($"{(++i%3*i%5<1?0:i):#}{i%3:;;Fizz}{i%5:;;Buzz}\n");}}
Джеррі Кангаснємі

14

Clojure, 113 106 101 100 91 байт

Мій перший гольф!

(dotimes[i 100](println(str({2'Fizz}(mod i 3))({4'Buzz}(mod i 5)({2""}(mod i 3)(inc i))))))

Безголовки:

(dotimes [i 100] ; account for off-by-one later
  (println (str ({2 'Fizz} ; str converts symbols to strings
                 (mod i 3))
                ({4 'Buzz} ; 4 instead of 0 because of off-by-one
                 (mod i 5)
                 ({2 ""} ; shortest way to write when-not
                  (mod i 3)
                  (inc i))))))

1
Ви можете видалити 5 символів, поводячись printlnтак само, як і в рішенні Java , наприклад. (doall(map #(let[t(=(mod % 3)0)](println(str(if t"Fizz""")(if(=(mod % 5)0)"Buzz"(if t""%)))))(range 1 101)))
resueman

1
@resueman Спасибі! Насправді це було 7, тому що (if t"Fizz""")їх можна спростити (if t"Fizz"). :)
Сем Естеп

+1 Хороший модульний трюк, спочатку я хоч і мав помилки один за одним.
coredump

14

brainfuck , 411 350 277 258 байт

Зміни:

  • -61 байт, зберігаючи значення "Fizz Buzz" як "BuziF" "BuziG" та повторення розділу друку номерів.

  • -71 байт шляхом повторного редагування розділу друку модулів за номером, розділення лічильника циклу та лічильника чисел та повторного використання комірки нового рядка як значення мода, серед іншого

  • -19 байтів, зрозумівши, що в будь-яких номерах FizzBuzz немає 0. Також додано пояснення

+[-[>+<<]>-]>--[>+>++>++>++++++>+>>>++++++[<<<]>-]<+++++[>+>+>->>->++>>>-->>>++[<<<]>>>-]>[>]+++>>[>+<<<-[<]<[>+++>+<<-.+<.<..[<]<]>>-[<<]>[.>.>..>>>>+[<]+++++<]>[>]>>[[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]>[-<+>]>,>[>]<[>-[<+>-----]<---.,<]++++++++++>]<.<<<<,>-]

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

Замість того, щоб перевірити, чи не було число, яке ділиться на 5 або 3, у мене було два лічильника, які відслідковували модуль числа, зменшуючи їх для кожного числа та роздруковуючи відповідне слово, коли вони досягли 0.

Як це працює:

+[-[>+<<]>-]>--  Generate the number 61
[>+>++>++>++++++>+>>>++++++[<<<]>-] Set the tape to multiples of 61
TAPE: 0 0' 61  122 122 110 61  0 0 110
           "=" "z" "z" "n" "="
<+++++[>+>+>->>->++>>>-->>>++[<<<]>>>-]>[>]+++>> Modify values by multiples of 5
TAPE: 0' 5 66  117 122 105 71  3 0 100' 0 0 10
           "B" "u" "z" "i" "G"
Some info:
  5     - Buzz counter
  "Buz" - Buzz printing
  "ziG" - Fizz printing. Modifying the G in the loop is shorter than modifying it outside
  3     - Fizz counter
  0     - This is where the Fizz|Buzz check will be located
  100   - Loop counter
  0     - Number counter. It's not worth it to reuse the loop counter as this.
  0     - Sometimes a zero is just a zero
  10    - Value as a newline and to mod the number by

[ Loop 100 times
  >+<<<  Increment number counter
  -[<]<  Decrement Fizz counter
  [ If Fizz counter is 0
    >+++ Reset the Fizz counter to 3
    >+<< Set the Fizz|Buzz check to true
    -.+<.<.. Print "Fizz"
  [<]<] Sync pointers
  >>-[<<]> Decrement Buzz counter
  [ If Buzz counter is 0
    .>.>.. Print "Buzz"
    >>>>+  Set the Fizz|Buzz check to true
    [<]+++++< Reset the Buzz counter to 5
  ]
  >[>]>> Go to Fizz|Buzz check
  [ If there was no Fizz or Buzz for this number
    TAPE: 3% BuziG 5% 0 Loop Num' 0 10
    [->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]  Mod the number counter by 10
    TAPE: 3% BuziG 5% 0 Loop 0' Num 10-Num%10 Num%10 Num/10
    >[-<+>] Move Num back in place
    >,>[>]< Reset 10-Num%10
    [ For both Num/10 (if it exists) and Num%10
      >-[<+>-----]<--- Add 48 to the number to turn it into the ASCII equivilent
      .,< Print and remove
    ]
    ++++++++++> Add the 10 back
  ]
  <. Print the newline
  <<<<, Remove Fizz|Buzz check
  >- Decrement Loop counter
]

Молодець Джо! Я можу спробувати перемогти це коли-небудь :)
Forcent Vintier

13

PowerShell, 78 68 61 54 байт

1..100|%{(($t="Fizz"*!($_%3)+"Buzz"*!($_%5)),$_)[!$t]}

Редагувати: Збережено 10 байт завдяки feersum

Edit2: Зрозумів, що з хитрістю feersum мені більше не потрібно формулювати $ t як блоки рядків коду

Edit3: Збережено ще 7 байт завдяки Данко Дурбичу

Дуже схожий за духом на відповідь Кодексу Розетти , але golfed вниз зовсім небагато.

Пояснення

1..100|%{...} Створіть колекцію від 1 до 100, потім зробіть для кожного об'єкта в цій колекції

(...,$_)створити нову колекцію з двох елементів: 0) $t=...встановити змінну $tрівну рядку; 1) $_наш-поточний-номер циклу

"Fizz"*!($_%3)візьміть наш-поточний номер, модифікуйте його на 3, тоді НЕ результат. Помножте "Fizz" на це і додайте його до рядка (і подібного для 5). PowerShell розглядає будь-яке ненульове число як $TRUE, і таким чином NOT ненульового числа дорівнює 0, це означає, що лише якщо наше поточне число є кратним 3, "Fizz" додається до рядка.

[!$t]індексує щойно створену нами колекцію, виходячи зі значення рядка $t- не порожній, надрукуйте його, інакше надрукуйте наш-поточний номер


Крім того, також 54 байти

1..100|%{'Fizz'*!($_%3)+'Buzz'*!($_%5)-replace'^$',$_}

Завдяки TesselatingHeckler

Аналогічно в концепції це використовує вбудований -replaceоператор і регулярний вираз, щоб поміняти порожній рядок ^$на наш-current-number. Якщо рядок не порожній, він не змінюється.


Крім того, також 54 байти

1..100|%{($_,('Fizz'*!($_%3)+'Buzz'*!($_%5))|sort)[1]}

Це та сама структура циклу, що і вище, але всередині вона сортує пару (n, рядок) і спирається на те, що порожня рядок сортує перед числом, а рядок FizzBuzz сортує після числа. Потім він індексує результат другого сортування.


Як осторонь, якщо PowerShell коли-небудь впровадив ||оператор, як, наприклад, в C #, ми, швидше за все, могли б опуститися до 43 байтів із чимось подібним до 1..100|%{"Fizz"*!($_%3)+"Buzz"*!($_%5)||$_}... сумнівного, оскільки цей |важливий спеціальний оператор у PowerShell, але я можу мріяти ...
AdmBorkBork

1
Як щодо 1..100|%{'Fizz'*!($_%3)+'Buzz'*!($_%5)-replace'^$',$_}54?
TessellatingHeckler

Ви можете замінити if($t){$t}else{$_}щось на кшталт($t,$_)[!$t]
Данько Дурбич,

1
... так що ви отримаєте, 1..100|%{(($t="Fizz"*!($_%3)+"Buzz"*!($_%5)),$_)[!$t]}що також 54, як пропозиція @
TessellingHeckler

@TessellatingHeckler PowerShell - це нічого, якщо не гнучка.
AdmBorkBork

13

JavaScript, 62 байти

for(i=0;++i<101;console.log(i%5?f||i:f+'Buzz'))f=i%3?'':'Fizz'

Я думаю, що це найкоротше рішення Javascript зараз.


Ух, просто ух! Але всі інші відповіді JS використовують console.log; це набагато менш дратує, ніж потрібно натискати "ОК" на 100 спливаючих вікнах поспіль. Не могли б ви змінити це? Це буде лише 62 байти, все-таки на три краще, ніж у мене.
ETHproductions

Мені доведеться це зробити завтра, оскільки я вже відредагував 5 своїх власних дописів і більше не можу редагувати ...
Mama Fun Roll

2
О, я не розумів, що існує обмеження редагуванню ...
ETHproductions

12

C, 74 байти

main(i){for(;i<101;puts(i++%5?"":"Buzz"))printf(i%3?i%5?"%d":0:"Fizz",i);}

The 0аргумент printfзамість"" рибний, але , здається, працює на більшості платформ я намагаюся його.putssegfaults, якщо ви намагаєтесь те ж саме. Без нього ви отримуєте 75 байт.

Є 73-байтові рішення, які працюють на гольфі з анархією , і я знайшов, що копатися в потрібних місцях в Інтернеті, але вони покладаються на поведінку, що залежить від платформи. (Як ви могли здогадатися, це щось із форми puts("Buzz"±...).)


Хороший трюк отримати i = 1 для випадку no args (argc = 1). Це особливість: ви можете запустити послідовність з будь-якої точки, запустивши ./fizzbuzz $(seq 40): P
Пітер Кордес

12

Скретч, 203 185 байт

Байти, підраховані за текстовим поданням для гольфу , за цим мета-повідомленням . Подряпини не дуже ефективні в просторі.

say- це найближче до Stdout Scratch, що має: спрайт відображає мовний міхур, що містить все, що він говорить. На практиці потрібен wait n secsби блок для фактичного зчитування цього виводу, але для цілей цього виклику цей код відповідає вимогам.


Ви пропускаєте цифри після y =(в обох випадках)
бета-версія занепаду

@BetaDecay Вибачте? Я не стежу за цим.
Тимофім

Усередині циклу повторення set y to ...значення пропущено
Beta Decay

1
@BetaDecay Це порожня рядок. :) якщо натиснути на зображення, ви можете переглянути його в дії!
Тимофім

Ой, ха-ха, вибачте, що сумніваєтесь у вас;)
бета-розпад

12

R, 88 83 77 71 70 байт

Я впевнений, що це можна покращити ... і це було з кредитом @flodel. Ще кілька байтів збереглися завдяки пропозиції від @njnnja та іншого від @ J.Doe

x=y=1:100;y[3*x]='Fizz';y[5*x]='Buzz';y[15*x]='FizzBuzz';write(y[x],1)

Відповідь кота. Миша вище :)
Сільвіу Бурса

1
Я знайшов трохи краще:x=1:100;i=!x%%3;j=!x%%5;x[i]="Fizz";x[j]="Buzz";x[i&j]="FizzBuzz";cat(x,sep="\n")
flodel

@njnnja Дякую за пропозицію. Я реалізував це, writeа не catхоч
MickyT

2
Тут некромантизм! writeВиклик може зайняти 1 замість порожнього рядка так x=y=1:100;y[3*x]='Fizz';y[5*x]='Buzz';y[15*x]='FizzBuzz';write(y[x],1)тривіальний 1 байт для гольфу на 70 байт.
J.Doe

68 байт . Даний рахунок включає три недруковані зворотні області, і він не працює належним чином у TIO.
J.Doe

12

Хаскелл, 84 байти

main=mapM f[1..100]
f n|d<-drop.(*4).mod n=putStrLn$max(show n)$d 3"Fizz"++d 5"Buzz"

Наблизившись до 81 байт henkma , але ще не зовсім там.

d = drop.(*4).mod nтут ключове: d 3 "Fizz"є drop (n`mod`3 * 4) "Fizz". Це "Fizz"коли n `mod` 30 та ""інакше.


Перебудова гольфи його до 82, я думаю: (%)=drop.(*4).mod n;main=mapM putStrLn[max(show n)$3%"Fizz"++5%"Buzz"|n<-[0..100]].
CR Drost

Зачекайте, тоді nце не в обсязі. Гм.
CR Drost

Так, це не працює, але я потрапив на альтернативне 85-байтне рішення, яке дуже схоже на це:main=mapM putStrLn[max(show n)$3%"Fizz"++5%"Buzz"|n<-[0..100],(%)<-[drop.(*4).mod n]]
Лінн,

Чому б не використати розрив лінії? Він такий же короткий, як крапка з комою, але менш нечитабельний.
dfeuer

1
Я пропоную вам переглянути свій пошук читабельного коду на веб-сайті гольфу з кодом :)
Лінн

11

PHP, 54 байти

<?for(;$i++<100;)echo[Fizz][$i%3].[Buzz][$i%5]?:$i,~õ;

Дійсно для v5.5 і далі. õЦе символ 245, трохи перевернута \n.

Я припускаю налаштування інтерпретатора за замовчуванням, оскільки вони є без будь-яких ini. Якщо ви не впевнені, ви можете відключити свій локальний інітарій, -nяк і в php -n fizzbuzz.php.

Версія, яка працює без помилок з абсолютно будь-яким файлом конфігурації, становить 62 байти :

<?php
for(;$i++<100;)echo@([Fizz][$i%3].[Buzz][$i%5]?:$i),"
";

Оператор STFU @ не обов'язково означає, що код не містить помилок.
sitilge


@Kzqai ideone.com/0zRA9e short_open_tag вимкнено, E_NOTICEувімкнено. Жоден із цих параметрів не є типовими налаштуваннями.
прима

Я отримую купу помилок на 3v4l.org
кодер

@acoder відповідна мета-повідомлення . 3v4l.org здається корисним.
прим

11

80386 код машини + DOS, 75 байт

Шестнадцятковий код:

0D 0A 24 B1 64 33 C0 BA-03 05 BB 00 01 40 50 FE
CE 75 0C 83 EB 04 66 C7-07 42 75 7A 7A B6 05 FE
CA 75 0C 83 EB 04 66 C7-07 46 69 7A 7A B2 03 84
FF 74 0C D4 0A 04 30 4B-88 07 C1 E8 08 75 F4 52
8B D3 B4 09 CD 21 5A 58-E2 C0 C3

Вихідний код (синтаксис TASM):

    .MODEL TINY

    .CODE
    .386
    org 100h

MAIN PROC
    db 13, 10, '$'
    mov cl, 100
    xor ax, ax
    mov dx, 503h

main_loop:
    mov bx, 100h
    inc ax
    push ax

    dec dh
    jnz short buzz_done
    sub bx, 4
    mov dword ptr [bx], 'zzuB'
    mov dh, 5
buzz_done:

    dec dl
    jnz short fizz_done
    sub bx, 4
    mov dword ptr [bx], 'zziF'
    mov dl, 3
fizz_done:

    test bh, bh
    jz short num_done

decimal_loop:
    aam;
    add al, '0'
    dec bx
    mov [bx], al
    shr ax, 8
    jnz decimal_loop

num_done:
    push dx
    mov dx, bx;
    mov ah, 9
    int 21h
    pop dx
    pop ax

    loop main_loop
    ret

MAIN ENDP
    END MAIN

Цей код налічує від 1 до 100 дюймів ax, будуючи вихідне повідомлення від кінця до початку. Кінець повідомлення (новий рядок та $символ, який DOS використовує для прапора в кінці повідомлення) з'являється на початку коду:

db 10, 10, '$'

Виконується як нешкідлива інструкція ( or ax, 240ah). Я міг би помістити його в більш звичайне місце, як, наприклад, після закінчення коду, але мати його за адресою 0x100 має перевагу.

Код також використовує 2 додаткових лічильника:

  • Підрахунок від 3 до 0 в dl
  • Підрахунок від 5 до 0 в dh

Коли лічильник досягає 0, він підштовхує рядок Fizzабо Buzzдо кінця вихідного повідомлення. Якщо це станеться, bxзменшиться, і bhбуде нульовим. Це використовується як умова виведення числа в десятковій формі.

Примітка. Тут я використовую 32-бітні дані. Це не працюватиме на комп'ютері до 386.


Чи дійсно TASM обробляє багатобайтові константи символів у протилежному порядку від NASM ? У NASM ви пишете, mov [mem], 'Fizz'щоб зберігати Fizzв такому порядку в пам'яті відповідні dbдирективи. Наприклад, дивіться мій складний "ефективний" YASM FizzBuzz .
Пітер Кордес

1
Чи зберігає це будь-які байти для використання std, тоді stosb/ stosd? Ви повинні були б замінити test bh,bhз cmp di, 100hабо що - то. Замість того, щоб заощаджувати / відновлювати лічильник в AL, ви можете тримати його в BL та просто клобірувати, коли захочете. Наприклад , sub bx, 4/ mov dword ptr [bx], 'zzuB'3 + 7 байт, вірно? mov eax, 'zzuB' / stosdстановить 6 + 2 байти (префікс розміру операнду на обох). Було б добре, якби відповідь включала розбирання, щоб розміри інструкцій були видні.
Пітер Кордес

1
Це чудова відповідь - зловживання доброякісними інструкціями щодо даних та використання ніколи не використовуваного простору пам’яті PSP. @PeterCordes Я грав з вашими пропозиціями, використовуючи, stosdале не зміг самостійно встановити будь-яке зниження балів. Оскільки згодом stosdдекременти, DIви не втратите, sub di, 4і тоді у вас залишиться DI4 байти в кінці. Я зміг -6 bytesвикористати кілька інших незначних твіків, які я опублікував як окрему відповідь (лише тому, що я не міг вміститись у всіх коментарях). Кудо!
640 Кб

11

постійний струм, 64 62 байти

[[Fizz]P]sI[[Buzz]P]sU[dn]sNz[zdd3%d0=Ir5%d0=U*0<NAPz9B>L]dsLx

Безголовки:

[[Fizz]P]sI  # macro I: print "Fizz"
[[Buzz]P]sU  # macro U: print "Buzz"
[dn]sN       # macro N: print current stack depth

z            # increase stack depth

[            # Begin macro
  zdd           # Get current stack depth and ducplicate it twice
  3%d0=I        # Check modulo 3 and leave a duplicate. If it's 0, run macro I
  r             # Rotate top two elements, bringing up the stack depth again
  5%d0=U        # Check modulo 5 and leave a duplicate. It it's 0, run macro U
  *             # Multiply the duplicates of modulos of 3 and 5 ...
  0<N           # ... if it's not 0, run macro N
  AP            # Print a newline (`A` is 10)
                # The macro leaves the stack with one more element each time
  z9B>L      # Run macro L if stack depth is less than "ninety eleven" (101)
]         # End macro

dsLx  # store the macro in register L and execute it
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.