Когда-то я читал этот вопрос / ответ на Quora
Есть ли действительно программисты со степенью информатики, которые не могут пройти тест FizzBuzz
Этот код дан как очевидный ответ
for i in range(1, 100):
if i % 3 == 0 and i % 5 == 0:
print "FizzBuzz"
elif i % 3 == 0:
print "Fizz"
elif i % 5 == 0:
print "Buzz"
else:
print i
Конечно, FizzBuzz был забит до смерти, но это не тот вопрос, о котором идет речь. Вы видите, что в комментариях кто-то упоминает, что этот очевидный ответ великолепен, поскольку легко добавить дополнительные условия, такие как print «Jazz» для кратных 4. (Я не согласен. Для расширения этой схемы требуется O (2 ** n). ) строки кода.)
Ваша задача состоит в том, чтобы написать самую красивую версию FizzJazzBuzz в соответствии с вашими коллегами.
Некоторые вещи для избирателей, чтобы рассмотреть:
- DRY
- Эффективность операций деления / модуля
Во многих ответах по Quora использовался Python, но здесь нет таких языковых ограничений.
Я приму ответ с большинством голосов через месяц
Образец вывода:
1
2
Fizz
Jazz
Buzz
Fizz
7
Jazz
Fizz
Buzz
11
FizzJazz
13
14
FizzBuzz
Jazz
17
Fizz
19
JazzBuzz
Fizz
22
23
FizzJazz
Buzz
26
Fizz
Jazz
29
FizzBuzz
31
Jazz
Fizz
34
Buzz
FizzJazz
37
38
Fizz
JazzBuzz
41
Fizz
43
Jazz
FizzBuzz
46
47
FizzJazz
49
Buzz
Fizz
Jazz
53
Fizz
Buzz
Jazz
Fizz
58
59
FizzJazzBuzz
61
62
Fizz
Jazz
Buzz
Fizz
67
Jazz
Fizz
Buzz
71
FizzJazz
73
74
FizzBuzz
Jazz
77
Fizz
79
JazzBuzz
Fizz
82
83
FizzJazz
Buzz
86
Fizz
Jazz
89
FizzBuzz
91
Jazz
Fizz
94
Buzz
FizzJazz
97
98
Fizz
JazzBuzz
источник
Ответы:
Самая красивая версия, говорите? Тогда давайте попробуем это в ...
Шекспировский язык программирования
Так, после моей борьбы с SPL здесь , я чувствовал , что я должен был сделать , по крайней мере , один представление с ним на любой вызов. И это все.
Итак, что же все это тогда?
Итак, во-первых, мы объявляем переменные, которые мы собираемся использовать в программе, которые должны исходить из пьес Шекспира. Сытый по горло Ромео, Джульеттой, Офелией и Отелло, я познакомился с архиепископом Кентерберийским и леди Капулетти . Их описания, а также названия Актов / Сцены игнорируются парсером, поэтому вы можете поместить туда практически все, что захотите.
Итак, давайте сделаем некоторый король перевода на что-то менее гибкое .
Акт I, Сцена I
Begin Lady Capulet = 0;
Действие I довольно простое: мы инициализируем нашу переменную с 0.
Акт I, Сцена II
Lady Capulet += 1; if(Lady Capulet < Math.pow((2*2*1+1)*(2*1),2)) continue; else goto Scene VIII;
Мы увеличиваем значение Lady Capulet и сравниваем его со 100 (да, это целое предложение служит исключительно для получения числа 100); если он не меньше, мы переходим к сцене VIII (конец); в противном случае мы переходим к следующей сцене.
Акт I, Сцена III
if(Lady Capulet % (2+1) == 0) continue; else goto Scene IV; The Archbishop of Canterbury = 2*2*2*2*2*2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*2*2*1; The Archbishop of Canterbury += 2*1+1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*2*1+1; System.out.print((char)The Archbishop of Canterbury); System.out.print((char)The Archbishop of Canterbury);
Сначала мы увидим, равен ли модуль деления на 3 0; если это не так, мы переходим к сцене IV; если это так, мы начинаем выполнять арифметические операции и сохранять их в Archieperson, выводя их в виде символов, как только мы найдем искомую. Да, в конце концов, идея заключается в том, чтобы получить
Fizz
.Акт I, Сцена IV
if(Lady Capulet % (2*2) == 0) continue; else goto Scene V; The Archbishop of Canterbury = 2*2*2*2*2*2*1+2*2*1+2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*1; The Archbishop of Canterbury += 2*2*1+(-1); System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*2*1+2*2*2*1; The Archbishop of Canterbury += 1; System.out.print((char)The Archbishop of Canterbury); System.out.print((char)The Archbishop of Canterbury);
Сначала проверяется, равен ли модуль деления на 4 0, затем продолжается та же сцена, что и раньше, для
Jazz
.Акт I, Сцена V
if(Lady Capulet % (2*2+1) == 0) continue; else goto Scene VI; The Archbishop of Canterbury = 2*2*2*2*2*2*1+2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*2*2*1; The Archbishop of Canterbury += 2*1+1; The Archbishop of Canterbury += 2*2*2*2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2+1; System.out.print((char)The Archbishop of Canterbury); System.out.print((char)The Archbishop of Canterbury); goto Scene VII;
Функции, подобные предыдущим двум, проверяют, возвращает ли модуль деления на 5 0, а затем пытается записать
Buzz
; единственная разница в том, что, в конце концов, мы пропускаем сцену.Акт I, Сцена VI
System.out.print(Lady Capulet);
Чтобы достичь этой сцены, число, принятое леди Капулетти, не должно было быть ни Fizz, ни Jazz, ни Buzz; Итак, мы выводим его в числовой форме.
Акт I, Сцена VII
The Archbishop of Canterbury = 2*2*2*1+2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*1+1; System.out.print((char)The Archbishop of Canterbury); goto Scene II;
Итак, это единственный способ, который я нашел, чтобы перейти к следующей строке: сначала выведите CR, затем LF; затем мы возвращаемся к сцене II, к которой мы можем продолжить программу.
Акт I, Сцена VIII
End.
Достаточно просто.
Я все еще пытаюсь увидеть, смогу ли я показать это в сети, но я не могу найти онлайн-компилятор - тот, который я знаю , кажется, плохо сочетается с какой-либо программой, кроме уже загруженной, или, может быть, есть какой-то проблемы с интерфейсом между клавиатурой и стулом ...
Обновление 1:
После комментария математики я отредактировал порядок сцен Джаза и Базза. Это должно быть сделано.
источник
z
и сбросить его перед каждым циклом.> <> (Рыба)
> <> - это двумерный язык программирования, в котором инструкции представляют собой одиночные символы, а указатель инструкций (IP) может перемещаться вверх, вниз, влево или вправо, в зависимости от стрелок
^>v<
и зеркал/\
. В нем нет переменных или строк, поэтому не повторять себя немного сложнее, но я думаю, что это хорошо по-своему.Мы нажимаем
1
и запускаем цикл.:9b*)?;
проверяет, является ли число больше 99 (9b* = 9*11
), и если да, то программа останавливается;
. В противном случае поместите 0 в регистр и переместитесь внизv
в волнистую часть.:3%?
проверяет число по модулю 3. Если оно ненулевое, то мы идем внизv
по ряду и движемся влево<
. В противном случае мы пропускаем стрелку вниз и нажимаем"Fizz"
, распечатываем ее (r}oooo
) и увеличиваем регистр (&1+&
), прежде чем отскакивать от правых зеркал стены, чтобы спуститься вниз. В любом случае мы в конечном итоге движемся влево по третьему ряду, пока не отскочим от зеркал левой стены. Тогда мы повторяем дляJazz
иBuzz
.Это продолжается до 7-й строки, которая проверяет значение регистра
&
. Если он ненулевой, то мы просто идем вниз. В противном случае мы печатаем сам номер передn
тем, как идти вниз.Наконец,
ao
(помните, мы сейчас движемся влево!) Печатает новую строку ASCII и1+
увеличивает число, прежде чем мы поднимемся^
и>
снова сделаем цикл .(Теперь мы ждем эстетического ответа Пита ...)
источник
LOLCODE
Элегантный? Нет. Эффективное? Точно нет. Прекрасный? Ну, вы знаете, что они говорят: красота в глазах смотрящего.
Некоторое объяснение:
Программы LOLCODE начинаются с
HAI
и заканчиваютсяKTHXBYE
.Переменные динамически набираются и назначаются с помощью
I HAS A <variable> ITZ <value>
. После определения переменные также могут быть назначены с помощью<variable> R <value>
.Петли в LOLCODE названы. Синтаксис:
Это всего лишь Интернет, говорят «цикл, пока я = конец». В LOLCODE 1.2 индексная переменная должна быть инициализирована до цикла. Здесь цикл называется «дом», потому что это делает чтение инициализации цикла звучит смешно.
VISIBLE
печатает на стандартный вывод. По умолчанию добавляется новая строка, но добавление!
подавляет новую строку.Условные обозначены следующим образом:
Условия должны быть выражениями, которые оцениваются как логические или логические значения. В LOLCODE вызывается логический тип, который
TROOF
имеет значенияWIN
(true) иFAIL
(false).Однострочные комментарии начинаются с
BTW
.Не разбираетесь в языке Internetz? Просто дайте мне знать, и я с удовольствием предоставлю дальнейшие объяснения.
источник
python3
источник
Efficiency of division/modulus operations
(3, 4, 5)
. Дублируется трижды. Это единственный верный ответ только с одним оператором модуля.DRY
вместо этого. Кроме того, этот ответ составлен ОП.болтушка
Я решил попробовать поиграть с Питом и посмотреть, какой красивый код я смог бы сделать. Я стараюсь здесь ничего не повторять, хотя, если честно, мне нужно повторить расчеты модов. Однако каждый отдельный мод (n% 3, n% 4 и n% 5) запускается только один раз за итерацию кода.
Меньшее изображение является подходящим источником, и его можно загрузить и запустить здесь .
Наслаждайтесь!
источник
Mathematica
В Mathematica вы можете определять и перегружать функции для очень специфических параметров (не только по типу, но и по произвольным логическим условиям). Давайте определим несколько функций:
И теперь фактическая программа просто
Теперь, хотя вышеупомянутое только растет линейно с количеством делителей, оно все еще не очень СУХОЕ. Но мы можем фактически использовать переменные в качестве имен в этих определениях. Таким образом, мы можем написать функцию, которая генерирует эти определения функций:
Теперь все, что вам нужно сделать, это добавить еще один
addFunction
вызов и добавить ваш новый**zz
в последнюю строку.источник
DoThe @@@ Time @@@ Warp @@@ Again /@ Range[100] // TableForm
JMP
слева!Haskell
Вы, ребята, не относитесь к СУХОЙ серьезно. Существуют очевидные паттерны, которые могут быть учтены в последовательности «Fizz Jazz Buzz».
Этот код также легко расширяемый. Чтобы решить проблему «Fizz Jazz Buzz Tizz», все, что вам нужно сделать, это добавить
Ti
послеBu
строки. Это намного меньше, чем нужно в любом другом решении.источник
fizzes = zip [3..] $ ((++ replicate 2 'z') <$> words "Fi Ja Bu") ++ ["Sausage"]
или просто вернутьсяfizzes = zip [3..] $ words "Fizz Jazz Buzz Sausage"
.replicate 2 z
немного растягивает , ,Excel VBA
Это может звучать глупо, но это 2D снайперская винтовка!
источник
Джава
Так что на самом деле Java не считается «красивой» для большинства, но это безумно субъективно, поэтому я придерживался следующих принципов:
Это не значит, что алгоритм в целом является наиболее эффективным (но это не так), но я думаю, что он хорошо подходит для обозначенных пунктов.
источник
Информ 7
Inform 7 - это язык программирования на основе правил, предназначенный для интерактивной художественной литературы. Он известен как один из самых успешных языков программирования на естественном языке. Посмотрите демонстрацию языка Inform 7 для других примеров и нескольких мелочей.
Преимущество этого кода в том, что каждое из правил FizzBuzz является полностью независимым: дополнительные правила могут быть добавлены в любой момент без необходимости изменять общую структуру. К сожалению, это немного повторяется, особенно с определениями фраз. Я мог бы определить оператор%, но тогда это был бы не английский. ;)
Этот код можно запустить онлайн с помощью Playfic .
источник
Дьялог АПЛ
items
может быть изменен на произвольный список чиселисточник
⎕ML
и⎕IO
?1
, что по умолчанию.C #
Проверьте мод, строку сборки, номер печати, если пусто, или строку, если нет. Нет повторов. Нужно только добавить условие и вывод для новых требований.
источник
i
-%
что-то много раз, а также добавляетсяs
много раз. (Много синтаксиса тоже повторяется, но это, вероятно, ошибка C #.)Python 2.7
Я пытался сделать это поэтическим ...
Я не очень хорош в любовной поэзии ...
Также было бы намного лучше без начальных констант: P
источник
TypeError: 'str' object is not callable
.Java с классами
Алгоритм:
Классы:
источник
MATLAB / Октава
Конечно, написание собственных циклов интересно для программистов, но все знают, насколько утомительным является отслеживание индексации (кто не писал
for(j=i;j<n;i++)
во вложенном цикле хотя бы раз в своей жизни?)У MATLAB есть решение. На самом деле, этот код не самый эффективный и, конечно, не кодовый, но он, безусловно, является хорошей демонстрацией более интересных функций MATLAB. Octave - это версия MATLAB для GNU; однако он не подходит для код-гольфа, поскольку он немного строже с переменными типами, что пагубно для код-гольфа.
РЕДАКТИРОВАТЬ: до тех пор, пока подсветка синтаксиса для MATLAB не существует на SE, я публикую версию с очень небольшим количеством комментариев, потому что в противном случае это был просто большой страшный блок простого текста.
источник
for(j=i;j<n;i++)
? У меня вопрос: кто это написал "хотя бы раз в жизни"? Если ты это сделал, у меня для тебя плохое новое ...for
цикле (например, при вложении циклов)? Вы парень, чей код успешно компилируется каждый раз? Если да, у меня есть для тебяj
Имя для локальных переменного цикла прекрасно, ноi
название очень плохая практика , и что является источником вашей ошибки. Это не случайно :)питон
Это конечно слишком долго. Решение Гнибблера намного лучше. (хотя замена
*..., sep=''
на''.join
будет более красивым)Но это довольно эффективно с точки зрения операций деления / модуля.
источник
sorted(lst)
, почему бы просто не поставить его в том порядке, который вам нужен, когда вы его определяете?lst.sort()
Рубин
источник
Haskell
Еще одно решение без деления или модуля.
fjb
создает бесконечный список Fizzes, Jazzes, Buzzes и / или чисел.take
любая сумма, которую вы хотите, как видно, вprint100fjb
которой печатается первые 100 элементов.источник
SQL (MySQL)
где I - таблица с одним столбцом (id INT), содержащая 100 целых чисел.
Я не знаю разновидности SQL, которая может легко генерировать таблицу или использовать VALUES в качестве подзапросов, что может сделать ее намного лучше и полнее.
источник
SELECT @i:= (@i + 1) FROM mysql.help_relation, (SELECT @i:=0) v WHERE @i < 100;
SELECT DISTINCT help_keyword_id FROM mysql.help_relation WHERE help_keyword_id>0 AND help_keyword_id<=100
также работал. Но если 100 изменить на 10000, оба будут сломаны.Рубин
источник
JavaScript
Возможно, не самый эффективный способ, но я думаю, что это просто и довольно <3
МОР СУХОЙ и чудовищно: C
источник
JavaScript
СУХОЙ ...;)
источник
Совершенно тупой C #
Половина сводки была «НЕ ПОВТОРЯТЬ СЕБЯ», поэтому я понял это буквально, как мог с C #, и это случайно перешло в игру в гольф. Это мой первый гольф, и я сделал это на C #, глупо, я знаю, но вот результат:
Игра в гольф (
240232230 символов):Ungolfed:
Цель состояла в том, чтобы сократить любую вещь, которую мне пришлось использовать более одного раза, и в целом, чтобы сохранить код коротким при создании полной программы на C #. Для этого вам нужно будет использовать VisualStudio и установить для объекта StartUp значение «P», вам также нужно будет искать выходные данные в окне вывода отладочной информации.
Здесь есть несколько серьезных ограничений:
источник
Python 2
Я хотел написать ответ для этого на некотором аккуратном Python, который бы демонстрировал особенности языка, соответствовал принципу DRY и был достаточно читабельным.
Этот небольшой пример показывает нарезку,
in
оператор и подробный, но понятный троичный синтаксис. Он вообще не использует оператор по модулю. Он не предназначен для эффективности во время выполнения, но это не было целью. Это разработано, чтобы быть коротким, понятным и ремонтопригодным.источник
set(group[...])
в правилах?Python 2.7, 111 байт
Это мой первый вклад. Я попытался применить некоторые трюки с использованием кода Python (чередование строк, доступ к индексу кортежей вместо
if
). Если у вас есть предложения, поделитесь ими!Выход :
Я также не мог полностью применить принцип СУХОГО, так как есть две
for
петли. Вероятно, есть более разумный способ сделать это!источник
for
утверждении. Буду обновлять когда смогу!Идти
Параллельный FizzJazzBuzzer
Попробуйте это здесь: http://play.golang.org/p/lxaZF_oOax
Он использует только один модуль на проверенное число и может быть произвольно расширен до любого числа, ну ... номеров.
Вам нужно всего лишь внести изменения в 3 разных места, чтобы расширить это, на
hooks
карте,FizzJazzBuzzer
названии функции и, конечно же, вызовеFizzJazzBuzzer
функции.источник
р
Это создает функцию, которая позволяет пользователю указывать пары слов и делителей (и, необязательно, максимальное число, со 100 по умолчанию). Функция создает вектор от 1 до максимального числа, затем заменяет любые числа в позициях "fizzbuzz" на "" и, наконец, вставляет каждое слово в нужную позицию. Функция упорядочивает список от младшего к наибольшему числу, так что наименьшее число всегда будет первой частью «fizzbuzz». Позиции рассчитываются с помощью
seq
создания вектора, начинающегося с данного числа и увеличивающегося с шагом этого числа, пока не будет достигнуто максимальное желаемое число.Я не думаю, что это очень красиво, но его легко использовать повторно с другими параметрами.
примеры использования:
Вывод
fizzbuzzer(fizz=3, buzz=5)
:(числа в квадратных скобках - это индексы вектора, который выводит функция)
источник
Haskell
Модульная арифметика не используется, за исключением вычисления наименьшего общего множителя, чтобы избежать повторения ненужной работы. Конкатенации строк нужно выполнять только 60 раз, независимо от того, какой верхний предел мы установили.
Замена
fjbLcm
наfjb
делает то же самое, без арифметики, кроме как в[1..100]
иtake
.источник
Python2
Update: New version doesn't use any mod or division operations.
If you want to add another word to the test, just throw the key/value pair into the word_dict dictionary:
If you want to get rid of a word, just delete it (using
del
) or alternatively set it to''
.See also the Python answers of Gnibbler and Jakube, which were posted before mine.
источник
C#
Maintainability: Just add one line per element
I iterate over each element in the dictionary, to check if it's a divisor of the current number, and adding to the string if it is.
Once finished, print the string, unless it is still null ( using the null coalescing operator ), in which case print the number plus an empty string to make it a string. ( I could use toString, but I guess that's a personal choice )
источник