FizzBuzz, или почему программисты не умеют программировать

    [Автор этой статьи — Джеф Этвуд (Jeff Atwood), один из основателей stackoverflow.com. Сама же статья, несмотря на довольно приличный возраст (она написана в 2007 году) до сих пор популярна, а введенный в ней термин «FizzBuzz question» стал общеупотребительным. Оригинал можно найти здесь.]

    Я весьма скептически отнесся к следующему наблюдению Реджинальда Брейтвайта (Reginald Braithwaite):

    «Меня немного удручает тот факт, что 199 из 200 соискателей программистских вакансий не умеют программировать. Повторю: они не умеют писать код. Вообще.»

    Реджинальд ссылается на статью человека, ответственного за прием новых сотрудников, которому приходится отфильтровывать множество программистов, не умеющих писать код:

    «Проведя достаточно собеседований, я понял, что при написании кода неопытные люди спотыкаются вовсе не на сложных и неочевидных задачах, и даже не на мелких задачах (например, реализовать связный список). Больше всего проблем у них вызывают совершенно тривиальные задачи.

    Я решил разработать набор вопросов, которые позволили бы мне быстро идентифицировать таких «недопрограммистов». Вопросам такого рода я дал название «FizzBuzz questions», в честь игры, в которую играют британские школьники. Типичный FizzBuzz question выглядит следующим образом:

    Напишите программу, которая выводит на экран числа от 1 до 100. При этом вместо чисел, кратных трем, программа должна выводить слово «Fizz», а вместо чисел, кратных пяти — слово «Buzz». Если число кратно и 3, и 5, то программа должна выводить слово «FizzBuzz»

    Нормальный программист должен написать такую программу на бумажке за пару минут. Но вот что интересно: многие люди с профильным образованием вообще не могут справится с этой задачей. Были даже случаи, когда кандидаты, подававшие резюме на вакансию «Senior developer» тратили на эту программу больше 15 минут.»

    Дэн Кигель (Dan Kegel) рассказывает о похожих впечатлениях при приеме на работу начинающих программистов:

    «Неожиданно много соискателей (в том числе имеющих магистерские степени и PhD по информатике!) затрудняются ответить на простейшие вопросы. Я сам видел, как люди на собеседованиях не могут написать цикл, итерирующий от 1 до 10 или не знают, какое число в шестнадцатеричной системе идет после F. Что до менее очевидных примеров, то довольно много кандидатов не знают, как применить рекурсию для решения какой-либо практической задачи. Согласитесь, всё это совершенно базовые вещи, и если человек затрудняется с ответом на подобные вопросы, значит у него попросту нет опыта программирования.

    Возьму на себя смелость говорить от лица всех программистов, которым приходится проводить собеседования: мы страшно устали общаться с людьми, которые в программировании ни в зуб ногой. Поверьте, если вы можете написать цикл от 1 до 10 на всех языках, указанных в вашем резюме, если вы можете решить в уме несложный арифметический пример и если вы знаете, как применить рекурсию в несложной (но взятой из реальной жизни) задаче — то вы уже на голову выше большей части людей, вращающихся в нашей индустрии.»

    После прочтения этих трех статей, я не на шутку забеспокоился. Я действительно хочу принимать на работу свежеиспеченных IT-специалистов — тех, кто только что получил образование, но еще не имеет опыта работы. В самом деле, ребята должны как-то начинать свою карьеру, почему бы мне им в этом не помочь? Но меня просто выводит из себя тот факт, что человек, не умеющий писать даже простейшие программы, имеет наглость называть себя программистом. Я считаю это оскорблением для тех, кто носит это звание по праву.

    Известно, что между состояниями «я учусь программировать» и «я умею программировать» лежит огромная пропасть. Я полагал, что у каждого, кто хоть раз подавал резюме на вакансию программиста, эта пропасть уже позади. Но практика показывает, что это совсем не так. Более того, я прихожу к выводу, что предварительное отсеивание кандидатов вопросами типа FizzBuzz просто необходимо, иначе мы будем бездарно тратить кучу времени на собеседования с программистами, которые таковыми не являются.

    Для тех из вас, кто считает задачу о FizzBuzz чересчур простой (она, впрочем, намеренно тривиальна), я приведу комментарий из поста о собеседованиях, на который мы ссылались в начале статьи:

    «Я бы не советовал людям, проводящим собеседования, отметать задачу о FizzBuzz как слишком примитивную. Положитесь на нее, и вы (как и я в свое время) будете неприятно удивлены, увидев, насколько много соискателей не имеют даже базовых навыков программирования»

    Я считаю, что глупо проводить собеседование с человеком, не посмотрев сначала его код. Процесс собеседований в нашей фирме требует, чтобы кандидат предоставил нам фрагмент своего кода еще до телефонного собеседования. А если дело доходит до личного собеседования, то мы обязательно даем кандидату небольшую задачу по программированию, которую он должен решить при нас. Ничего сверхсложного, просто небольшое упражнение на час-полтора, позволяющее проследить все этапы создания работающего приложения. Должен вам сказать, что такая стратегия великолепно работает. Благодаря ей на собеседованиях мы разговариваем о программировании, а не погрязаем в сотнях задачек на сообразительность.

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

    UPDATE:
    Лучшие реализации FizzBuzz в комментах:
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 570
    • +83
      Смысл всей статьи в одном предложении: «При приёме на работу нового программиста дайте ему тестовое задание»
      • +9
        Кратк. — сес. тал.! Ловите плюс :)
        • +2
          Краткость — сестра нашего брата.
          • 0
            По слухам, автор этого выражения скатился в УГ… :(
            • 0
              Тут есть несколько различных мнений.
              Скажем, 4duk.ru/ местами очень неплох.
        • НЛО прилетело и опубликовало эту надпись здесь
          • +16
            Смысл всей статьи — дайте ему ПРОСТЕЙШЕЕ тестовое задание.
          • –1
            хуже бывает, когда тестовое задание дают на несколько дней домой. если на собеседовании, то это отличная практика.
            • –3
              Знаете, помоему даже всё проще. Если у человека опыт работы 2-3 года по CV, но при этом там PHP/JavaScript/Python/Ruby/Java — уже можно пропускать CV :)

              Я лично ненавижу задания на собеседовании, и этому несколько причин:
              1. Я человек работающий, и как правило вырываюсь или на обеде, или вечером к 18. У меня нету лишних 4-х часов (или пары дней как в некоторых случаях).
              2. Я не помню алгоритмы из головы (ну сортировку пузырьком конечно напишу :) ), а математику так и подавно (те вещи, которые по сложнее. Не лежит у меня к вышке).

              Эти два пункта как правило то, из-за чего я просто не иду на некоторые собеседования, хотя по критериям подхожу на ура.

              Прислать кусок кода если честно меня обычно тоже коробит. Просто потому, что ну пришлю я вам файл контроллера, или модели. И что? Половина там будет по стандартам фреймворка, вторая половина кастомного кода тоже в стиле фреймворка. Всё это будет завязано на события и хуки в связанных моделях и скорее всего толком ничего понятно не будет. А выслать вам целый модуль я не могу, потому что это чужой код и мне за него отвалили кучу бабла (мелочевкой я не занимаюсь, натягиванием сайтов на CMS тоже не занимаюсь).

              Гораздо больше мне нравиться, когда просто спрашивают те или иные вещи и нужно просто дать ответы. Поинтересуются что я думаю по поводу тех или иных технологий, спросят о приведущих проектах, проблемах которые решал. Спросят пару базовых вещей по профилю. Всё это отвечается за 5-20 минут в зависимости от кол-ва вопросов и желания инвертирующего пообщаться по человечески. Последние 2 собеседования у меня выливались почти по часу, были очень интересные дискуссии и обмен опытом помимо стандартного интервью. Уходил с приятными ощущениями о работающих там людях и компании как таковой. Другое дело что не сложилось из-за некоторых обстоятельств (а на последнее место очень хотелось).
              • НЛО прилетело и опубликовало эту надпись здесь
                • +4
                  Даже если ищите кандидата на должность php программиста, которому все эти ваши биты и адреса до фени и он с ними никогда не сталкивается? Вообще это бредовый способ. Ответ гуглится без особых сложностей, если хотя бы примерно представлять себе суть вопроса.
                  • НЛО прилетело и опубликовало эту надпись здесь
                  • 0
                    По адресу или в числе 1234567?
                    • НЛО прилетело и опубликовало эту надпись здесь
                    • +3
                      mov dx, 1234567
                      mov al, [dx]
                      xor al, 64
                      mov [dx], al

                      так? :) (15 лет на асме не писал и честно не гуглил синтаксис)

                      • +2
                        чёрт, 1234567 это больше максимально адресуемой памяти в 8086, не говоря о том что больше размера сегмента
                        • НЛО прилетело и опубликовало эту надпись здесь
                          • +2
                            char *ptr = (char*)1234567;
                            *ptr ^= 1 << 7;
                            • 0
                              Это восьмой бит.
                              • 0
                                Ни хрена себе! Биты принято нумеровать справа и с нуля FYI.
                                • +1
                                  С нуля? Лично никогда не слышал термина «нулевой бит».
                                  Под «первым битом» всегда имелся ввиду самый наименее значимый бит. Аналогично первый байт, а не нулевой.
                                    • 0
                                      Но нумерация бит в байте, бит и байт в слове и в других многобайтовых объек-тах в различных вычислительных системах может быть различной.


                                      www.kailib.ru/part2?start=3 — третий результат на момент написания коммента (страховка от сеошников :) ) по вашей ссылке

                                      Вообще, всю жизнь воспринимал нормально как нумерацию битов (и байтов, и слов различной длины) как с нуля, так и с единицы (очень часто приходилось кодить параллельно на разных языках), но если по контексту не ясно, что нумерация конкретной сущности начинается с нуля, то всегда подразумевал нумерацию с единицы. Даже фраза «первый элемент массива имеет индекс ноль, а значит нулевой элемент равен первому» не вызывает диссонанса :D
                                      • 0
                                        Да не, понятно, что это вопрос обозначений. Можно хоть ёлочкой из середины нумеровать — главное договориться заранее. Речь идёт о том, что общепринятым обозначением является нумерация с младших битов и с нуля. Если соискатель ищет работу системного программиста и не знает, что в 99% литературы по процессорам, регистрам, портам и прочим железкам нумерация битов с нуля, то сразу делается вывод, что практики в низкоуровневом программировании у него нет. Кстати, в сетевых RFC точно такая же нумерация.

                                        По сути, это не значит, что это плохой программист, и его надо сразу прогонять. Просто именно в данных вопросах он неопытен, надо это помнить.
                            • –1
                              Не уверен, что конструкция типа *p ^= 64; не выкинет BSOD для char *p = 1234567; (тоже по памяти), тем более не уверен, что сработает *1234567 ^= 64… :(
                              • 0
                                И про приведение типа забыл за 10 лет :( Не быть мне Си программистом, да собственно и не стремлюсь :)
                          • +3
                            Плохая задача, придумайте что-то чтобы 200 из 200 отсеивались :)
                            • –2
                              А какое правильное решение???
                              Лобовое решение вида:
                              #include <stdio.h>
                              int main (int argc, char **argv)
                              {
                                  unsigned char *address = (unsigned char*)1234567;
                                  unsigned char was = address[0];
                                  printf("was %i\n",was);
                                  unsigned char became;
                                  if (was < 250){
                                      became = was + 2;
                                  }
                                  else{
                                      became = was - 2;
                                  }
                                  printf("became %i\n",became);
                                  return 0;
                              }

                              не годится, это понятно: будет Segmentation Fault.
                            • +18
                              О том и речь — задача не должна требовать больше нескольких минут на решение, поэтому и достаточно давать тривиальную, просто чтобы посмотреть как человек умеет взять и написать код. Если он это сделать умеет — то в реальной работе ничто не мешает ему смотреть алгоритмы/формулы/best practices, не экзамен же сдается.

                              Кстати некоторые мудрые преподаватели сложных дисциплин разрешают пользоваться любыми материалами во время сдачи, т.к. в реальной жизни намного важнее умение быстро найти ответ, чем помнить его наизусть
                              • +3
                                Я бы сказал, что среди хороших преподавателей дисциплин, связанных с ИТ, таковых подавляющее большинство.
                                • +1
                                  Верное замечание! Такое ощущение, что образование отметает все инструментальные достижения, требуя как и в средние века находить решение полностью из головы. Как будто готовят не специалистов в реальные условия, а игроков в интеллект-шоу
                                • 0
                                  «приведущих»
                                  Наконец-то я нашел человека, который пишет так же как я слышу!
                                • 0
                                  Зато какой резонанс — бурные обсуждения!
                                  • 0
                                    Этвуд всегда так пишет, можно только выделенное жирным читать
                                  • +10
                                    Интересно, где обучают программистов которые не могут решить задачу FizzBuzz, или сколько они заплатили за свой диплом?
                                    • +27
                                      У нас в университете выпускали программистов, которые платили мне, чтобы я решал FizzBuzz за них.
                                      • +8
                                        У нас тоже такое было, но все-таки эти люди не шли работать программистами после ВУЗа
                                        • 0
                                          Аналогично! Причём, непонятно зачем они вообще шли учиться «программистами», если не собирались ими работать. По логике они должны были ещё на первом курсе поняв что не тянут перевестись на другой факультет.

                                          PS только я тогда брал не деньгами (и нет не борзыми щенками), а дискетами. Так как дискеты от Verbatim часто дохли чуть ли не при первой попытке с них что-нибудь считать.
                                          • 0

                                            Странно, у меня вербатимки как на подбор были самыми качественными и долгоживущими, в отличие от остальных

                                            • 0
                                              У меня самыми живучими были FujuFilm и FujiKawa (FujiFilm проработал более 10 лет до самого выхода дискет из обращения, а на FujiKawa через 10 лет появился бад-сектор). А вот Verbatim — часто дох.
                                        • 0
                                          о! Коллега :) На первом курсе аналогично зарабатывал себе на обед.

                                          Знаю некоторых вечерников-выпускников МИРЭА IT специальностей. Вопрос про шаблоны проектирования вешает мозг. :)
                                          • +10
                                            Я до четвертого курса так зарабатывал :)
                                            На втором курсе мой «заготовок для курсача по C++» купило 15 человек. Из них только шестеро додумались его хотя бы запустить на досуге, хотя я заранее говорил, что это полуфабрикат, который нужно будет самому доделать под себя. Остальные пришли с невинным лицом с день сдачи и обнаружили, что там в разделе About написано Made by Vasya Pupkin, чему препод был несказанно рад…
                                            • +6
                                              Если уж продавали, можно было выдать персональные лицензии )
                                              • +1
                                                За те деньги, которые стоит индивидуальная домашняя работа, ее только один человек захотел купить )
                                            • +1
                                              IT специальность != программирование, и про шаблоны проектирования они ничего знать не должны.
                                              • 0
                                                уточните, пожалуйста, термин «IT специальность»
                                                • +1
                                                  Наверное: системник пропылесосить и картридж в принтере заменить :)
                                          • 0
                                            Есть некоторые лицеи, которые выпускают 3-4 человек с выпуска, которые это могут решить :)
                                            • 0
                                              А из лицеев или институтов вообще выгоняют, если не за огромные прогулы или неуплату?
                                              У меня сложилось мнение, что в России сколько человек пришло учиться, столько и будет выпущено с дипломами в итоге — главное хоть иногда появляться.
                                              • +1
                                                Ну, у меня, например, с пятого курса отчислили одногруппницу, которая получала президентскую стипендию и заняла первое место в республике по высшей математике, но при всём при этом продолжают учиться люди, для которых создать объект в С++ — проблема.
                                                • –1
                                                  Это у вас приличное учебное заведение еще.

                                                  Я в свое время бросил НГТУ, специальность «Защита информации» (http://ciu.nstu.ru/kaf/zi) — работать нужно было. А мой одногруппник, успешно закончивший и получивший диплом инженера, недавно спросил меня, что такое SHA1. При этом он несколько лет работает в сфере webdev (правда, на ActionScript в основном, но не суть). Другие ребята, которые ушли от информатики дальше, боюсь, и того меньше знают. Печально это все.
                                                  • 0
                                                    За что отчислили, не скажете? Просто интересно.
                                                    • +1
                                                      Просто на нашей кафедре очень много вахтёров. Например, один вообще издевается, доводит людей, что они уже плачут: один человек, защищая лабу стоял перед ним, и у него уже руки тряслись (так перенервничал), а этот вахтёр — улыбался(и это хорошо всем было видно), шутил по-своему над ним, унижал, но при этом напрямую не оскорбляя. Мог назначить время пересдачи, прийти за пять минут до конца, принять у кого-то одну лабу и сразу свалить домой, при том что больше 20-ти человек висит. Он у нас 1С вёл.
                                                      • +8
                                                        Ощущение, что у него комплексы от того, что он ведет неполноценный ЯП и он их на студентах вымещает.
                                                        • 0
                                                          Нет, на самом деле он очень умный человек(постоянно ездит на конференции заграницу по нейронным сетям и занимает на них призовые места), но с ним даже другие молодые преподы не дружат и не разговаривают, ну и если он с ними первым не поздоровается, то с ним никто первым здороваться не будет(по крайней мере я такого ни разу не видел за все 5 курсов).
                                                          • 0
                                                            У него не комплексы, у него звездочка загорелась
                                                      • +2
                                                        Мне на 3-м или 4-м курсе (специальность 220100) поставили неуд на экзамене по «C++ и объектно-ориентированное программирование» за использование конструкции x?a:b; Препод сказал что такого вообще нет и это я сам всё придумал :-D

                                                        А так как это была последняя капля то через некоторое время я из универа отчслился. 2 года армии (там итшники очень востребованы), а потом работаю по специальности. Админ, программер и т.д.
                                                        • +2
                                                          В армии востребованы айтишники? Оо
                                                          • +2
                                                            Компы везде есть. Так что да.
                                                            • +1
                                                              Был связистом. Сетка довольно немаленькая. Видеонаблюдение (Videonet), охранная сигнализация и много ещё в этом духе.
                                                              • 0
                                                                Речь наверное даже не об администрировании сеток и т. п., а о «печатных машинках» где-нибудь на КП роты или в штабе батальона.
                                                                • +1
                                                                  Ну, «печатные машинки» это отдельная тема. Я имел в виду именно более интересное: протяжка сетки, настройка, серваки, интернет. Серваки видеонаблюдения и охранки. Плюс начальство тоже люди — одному дома помочь что-то настроить, другому :-) Я в связисты попал когда у комбата кто-то пароль поставил на биос, он спросил у взвода «кто могёт убрать?». Ну я вызвался, быстренько сбросил парой командой в debug (на том компе DOS стояла). В результате чуть ли не карьеру там сделал :-D Но слава богу хватило ума по контракту не остаться.
                                                              • 0
                                                                Да. Любой умеющий нормально обращаться с компьютером человек может получать поблажки.
                                                                Но это всё равно армия с дисциплиной и идиотами )
                                                                • +1
                                                                  Кстати дисциплина не есть плохо :-) Идиотов да, хватало.
                                                              • 0
                                                                Мне на 3-м или 4-м курсе (специальность 220100) поставили неуд на экзамене по «C++ и объектно-ориентированное программирование» за использование конструкции x?a:b; Препод сказал что такого вообще нет и это я сам всё придумал :-D

                                                                Что-то мне анекдот про крысу, хомяка и пиар вспомнился. :-)
                                                                Ни одному препаду не приходило в голову сомневаться в моих знаниях.
                                                            • 0
                                                              У меня на курс был набор 125 чел., вышло примерно 80(2 группы из 5 сократили ибо слишком маленькие группы получались).
                                                              Правда приходилось преподам помогать понять почему не работают те или иные программки из задачника на паскале :)
                                                              А на самых модных факультетах вообще был бейсик :)
                                                          • +1
                                                            Не поверишь, я когда искал людей с такими встречался каждый божий день (иногда 12-ти летние пацанята с форумов, бывает дадут фору «соискателям» с высшими образованиями и кучей страшных слов в «резюме»)
                                                            • НЛО прилетело и опубликовало эту надпись здесь
                                                              • 0
                                                                «Нормальный программист должен написать такую программу на бумажке за пару минут. „
                                                                наверное 5 минут было по их мнению слишком долго:) А может им ваш почерк не понравился, прическа или еще что-нибудь в этом роде.
                                                                • 0
                                                                  Мой бывший шеф несколько лет назад размещал вакансии в службе занятости из-за каких то льгот или освобождения от какого-то налога (Украина). Вакансии естественно были липовыми. Но люди звонили, даже приходили на собеседование… Так что всякое бывает.
                                                              • 0
                                                                В СПбГУ например, у нас на кафедре Технологии Программирования, где-то четверть бы не справилась
                                                                • 0
                                                                  очень странно, что с этой задачей можно вообще не справиться.
                                                                  всего два условия на кратность, тут надо либо не знать про цикл for, либо не знать синтаксиса определения остатка/кратности какому-либо числу.
                                                                  нет, неужели 199 из 200?
                                                                  • +1
                                                                    запороться можно на двойной кратности и на else, как только решишь оптимизировать (а на собеседовании же не хочется выглядеть неэффективно кодирующим) программу, чтобы не писать 4 взаимоисключающих if в лоб, ежу понятно, что раз условия взаимоисключающие, то как минимум без одного условия можно обойтись, но начинаются трудности с определением какого. Плюс явная подсказка на ещё одну оптимизацию, что FizzBuzz состоит из Fizz+Buzz и начинается путаница с двумя одновременными оптимизациями в уме. Вообще хороший тест на выявление не только тех, кто синтаксис не знает, но и на любителей преждевременной оптимизации или писать сильно вложенный код там, где можно обойтись плоским (пускай и не таким эффективным)

                                                                    Даже здесь в комментах выложили нерабочие решения, что уж говорить…
                                                                • +1
                                                                  у меня в группе 27 человек и из всех, помимо меня, код могут писать еще человека 4.
                                                                  а в дипломе всем напишут: «профессионал в области программирования»
                                                                  • +1
                                                                    У нас препод вообще говорил «Чем меньше вы знаете, тем больше я стою как специалист» :)
                                                                  • +4
                                                                    В трех фирмах принимал людей. Солгласен. Если берете людей с опытом, то около половины не умеют писать код. Именно поэтому не задаю задачи на сообразительность (стиля микрософт), а
                                                                    1. Задача на минимальное программирование (чуть посложнее чем приведенные тут). Причем можно в превдо коде, а не на каком то языке
                                                                    2. Технологческая задача — придумать как что то делать — без написания кода — например придумать свою сериализацию для какой то цели

                                                                    Основная причина — люди не интересуются. Пишут свой кусочек, им код ревью не делают, их вся система, технологии, качество кода не интересует. И получаются люди с опытом в 3-5-7 лет пишущие ооочень плохо и ничего не знающие.

                                                                    50% заваливаются на вопросе «опишите архитектуру продукта в котором вы работали последние Х лет»
                                                                    • +7
                                                                      А я, честно сказать, сперва напрягся. Но проверил и уложился в минуту.
                                                                      • –16
                                                                        На груви. За 53 секунды :)

                                                                        for (n in 1..100) {
                                                                        if (n%3 == 0 && n%5 != 0) println 'Fizz'
                                                                        else if (n%5 == 0 && n%3 != 0) println 'Buzz' else
                                                                        if (n%5 == 0 && n%3 == 0) println 'FizzBuzz' else
                                                                        println n
                                                                        }
                                                                        • 0
                                                                          На Haskell:
                                                                          fizzbuzz x | divides x 3 && divides x 5 = "FizzBuzz"
                                                                                     | divides x 3 = "Fizz"
                                                                                     | divides x 5 = "Buzz"
                                                                                     | otherwise = show x
                                                                            where
                                                                            divides x n = x `mod` n == 0
                                                                          
                                                                          main = mapM (putStrLn . fizzbuzz) [1..100]
                                                                          
                                                                          • +40
                                                                            у вас обоих первое условие лишнее
                                                                            — если кратно трем выведем Fizz
                                                                            — если кратно пяти выведем Buzz

                                                                            а если кратно и трем, и пяти — FizzBuzz получится само)
                                                                            • +6
                                                                              В Хаскелле, чтобы оно само так получилось, надо несколько по-другому написать.
                                                                              Можно конечно, но никто не может сказать, что этот вариант неправильный.
                                                                              Он как раз видится мне тру-функциональным :)
                                                                              • –1
                                                                                возможно, я говорил о логике
                                                                                • 0
                                                                                  С точки зрения логики тут все нормально, выполняются оба условия -> выводим FizzBuzz, а то что все условия надо проверять не более одного раза — это подразумевается в нестрогой семантике Haskell'я. И компилятор все сделает как надо.
                                                                                  Это лишь декларативное описание соответствия входных данных желаемым выходным не отражающее то, как оно будет вычисляться в реальности.
                                                                              • +11
                                                                                Простите, но ваше утверждение верно только для императивных языков.
                                                                                То есть в Хаскелле, конечно, можно присобачить эту императивщину и получить грязную функцию. Но это быдлокодинг и неуважение к такому языку.
                                                                                • +4
                                                                                  +1 такого рода оптимизации это вообще задача компилятора — надо писать максимально близко к формулировке задачи.
                                                                                  • 0
                                                                                    «надо» каждый сам для себя определяет
                                                                                    мне вот надо писать максимально минимально, при этом чтобы задача была решена
                                                                                    • +5
                                                                                      >> максимально минимально
                                                                                      o_O
                                                                                      • +2
                                                                                        Писать надо в первую очередь понятно. Минимально писать конечно круто — можно быть уверенным что вас никто не уволит, т.к. фиг кто когда то разберется в том, что вы там накодили, но это не дело.
                                                                                        • 0
                                                                                          >мне вот надо писать максимально минимально, при этом чтобы задача была решена

                                                                                          «Спасибо, вы нам не подходите».

                                                                                          В тот момент, когда количество разработчиков проекта переваливает отметку «1», писать надо не «максимально минимально», а максимально понятно. Причём без понтов вида «на самом деле это понятно, а если кому-то непонятно, то он сам идиот, а я умный».
                                                                                      • 0
                                                                                        опять же, возможно
                                                                                        я с хаскеллом не знаком, может быть в двух словах скажете в чем выражается «императивность» языка?
                                                                                        • +3
                                                                                          Команды выполняются последовательно, есть присваивания.

                                                                                          В чисто функциональных языках принципиально по другому — программа описывается, как математическая функция.
                                                                                          • +1
                                                                                            Вкратце:
                                                                                            императивное программирование — это когда вы описываете какие нужно выполнить действия и в каком порядке.
                                                                                            декларативное программирование — вы описываете что вы хотите получить задавая правила/формулы преобразования входных данных в выходные. Компилятор сам решает какие действия нужно выполнять и в каком порядке.

                                                                                            Почитайте все таки про Haskell — полезно для развития кругозора.
                                                                                        • +5
                                                                                          но также нужно вывести число если условия не работают
                                                                                          • –3
                                                                                            в задаче такого не было
                                                                                            • +1
                                                                                              сорри, было)
                                                                                            • +4
                                                                                              Да, кстати, даже если мы используем императивный язык. Если вы выбросите первое условие, вы лишитесь взаимоисключающей конструкции. И в этом случае вам все равно перед выводом числа придется дополнительно проверять, а не было ли уже что-то выведено для этого числа. Иначе ваша программа выплюнет что-то типа «FizzBuzz15».

                                                                                              Вот благодаря своим оптимизациям вы бы и не попали туда на работу. ;)
                                                                                              • –3
                                                                                                а зачем выводить число? я не нашел такого в задаче
                                                                                                • 0
                                                                                                  уже нашел. но мне кажется что суть не меняется все-таки — число выводим отдельно, физбазз — отдельно
                                                                                                  • +6
                                                                                                    блин. вы победили, а я — невнимательный, не увидел слово «вместо»
                                                                                                    • +1
                                                                                                      Хорошо отношусь к людям, признающим свой промах, посему плюс вам. :)
                                                                                                      Жаль, не могу добраться до того стада, которое бездумно плюсовало, не думая своей головой. ]:->
                                                                                                • 0
                                                                                                  я после первого прочтения задачи подумал, что подвох будет именно в этом. Хотя, похоже, задачка вообще не задумывалась как задача с подвохом)
                                                                                                  • 0
                                                                                                    А куда тогда девать условие 'не кратно 3 и 5'?
                                                                                                    По плюсам сразу видно что тема актуальна )
                                                                                                    • 0
                                                                                                      Fizz\nBuzz получится, а нее FizzBuzz.
                                                                                                      • 0
                                                                                                        функция вызывается один раз для одного x. если несколько клоз удовлетворяют условию, будет использована первая. так что код правильный
                                                                                                      • +7
                                                                                                        perl -le '$_ % 3 ? $_ % 5 ? $_ : "Buzz" : $_ % 5 ? "Fizz" : "FizzBuzz" for 1 .. 100'
                                                                                                        • +6
                                                                                                          Вот за такой код в реальном проекте я готов оторвать руки, у меня нет ни малейшего желания распутывать хитросплетения воспаленного мозга автора кода, когда нужно что-то исправить или просто понять, что код делает. Сравните

                                                                                                          foreach my $i (1..100) {
                                                                                                          unless($i % 3) {
                                                                                                          print «Fizz»;
                                                                                                          }
                                                                                                          unless($i % 5) {
                                                                                                          print «Buzz»;
                                                                                                          }
                                                                                                          if($i % 3 && $i % 5) {
                                                                                                          print $i;
                                                                                                          }
                                                                                                          print "\n";
                                                                                                          }
                                                                                                          • +5
                                                                                                            А вы расслабьтесь, FizzBuzz это не реальный проект :)
                                                                                                            • +4
                                                                                                              Одна из целей FizzBuzz как раз в том, чтобы увидеть пример кода кандидата.
                                                                                                              Если бы вы пришли ко мне на собеседование и написали решение в таком виде — вы бы не прошли :)
                                                                                                              • +3
                                                                                                                Цель FizzBuzz — увидеть, способен ли человек думать мозгами. Кода в этой задаче маловато для того, чтобы оценивать его красоту.
                                                                                                                • +2
                                                                                                                  >Цель FizzBuzz — увидеть, способен ли человек думать мозгами.

                                                                                                                  А может вы недостаточно глубоко смотрите?

                                                                                                                  >Кода в этой задаче маловато для того, чтобы оценивать его красоту.

                                                                                                                  Для того, чтобы оценить стиль кода — вполне достаточно. По крайней мере ваш стиль я уже «оценил» :)
                                                                                                                  • +5
                                                                                                                    Это вообщет шутка старого перловика была.
                                                                                                            • +1
                                                                                                              Мдэ, все пробелы съелись

                                                                                                              foreach my $i (1..100) {
                                                                                                                unless($i % 3) {
                                                                                                                  print «Fizz»;
                                                                                                                }
                                                                                                                unless($i % 5) {
                                                                                                                  print «Buzz»;
                                                                                                                }
                                                                                                                if($i % 3 && $i % 5) {
                                                                                                                  print $i;
                                                                                                                }
                                                                                                                print "\n";
                                                                                                              }
                                                                                                              
                                                                                                              • +2
                                                                                                                Ну что вы так близко к сердцу принимаете. Это всего лишь вопрос договоренностей.

                                                                                                                Я вот, например, за unless руки отрываю :)
                                                                                                                • 0
                                                                                                                  почему?
                                                                                                                  • +1
                                                                                                                    Потому что это тоже хитросплетения мозга. Потому что приводит к unless(! $a)

                                                                                                                    Посмотрите, например, Perl::Critic::Policy::ControlStructures::ProhibitUnlessBlocks.
                                                                                                                    • +1
                                                                                                                      Я использую unless только в одном единственном случае — в качестве замены простого условия if с отрицанием, т.к. в простом условии можно знак восклицания не заметить при беглом взгляде на код.
                                                                                                                      Т.е. вместо if(!$a) пишу unless($a) или вместо if(!($a > 5)) пишу unless($a > 5).
                                                                                                                      • 0
                                                                                                                        Я перл не знаю, но почему вместо if(!($a > 5)) нельзя написать if($a <= 5)?
                                                                                                                      • 0
                                                                                                                        За описанную выше конструкцию убивать надо, да. А за unless — зачем? Я её при валидации использую, очень удобно.
                                                                                                                        • 0
                                                                                                                          Ну, я, конечно, маленько шучу… но вообще-то не люблю unless. Избегаю. В целях неувеличения энтропии :)
                                                                                                                          • 0
                                                                                                                            unless(энтропия не увеличена)… ;)
                                                                                                                • +4
                                                                                                                  Ваша программа ничего не выводит :)
                                                                                                                • –1
                                                                                                                  Вот за это я люблю перл :)
                                                                                                                  • 0
                                                                                                                    Думаю всё же где-то так будет лучше:
                                                                                                                    perl -le 'print join "\n", map { ($_,«Fizz»,«Buzz»,«FizzBuzz»)[!($_%3)+2*!($_%5)] } 1..100'
                                                                                                                • +13
                                                                                                                  зачем делать отдельное условие для FizzBuzz?
                                                                                                                  • +1
                                                                                                                    Да, тоже так подумал :)
                                                                                                                    На Ruby(не бейте больно, второй день трогаю — уверен, есть более лаконичный вариант)
                                                                                                                    def fizzbuzz
                                                                                                                    res=""
                                                                                                                    (1..100).to_a.each do |elem|
                                                                                                                    res+=«Fizz» if (elem%3).zero?
                                                                                                                    res+=«Buzz» if (elem%5).zero?
                                                                                                                    res+="#{elem}" unless ((elem%3).zero? or (elem%5).zero?);
                                                                                                                    res+=","
                                                                                                                    end
                                                                                                                    res
                                                                                                                    end
                                                                                                                    puts fizzbuzz
                                                                                                                    • +2
                                                                                                                      def fizzbuzz
                                                                                                                        res=""
                                                                                                                        (1..100).to_a.each do |elem|
                                                                                                                          res+="Fizz" if (elem%3).zero?
                                                                                                                          res+="Buzz" if (elem%5).zero?
                                                                                                                          res+="#{elem}" unless ((elem%3).zero? or (elem%5).zero?);
                                                                                                                          res+=","
                                                                                                                        end
                                                                                                                        res
                                                                                                                      end
                                                                                                                      

                                                                                                                      puts fizzbuzz
                                                                                                                      • –1
                                                                                                                        res=""
                                                                                                                        100.times do |num|
                                                                                                                          elem = num+1
                                                                                                                          res+="#{elem}" unless ((elem%3).zero? or (elem%5).zero?)
                                                                                                                          res+="Fizz" if (elem%3).zero?
                                                                                                                          res+="Buzz" if (elem%5).zero?
                                                                                                                          res+=","
                                                                                                                        end
                                                                                                                        puts res
                                                                                                                        
                                                                                                                        • +1
                                                                                                                                (1..100).map do |i|
                                                                                                                                  puts i, [
                                                                                                                                          (i % 3).zero? ? "Fizz" : nil,
                                                                                                                                          (i % 5).zero? ? "Buzz" : nil
                                                                                                                                  ].compact.join
                                                                                                                                end.compact
                                                                                                                          


                                                                                                                          Можно и еще более извращенными способами.
                                                                                                                          • –1
                                                                                                                            Эх, поспешил
                                                                                                                                  (1..100).each do |i|
                                                                                                                                    puts i, [
                                                                                                                                            (i % 3).zero? ? "Fizz" : nil,
                                                                                                                                            (i % 5).zero? ? "Buzz" : nil
                                                                                                                                    ].compact.join
                                                                                                                                  end
                                                                                                                            
                                                                                                                            • 0
                                                                                                                              Не катит. Выводит числа 3, 5, 15 и т.д.
                                                                                                                              100.times do |i|
                                                                                                                                num=i+1
                                                                                                                                [ (num % 3).zero? ? "Fizz" : nil,
                                                                                                                                  (num % 5).zero? ? "Buzz" : nil
                                                                                                                                  ].compact.join.display
                                                                                                                                num.display unless (num % 3).zero? or (num % 5).zero?
                                                                                                                                puts
                                                                                                                              end
                                                                                                                              
                                                                                                                              • +4
                                                                                                                                Да, невнимательно прочитал условие

                                                                                                                                      (1..100).each do |i|
                                                                                                                                        puts (a = [
                                                                                                                                                (i % 3).zero? ? "Fizz" : nil,
                                                                                                                                                (i % 5).zero? ? "Buzz" : nil
                                                                                                                                        ].compact.join).empty? ? i : a
                                                                                                                                      end
                                                                                                                                


                                                                                                                                100.times, в вашем случае, начнет отсчет с нуля и закончит на 99.
                                                                                                                                • +1
                                                                                                                                  в коде используется переменная на 1 больше счетчика.
                                                                                                                                  • 0
                                                                                                                                    Извиняюсь, пропустил вторую строку. Пойду спать
                                                                                                                                    • +1
                                                                                                                                      Обалденный вариант :)
                                                                                                                                      • 0
                                                                                                                                        Его можно записать с одну сроку, превратив Руби в плохой Перл :)
                                                                                                                                        puts (1..100).map { |i| (a = [(i % 3).zero? ? "Fizz" : nil, (i % 5).zero? ? "Buzz" : nil].compact.join).empty? ? i : a }
                                                                                                                                        
                                                                                                                                        • НЛО прилетело и опубликовало эту надпись здесь
                                                                                                                                          • НЛО прилетело и опубликовало эту надпись здесь
                                                                                                                                            • 0
                                                                                                                                              Вот на Scala

                                                                                                                                              println(1 to 100 map( i => if (i%3==0) "Fizz" else if (i%5==0) "Buzz" else if (i%15==0) "FizzBuzz" else i ))

                                                                                                                                            • +1
                                                                                                                                              У меня тоже похоже вышло. Читаемости правда никакой, зато коротко:)
                                                                                                                                              1.upto(100){|i|s=i%3==0?'fizz': '';s+='buzz'if i%5==0;puts s==''?i: s}
                                                                                                                                      • 0
                                                                                                                                        Довел до конца ваш вариант.
                                                                                                                                        100.times do |i|
                                                                                                                                          num=i+1
                                                                                                                                          [ (num % 3).zero? ? "Fizz" : nil,
                                                                                                                                            (num % 5).zero? ? "Buzz" : nil,
                                                                                                                                            ((num % 3).zero? or (num % 5).zero?) ? nil : num,
                                                                                                                                            ","
                                                                                                                                            ].compact.join.display  
                                                                                                                                        end
                                                                                                                                        
                                                                                                                                        • +1
                                                                                                                                          А я так сделал:

                                                                                                                                          (1..100).each do |i|  
                                                                                                                                            puts (s = "#{"Fizz" if (i % 3).zero?}#{"Buzz" if (i % 5).zero?}").empty? ? i : s 
                                                                                                                                          end
                                                                                                                                          
                                                                                                                                          • 0
                                                                                                                                            Так это че за язык? Пишите все язык, плиз.
                                                                                                                                            • 0
                                                                                                                                              Класс у подсветки синтаксиса — ruby
                                                                                                                                              • 0
                                                                                                                                                Вы считаете нормальным изучать исходники страницы, для выяснения того, на каком языке написан фрагмент одного из сотен комментов? Я-то ruby опознал, но вот не уверен, что, например, отличу Scheme от CommonLisp (вернее уверен, что не отличу).

                                                                                                                                                Если вы просто подсказали человеку, на каком языке этот тред, не имея в виду, что он мог сам посмотреть исходники, приношу свои искренние извинения.
                                                                                                                                          • +1
                                                                                                                                            вот это синтаксис! код сразу понятен и при этом очень коротко записан!
                                                                                                                                          • +5
                                                                                                                                            Например вот так, на перле:
                                                                                                                                            for (1..100)
                                                                                                                                            {
                                                                                                                                              print (  (!($_%3) && !($_%5))?'FizzBuzz':(!($_%3)?'Fizz':(!($_%5)?'Buzz':$_)) );
                                                                                                                                            }


                                                                                                                                            • +15
                                                                                                                                              PHP — это маленькое зло, созданное некомпетентными новичками, в то время как Perl — это большое и коварное зло, созданное умелыми, но извращёнными профессионалами.
                                                                                                                                              • +1
                                                                                                                                                0_o Блин. Теперь perl у меня ассоциируется со смайликами $_%
                                                                                                                                                • +1
                                                                                                                                                  Можно сделать красивее, как например тут.
                                                                                                                                                  А я добавил скобок, для большей читаемости %).
                                                                                                                                                  • +3
                                                                                                                                                    Эти смайлики плачут кровавыми слезами.
                                                                                                                                          • 0
                                                                                                                                            ну вот) опередили
                                                                                                                                            • 0
                                                                                                                                              Вот-вот. :) Я полагаю, именно это и имелось ввиду, когда автор говорит о том, что люди не умеют программировать…
                                                                                                                                              • +3
                                                                                                                                                Упомянутая недооптимизация требует дополнительной проверки того, что мы не вывели уже эти физы-базы. Из-за этого код становится менее читабельным, чем если бы содержал 4 условия.

                                                                                                                                                Если бы меня не приняли из-за этого на работу, то я был бы только рад: нахер нужна ТАКАЯ работа?!
                                                                                                                                                • +3
                                                                                                                                                  действительно — пааадумаешь, что условие задачи не выполнено :-) важно ж, чтобы красиво.
                                                                                                                                              • +8