Міраж розумної людини


29

Колись я читав це питання / відповідь на 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 був заграний гольфом, але це питання не в цьому. Ви бачите, у коментарях хтось згадує, що ця очевидна відповідь є чудовою, оскільки легко додати додаткові умови, такі як надрукувати "Джаз" для кратних значень 4. (Я не згоден. Розширення цієї схеми вимагає O (2 ** n ) рядки коду.)

Ваше завдання - написати найкрасивішу версію FizzJazzBuzz, яку судять ваші колеги.

Деякі речі, які повинні врахувати виборці:

  1. СУХИЙ
  2. Ефективність операцій поділу / модуля

Багато відповідей на 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
popularity-contest  code-challenge  word  popularity-contest  string  grid  language-design  code-golf  source-layout  math  fastest-algorithm  assembly  code-golf  json  code-golf  arithmetic  array-manipulation  code-golf  ascii-art  code-golf  crossword  code-golf  string  restricted-complexity  code-golf  ascii-art  kolmogorov-complexity  code-golf  string  decision-problem  balanced-string  syntax  code-golf  grid  puzzle-solver  hexagonal-grid  code-golf  math  number  sequence  code-golf  string  decision-problem  code-golf  cryptography  king-of-the-hill  code-challenge  fastest-code  code-golf  number  code-golf  code-golf  string  code-golf  cryptography  king-of-the-hill  java  code-golf  number-theory  base-conversion  code-golf  code-golf  array-manipulation  code-golf  array-manipulation  sorting  code-challenge  restricted-source  quine  code-golf  tips  python  king-of-the-hill  code-golf  source-layout  fractal  code-golf  tips  game  king-of-the-hill  path-finding  grid  code-golf  kolmogorov-complexity  natural-language  code-golf  tips  python  code-golf  number  arithmetic  sequence  array-manipulation  code-golf  number  combinatorics  random  integer-partitions  code-golf  string  code-golf  vim  comment  code-golf  combinatorics  counting  code-challenge  rosetta-stone  code-golf  combinatorics  sequence  subsequence  code-golf  code-challenge  restricted-source  primes  printable-ascii  popularity-contest  graphical-output  image-processing 

1
Ваша друга точка кулі трохи розпливчаста ... Що робить підрозділ ефективним? Чому це важливо для виклику?
Санчіз

@sanchises, все ще існують платформи, особливо мікроконтролери, які мають дуже дорогі (за циклами / часом) операції поділу. Принаймні одна з наведених нижче відповідей уникає поділу / модуля взагалі - але, можливо, шкодить читабельності. Це виборці мають розглянути.
гніблер

1
@sanchises зовсім не розпливчастий IMHO, точка взагалі не використовує поділ / модуль. Ви можете це зробити, просто зберігаючи змінну для кожного n = (3,4,5 ...) і скидаючи її в той час, коли вона не відповідає, і друкувати слово і збільшувати, коли ні. Суха частина може виконувати функцію / метод отримання (n, слово) і, таким чином, "підтримка" додавання більше слів вітер
jean


Відповіді:


101

Скажете, найкрасивішу версію? Потім спробуємо цю в ...

Мова програмування Шекспіра

The Marvelously Insane FizzBuzzJazz Program.

Lady Capulet, an old bossy woman that loves to count.
The Archbishop of Canterbury, an old fart who adores to spit out letters.


          Act I: The only one of them.

          Scene I: The Archbishop of Canterbury is a bastard.

[Enter The Archbishop of Canterbury and Lady Capulet]

The Archbishop of Canterbury:
 You are nothing!

          Scene II: Count, Lady Capulet, count.

The Archbishop of Canterbury:
 You are as beautiful as the sum of yourself and a cat!

Lady Capulet:
 Am I worse than the square of the product of the sum of a warm gentle flower and a rose
 and my pretty angel?

The Archbishop of Canterbury:
 If not, let us proceed to Scene VIII.

          Scene III: Fizzing to no end!

The Archbishop of Canterbury:
 Is the remainder of the quotient between yourself and the sum of a happy cow and a
 chihuahua as good as nothing?

Lady Capulet:
 If not, let us proceed to Scene IV. Thou art as handsome as the sum of the sum of
 the sweetest reddest prettiest warm gentle peaceful fair rose and a happy proud kindgom
 and a big roman. Speak thy mind!

 Thou art as fair as the sum of thyself and a honest delicious cute blossoming peaceful
 hamster. Thou art as cunning as the sum of the sum of an embroidered King and a horse
 and thyself. Speak thy mind!

 Thou art as amazing as the sum of the sum of a good happy proud rich hero and a hair and
 thyself! Speak thy mind.

 Speak your mind!

          Scene IV: Milady, there is jazz in thy robe.

The Archbishop of Canterbury:
 Is the remainder of the quotient between yourself and a proud noble kingdom as good as
 nothing?

Lady Capulet:
 If not, let us proceed to Scene V. You are as charming as the sum of the sum of a noble
 cunning gentle embroidered brave mighty King and a big warm chihuahua and an amazing
 pony! Speak your mind!

 You are as prompt as the sum of yourself and a big black sweet animal. You are as noble
 as the sum of the sum of a gentle trustworthy lantern and yourself and a hog. Speak your
 mind!

 You are as bold as the sum of the sum of yourself and a good delicious healthy sweet
 horse and my smooth cute embroidered purse. You are as peaceful as the sum of a flower
 and yourself. Speak your mind.

 Speak your mind!

          Scene V: Buzz me up, Scotty!

The Archbishop of Canterbury:
 Is the remainder of the quotient between yourself and the sum of a gentle happy cow and a
 chihuahua as good as nothing?

Lady Capulet:
 If not, let us proceed to Scene VI. Thou art as handsome as the sum of the sweetest
 reddest prettiest warm gentle peaceful fair rose and a small town. Speak your mind!

 You are as prompt as the sum of yourself and a big healthy peaceful fair rich kingdom.
 You are as loving as the sum of the sum of an embroidered King and a horse and thyself.
 You are as amazing as the sum of yourself and a cute fine smooth sweet hamster. Speak
 your mind!

 You are as prompt as the sum of the sum of yourself and an amazing cunning Lord and a
 hair. Speak your mind.

 Speak your mind!

The Archbishop of Canterbury:
 Let us proceed to Scene VII.

          Scene VI: Output or die!

The Archbishop of Canterbury:
 Open your heart!

          Scene VII: Oh, to jump the line.

Lady Capulet:
 You are as handsome as the sum of a proud noble rich kingdom and a rural town. Speak your
 mind! You are as gentle as the sum of the sum of yourself and a green mistletoe and my
 father. Speak your mind!

The Archbishop of Canterbury:
 We must return to Scene II.

          Scene VIII: Goodbye, cruel world!

[Exeunt]

Отже, після моєї боротьби зі СПЛ тут я відчував, що мені потрібно зробити хоча б одне подання з будь-якого виклику. І це все.

Отже, що це все тоді?

Отже, спочатку ми оголосимо змінні, які ми будемо використовувати у всій програмі, які повинні виходити з п'єс Шекспіра. Нагородившись Ромео, Джульєттою, Офелією та Отелло, я пішов з архієпископом Кентерберійським та леді Капулет . Їх описи, а також назви актів / сцен розглядаються парсером, тому ви можете помістити туди все, що завгодно.

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

Дія 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;

Ми збільшуємо значення леді Капулет і порівнюємо його зі 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; якщо це так, ми починаємо робити арифметичні операції та зберігати їх на Ар'єпсона, виводячи їх у формі символів, як тільки знайдемо той, кого шукаємо. Так, врешті-решт, ідея - отримати 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);

Щоб дійти до цієї сцени, кількість, яку припустила леді Капулет, не повинна була бути ні Фізз, ні Джаз, ні Базз; таким чином, ми виводимо його в числовій формі.

Дія 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:

Після коментаря математики, я редагував порядок сцен Джазу та Базза. Це треба було зробити.


1
Схоже, у мене проблеми з DNS. Вибачте за помилкову тривогу.
Rainbolt

17
Одне цікавить, чому Шекспір ​​ніколи не отримує кодового гольфу.
Санчіз

5
Я сподівався, що сцени III, IV та V відповідатимуть Фіззу, Джазу та Баззу відповідно. Все-таки красиво зроблено!
mathmandan

1
@mathmandan Блін. Яка даремна можливість зробити щось геніальне. ДАМН !!
Родольфо Діас

1
Це дивовижно, але я, здається, помітив помилку. Я думаю, що він видає число, якщо це не Buzz, незалежно від того, був це Fizz або Jazz. Я не запускав його, але, здається, не можу знайти чек на це. Можливо, ви могли перевірити, чи є архієпископ, zі скинути його перед кожною петлею.
матега

45

> <> (Риба)

1 > :9b*)?; 0& v
               \ :3%?v "Fizz" r}oooo &1+& \
               /     <                    /
               \ :4%?v "Jazz" r}oooo &1+& \
               /     <                    /
               \ :5%?v "Buzz" r}oooo &1+& \
               /     <                    /
               \   &?v :n                 \
  ^  +1 oa           <                    /

> <> - це 2D мова програмування, де інструкції є одиничними символами, а вказівник інструкції (IP) може рухатися вгору, вниз, вліво або вправо, в залежності від стрілок ^>v<і дзеркал /\. У ньому немає змінних чи рядків, тому повторити себе трохи складніше, але я думаю, що це приємно по-своєму.

Віджимаємо 1і запускаємо петлю. :9b*)?;перевіряє, чи число більше 99 ( 9b* = 9*11), і якщо так, програма зупиняється ;. В іншому випадку введіть 0 в реєстр і перемістіться vдо хвилястої частини.

:3%?перевіряє число по модулю 3. Якщо це ненульове значення, ми спускаємось vрядом і рухаємося вліво <. В іншому випадку ми пропускаємо стрілку вниз і натискаємо "Fizz", друкуємо її ( r}oooo) і збільшуємо регістр ( &1+&) перед тим, як відскакувати від дзеркал правої стіни, щоб спуститися на рядок. У будь-якому випадку ми рухаємося вліво вздовж третього ряду, поки не відскакуємо від дзеркал лівої стіни. Потім повторюємо для Jazzі Buzz.

Це триває до 7-го рядка, який перевіряє значення регістра &. Якщо це ненульове значення, ми просто йдемо вниз. В іншому випадку ми друкуємо сам номер nперед тим, як спуститися.

Нарешті, ao(пам’ятайте, зараз ми рухаємося вліво!) Друкує новий рядок ASCII та 1+збільшує число, перш ніж ми піднімаємось ^і робимо цикл >ще раз.

(Тепер ми чекаємо естетичної відповіді Піта ...)


3
Це прекрасно. Це повинно пройти в зал слави для отримання <>> відповідей.
Джошпбаррон

2
Мої очі одразу підскочили до: 3.
EMBLEM

Що ж, ця мова не виграє жодної нагороди для читання, але це дуже акуратно.
Вільям Т Фроггард

40

ЛОЛКОД

Елегантний? Ні. Ефективний? Точно ні. Гарний? Ну, ви знаєте, що вони кажуть: краса в очах глядача.

HAI
I HAS A kitty ITZ 1
IM IN YR house UPPIN YR kitty TIL BOTH SAEM kitty AN 100

    BTW, computin yr mods
    I HAS A d00d ITZ NOT MOD OF kitty AN 3
    I HAS A doge ITZ NOT MOD OF kitty AN 4
    I HAS A bro ITZ NOT MOD OF kitty AN 5

    ANY OF d00d bro doge MKAY, O RLY?
    YA RLY
        d00d, O RLY?
        YA RLY
            VISIBLE "Fizz"!
        OIC
        doge, O RLY?
        YA RLY
            VISIBLE "Jazz"! BTW, wow such jazz
        OIC
        bro, O RLY?
        YA RLY
            VISIBLE "Buzz"!
        OIC
    NO WAI
        VISIBLE kitty!
    OIC

    VISIBLE ""
IM OUTTA YR house
KTHXBYE

Деякі пояснення:

Програми LOLCODE починаються HAIі закінчуються KTHXBYE.

Змінні набираються динамічно і призначаються за допомогою I HAS A <variable> ITZ <value>. Після визначення змінних можна також призначити за допомогою <variable> R <value>.

Петлі в LOLCODE названі. Синтаксис:

IM IN YR <loop> UPPIN YR <index> TIL BOTH SAEM <index> AN <end>
    <stuff to do>
IM OUTTA YR <loop>

Це просто розмова в Інтернеті для "циклу, поки я = кінець". У LOLCODE 1.2 змінну індексації потрібно ініціалізувати перед циклом. Тут цикл має назву "будинок", тому що він робить читання ініціалізації циклу звуковим.

VISIBLEвідбитки до stdout. За замовчуванням додається новий рядок, але додавання !придушує новий рядок.

Умови задаються наступним чином:

<condition>, O RLY?
YA RLY
    <code to execute if condition is true>
NO WAI
    <code to execute if condition is false>
OIC

Умови повинні бути або виразами, які оцінюють як булеві, або булеві значення. У LOLCODE називається булевий тип TROOFі має значення WIN(true) та FAIL(false).

Однорядкові коментарі починаються з BTW.

Не в курсі мови Internetz? Просто дайте мені знати, і я із задоволенням надаю подальше пояснення.


3
Чудово. Це неймовірно. Я все ще
сміюся

@rpax: Відмінно ... Все йде за планом ...
Алекс А.

33

Python3

lst = [('Fizz', 3),
       ('Jazz', 4),
       ('Buzz', 5),
       ]

for i in range(1, 101):  
    print(*[w for w, m in lst if i % m == 0] or [i], sep='')

Серед нинішньої Efficiency of division/modulus operations
головної

@aross Що ти маєш на увазі? Усі відповіді, які я бачив, використовують щонайбільше таку ж кількість операцій поділу / модуля, що і ця.
Hjulle

Дійсно? Всі інші відповіді використовують оператор модуля для кожного з (3, 4, 5). Дублюється тричі. Це єдиний верхній варіант відповіді лише з одним оператором модуля.
1515

1
Я просто читав коментарі до питання. Я здогадуюсь, що я неправильно трактував цитоване речення. Потрібно було б посилатися DRYнатомість. Крім того, ця відповідь складається ОП.
aross

31

Пієт

Більший видФактичне "Джерело"

Я вирішив спробувати пограти з Piet і побачити, як гарний код я можу зробити. Я намагаюся тут нічого не повторювати, хоча, якщо чесно, я повинен повторювати модні розрахунки. Однак кожен окремий мод (n% 3, n% 4 і n% 5) виконується лише один раз за ітерацію коду.

Менше зображення є належним джерелом, і його можна завантажити та запустити сюди .

Насолоджуйтесь!


4
"Чи дійсно є програмісти зі ступенями інформатики, які не можуть пройти тест FizzBuzz в Piet ?"
Санчіз

26

Математика

У Mathematica ви можете визначати та перевантажувати функції для дуже конкретних параметрів (не тільки за типом, але й за довільними логічними умовами). Давайте визначимо кілька функцій:

Fizz[n_, s___] := {n, s}
Fizz[n_ /; Divisible[n, 3], s___] := {n, "Fizz" <> s}
Jazz[n_, s___] := {n, s}
Jazz[n_ /; Divisible[n, 4], s___] := {n, "Jazz" <> s}
Buzz[n_, s___] := {n, s}
Buzz[n_ /; Divisible[n, 5], s___] := {n, "Buzz" <> s}
DoThe[n_] := n
DoThe[_, s_] := s

А тепер власне програма просто

DoThe @@@ Fizz @@@ Jazz @@@ Buzz /@ Range[100] // TableForm

Тепер, коли вищезгадане зростає лише лінійно з кількістю дільників, це все ще не дуже СУХО. Але ми можемо фактично використовувати змінні як імена в цих визначеннях. Тож ми можемо насправді записати функцію, яка генерує ці визначення функцій:

addFunction[f_, divisor_] := (
  f[n_, s___] := {n, s};
  f[n_ /; Divisible[n, divisor], s___] := {n, ToString[f] <> s}
)
addFunction[Fizz, 3];
addFunction[Jazz, 4];
addFunction[Buzz, 5];
DoThe[n_] := n
DoThe[_, s_] := s

DoThe @@@ Fizz @@@ Jazz @@@ Buzz /@ Range[100] // TableForm

Тепер все, що вам потрібно зробити, - це додати ще один addFunctionдзвінок і додати нову **zzдо остаточної лінії.


13
DoThe @@@ Time @@@ Warp @@@ Again /@ Range[100] // TableForm
Sp3000

10
Це просто JMPліворуч!
MikeTheLiar

"все, що вам потрібно зробити, це додати ще один виклик addFunction." ... і додати нову функцію до остаточного рядка?
Спарр

@Sparr о так, це правда
Мартін Ендер

22

Хаскелл

Ви, хлопці, серйозно не сприймаєте DRY. Є очевидні закономірності, які можна розглянути в послідовності "Fizz Jazz Buzz".

import Control.Applicative

-- All words end with "zz" and the numbers are in a sequence
fizzes = zip [3..] $ (++ replicate 2 'z') <$> words "Fi Ja Bu"

main = putStrLn . unlines $ fizzIt <$> [1..99]

-- Point free style with reader monad ((->) a) to minimize
-- unnecessary repetition of variable names
fizzIt = nonFizzy =<< fizzy

-- Show the number if no fizziness was found. Partially point free
-- with respect to n. But xs is needed to prevent the error:
-- "Equations for ‘nonFizzy’ have different numbers of arguments"
nonFizzy "" = show
nonFizzy xs = const xs

-- (Ab)use the list monad for concatenating the strings

fizzy i = snd =<< filter ((==0).mod i.fst) fizzes
-- Could also be written as:
-- > fizzy i = concat [ str | (n,str) <- fizzes, i`mod`n==0]
-- but that would be way too readable, and not pointless (ahem, point free) enough. ;)

Цей код також легко розширюється. Щоб вирішити проблему "Fizz Jazz Buzz Tizz", все, що вам потрібно зробити, це додати Tiпісля Buрядка. Це набагато менше, ніж потрібно в будь-якому з інших рішень.


5
Що робити, якщо вам довелося вирішити проблему Fizz-Jazz-Buzz-Sausage?
Анко

@Anko Я міг би зробити щось подібне fizzes = zip [3..] $ ((++ replicate 2 'z') <$> words "Fi Ja Bu") ++ ["Sausage"], або просто повернутися до нього fizzes = zip [3..] $ words "Fizz Jazz Buzz Sausage".
Hjulle

3
replicate 2 zтрохи розтягує. . .
Soham Chowdhury

3
@octatoan Я не втримався. ;)
Hjulle

16

Excel VBA

             Sub scopeeeeeeeeeeeeeeee()
                     '   ||
               For u = 1 To 100
   If u Mod 3 = 0 Then yell = "Fizz"
If u Mod 4 = 0 Then yell = yell & "Jazz" '---------------------------------------------|
If u Mod 5 = 0 Then yell = yell & "Buzz" '---------------------------------------------|
            'made in USA
            If yell = "" Then yell = u
             Debug.Print yell      '\\
             yell = ""              '\\
            Next                     '\\
           End Sub                    '\\

Це може здатися дурним, але це 2D снайперська гвинтівка!


Половина. !!!!
Оптимізатор

2
Крім того, це смішно - "Якщо ви перейдете в режим 3"
Оптимізатор

Дякую!! Я не очікував , що хтось - то реалізувати частину і режим 3 так швидко
Alex

Я не розумію, чому половина!
Алекс

Снайпер - лише половина. Приціл зазвичай знаходиться в середині снайпера.
Оптимізатор

15

Java

void fizzy(int limit){
    String[] output = new String[limit];
    Arrays.fill(output,"");

    List<SimpleEntry<Integer,String>> tests = new ArrayList<SimpleEntry<Integer,String>>();
    tests.add(newEntry(3,"Fizz"));      
    tests.add(newEntry(4,"Jazz"));      
    tests.add(newEntry(5,"Buzz"));      

    for(SimpleEntry<Integer,String> test : tests)
        for(int i=test.getKey();i<limit;i+=test.getKey())
            output[i] += test.getValue();           

    for(int i=1;i<limit;i++)
        System.out.println(output[i].length()<1 ? i : output[i]);
}   

SimpleEntry<Integer,String> newEntry(int key, String value){
    return new SimpleEntry<Integer,String>(key,value);
}

Тож Java насправді більшість не вважається "красивою", але це шалено суб'єктивний, тому я дотримувався рекомендацій у питанні:

  • Не повторіть себе: немає проблем. Вам потрібно лише додати один рядок для кожного числа. Я навіть зробив функцію помічника, тому вам не доведеться набирати стільки, коли це робите (Java може бути дещо багатослівним, якщо ви цього не знали).
  • Ефективність операцій ділення / модуля: Ідеальна ефективність, оскільки модуля чи поділу взагалі немає.

Це не означає, що алгоритм в цілому є найефективнішим (це не так), але я думаю, що він добре вражає позначені точки.


2
Це не було б Java, якби ви не визначили клас. : D
Адріан Леонгард

Мені хотілося сподобатися відповіді на Java, і мені подобається такий підхід, але я відчуваю, що вбудовувати код у формати-висловлювання - це непотрібна обтурація. Гарна Java - читана Java!
Алекс Притчард

@AlexPritchard Я вважаю, що це побічний ефект кодового гольфу.
Виправимо,

11

Інформуйте 7

Inform 7 - мова програмування на основі правил, призначена для інтерактивної художньої літератури. Він примітний тим, що є однією з найуспішніших мов програмування на природній мові. Дивіться вітрину мови Inform 7 для інших прикладів та декількох дрібниць дрібниць.

The number printing rules are a number based rulebook.

Definition: a number is fizzy if the remainder after dividing it by 3 is 0.
Definition: a number is jazzy if the remainder after dividing it by 4 is 0.
Definition: a number is buzzy if the remainder after dividing it by 5 is 0.

A number printing rule for a fizzy number:
    say "Fizz";

A number printing rule for a jazzy number:
    say "Jazz";

A number printing rule for a buzzy number:
    say "Buzz";

A number printing rule for a number (called N):
    unless a paragraph break is pending:
        say N;
    say conditional paragraph break;

To print a series of numbers from (min - a number) to (max - a number):
    repeat with N running from min to max:
        follow the number printing rules for N;

Цей код має перевагу в тому, що кожне з правил FizzBuzz є абсолютно незалежним: додаткові правила можна додавати в будь-якій точці, не потребуючи змін загальних рамок. На жаль, це мало повторюється, особливо з визначеннями фраз. Я міг би визначити% оператора, але тоді це була б не англійська. ;)

Цей код можна запустити в Інтернеті за допомогою Playfic .


7

Діялог APL

∇FizzJazzBuzz;list;items;names
   items ← ⍳100    
   list  ← ↑('Fizz' 3) ('Jazz' 4) ('Buzz' 5)   

   names ← (,/ ↑(↓0=⍉list[;2]∘.|items) /¨ ⊂list[;1]) ~¨ ' '
   ⎕← ↑,/↑names ,¨ (∊0=⍴¨names) ⍴¨ ⊂¨⍕¨items
∇
  • СУХА: подвійного коду немає
  • Легко змінити умови: імена беруться зі списку в порядку, на дільник, з необхідними мінімальними змінами
  • Легко змінити діапазон: itemsможна змінити на довільний список чисел
  • Ефективність: використовує легко паралелізований алгоритм, заснований на списку, що складається лише з вільних примітивів, що не мають побічних ефектів.
  • Простий потік коду: не тільки немає goto s, немає і s або if s. Код абсолютно лінійний.
  • Забезпечує свою роботу: ледь хто-небудь інший зможе працювати над нею ...

Які значення ⎕MLта ⎕IO?
FUZxxl

Вони обоє 1, що є замовчуванням.
marinus

7

C #

for(int i = 1; i <= 99; i++){
    string s = "";
    if (i % 3 == 0) s += "Fizz";
    if (i % 4 == 0) s += "Jazz";
    if (i % 5 == 0) s += "Buzz";
    System.Console.WriteLine(s == "" ? "" + i : s);
}

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


2
"Немає повторів"? (Гаразд, принаймні розмір коду лінійно зростає з додатковими словами.)
Анко

Я взяв виклик не повторюватись трохи далі зі своєю відповіддю на C #, але пожертвував будь-якою гнучкістю, коли мова заходить про те, які числа потрібно модулювати. Я думаю, що найкращим результатом буде структура даних, що стосуються числа та слова.
sydan

@Anko Не впевнений, що ти отримуєш, жодна функція не повторюється. Я не роблю те ж саме двічі десь у коді.
rapjr11

@ rapjr11 Код перевіряє i- %-що багато разів, а також додає sбагато разів. (Багато синтаксису теж повторюється, але це, мабуть, помилка C #.)
Анко

7

Python 2.7

Я намагався зробити це поетичним ...

Я не дуже люблю поезію ...

of = 1
my_love = 100
youre = "ever"

#You are
for ever in range(of, my_love) :
    never = "out my mind"
    for I,am in[#audibly
                (3, "Fizzing"),
                (4, "Jazzing"),
                #and
                (5, "Buzzing")]:
        if( ever % I ==0):# near you
            never += am #I lonely.
    #because
    youre = ever #in my mind.
    if( youre, never == ever,"out my mind" ):
        never += str(youre) #(I gave up with this line...)
    #then our foot-
    print"""s will"""( never [11:3])# part. 

Також було б набагато краще без початкових констант: P


Creative, але це не працює для мене в Python 2.7.9. Він каже: TypeError: 'str' object is not callable.
Олексій А.

Гмммм ... Чорт ... Не зовсім впевнений, як я пропустив це: /
JamJar00

5

Java з класами

Алгоритм:

public static void main(String... args) {

    List<Condition> conditions = new ArrayList<Condition>();
    conditions.add(new TerminatingCondition(100));
    conditions.add(new ModuloCondition(3, "Fizz"));
    conditions.add(new ModuloCondition(4, "Jazz"));
    conditions.add(new ModuloCondition(5, "Buzz"));
    conditions.add(new EchoCondition());

    while (true) {
        for (Condition c : conditions){
            c.apply();
        }
    }

}

Класи:

interface Condition {
    void apply();
}

static class ModuloCondition implements Condition {
    int modulo, count = 0;
    String message;
    ModuloCondition(int modulo, String message){
        this.modulo = modulo;
        this.message = message;
    }
    public void apply() {
        count++;
        if (count == modulo) {
            out.append(message);
            count = 0;
        }
    }
}

static class TerminatingCondition implements Condition {
    int limit, count = 0;
    TerminatingCondition(int limit) {
        this.limit = limit;
    }
    public void apply() {
        count++;
        if (count > limit) {
            System.exit(0);
        }
    }
}

static class EchoCondition implements Condition {
    int count = 0, lastOutCount = 0;
    public void apply() {
        count++;
        out.println((lastOutCount == out.count) ? String.valueOf(count) : "");
        lastOutCount = out.count;
    }
}

static class Out {
    int count = 0;
    void append(String s) {
        System.out.append(s);
        count++;
    }
    void println(String s){
        append(s + System.lineSeparator());
    }
}

static Out out = new Out();

2
+1, ви справді захопили дух кодування Java за допомогою цього 70-рядкового FizzBuzzJazz. Він об'єктно-орієнтований і написаний у чітко визначеному, не скороченому, читабельному стилі. Дуже довго. Але дуже читабельний. ; ^)
DLosc

4

МАТЛАБ / Октава

Звичайно, написання власних циклів - це цікаво для програмістів, але всі знають, наскільки насправді слідкувати за індексацією (хто не писав for(j=i;j<n;i++)у вкладений цикл хоча б раз у своєму житті?)

MATLAB має рішення. Дійсно, цей код не є найефективнішим і, звичайно, не кодовим гольфом, але це, безумовно, хороша вітрина більш цікавих функцій MATLAB. Octave - версія GNU MATLAB; Однак він не підходить для коду-гольфу, оскільки він трохи суворіший зі змінними типами, що згубно для коду-гольфу.

EDIT: поки виділення синтаксису для MATLAB не існує в SE, я публікую версію з дуже маленькими коментарями, тому що в іншому випадку це був просто великий страшний блок простого тексту.

function out = fizzjazzbuzz(n)
    %Initialization
    numberlist=1:n;
    fizz=cell(1,100);
    jazz=fizz;buzz=jazz;

    %Complex loops - no, wait, easy logical indexing.
    fizz(~mod(numberlist,3))={'Fizz'}; 
    jazz(~mod(numberlist,4))={'Jazz'};
    buzz(~mod(numberlist,5))={'Buzz'};
    out=strcat(fizz,buzz,jazz);
    %Fill with numbers
    out(cellfun(@isempty,out))=num2cell(numberlist(cellfun(@isempty,out)));

    %Pretty output (although the default printing is perfectly acceptable)
    out=cellfun(@num2str,out,'UniformOutput',0);
    strjoin(out,sprintf('\n'));
end

2
for(j=i;j<n;i++)? Моє запитання: хто це писав "хоча б раз у житті"? Якщо ви це зробили, у мене є для вас погане нове ...
Богдан Олександру

1
@BogdanAlexandru Ви ніколи в житті випадково не збільшували неправильну змінну в forциклі (наприклад, коли вкладаєте петлі)? Ви той хлопець, чий код успішно складається кожен раз? Якщо ви є, у мене є богові новини для вас ...
Санчіз

2
Я не кажу про збільшення неправильної змінної, мій код не написаний богом. Я говорю про той стиль кодування, він сам по собі дуже схильний до помилок. jІм'я для локальних змінного циклу прекрасно, але iназва дуже погана практика , і що є джерелом вашої помилки. Це не зовсім випадково :)
Богдан Олександру

@BogdanAlexandru Ага так, я цілком згоден; причина, по якій я все ще використовую цей стиль циклу, - це при виконанні заданих завдань (я - студент-майстер); Я скоріше використовую позначення індексів, які використовує відповідний професор, ніж плутати бідного старого, використовуючи мою власну.
Санчіз

1
Немає проблем із зазначенням однієї літери імен індексом циклу, але інші змінні повинні мати більш значущі імена.
Богдан Олександру

4

Пітон

from collections import defaultdict

lst = [(3, 'Fizz'),
       (5, 'Buzz'),
       (4, 'Jazz')]

word_list = defaultdict(list)

for d, w in sorted(lst):
    for i in range(d, 100, d):
        word_list[i].append(w)

for i in range(1, 100):
    print(''.join(word_list[i]) or i)

Звичайно, це занадто довго. Рішення гніблера набагато краще. (хоча замінити *..., sep=''на ''.joinбуло б красивіше)

Але це досить ефективно з точки зору операцій поділу / модуля.


1
Для чого ви використовуєте sorted(lst), чому не просто введете їх у потрібний вам порядок, коли ви визначаєте це?
mbomb007

Або відсортуйте його на місці перед циклом. lst.sort()
Давидм


4

Хаскелл

inp = [(3, "Fizz"), (4, "Jazz"), (5, "Buzz")]

mkList (n, str) = cycle $ replicate (n-1) "" ++ [str]

merge lists = (head =<< lists) : merge (map tail lists)

checkFJB "" n = show n
checkFJB s  _ = s

fjb = zipWith checkFJB (merge $ map mkList inp) [1..]

print100fjb = mapM_ putStrLn $ take 100 fjb

Ще одне рішення без поділу чи модуля. fjbстворює нескінченний список Fizzes, Jazzes, Buzzes та / або номерів. takeбудь-яку суму, яку ви хочете, як видно, в print100fjbякій друкуються перші 100 елементів.


4

SQL (MySQL)

SELECT COALESCE(GROUP_CONCAT(FizzJazzBuzz.str ORDER BY FizzJazzBuzz.n SEPARATOR ''), I.id)
FROM I
    LEFT JOIN (
        SELECT 3 n,'Fizz' str
        UNION SELECT 4, 'Jazz'
        UNION SELECT 5, 'Buzz'
    ) FizzJazzBuzz ON I.id MOD FizzJazzBuzz.n = 0
GROUP BY I.id
ORDER BY I.id;

де я - таблиця з одним стовпцем (id INT), що містить 100 цілих чисел.

Я не знаю аромат SQL, який може легко генерувати таблицю, або я можу використовувати VALUES як підзапити, що може зробити її набагато кращою та повною.


1
Ви можете використовувати змінні в mysql. SELECT @i:= (@i + 1) FROM mysql.help_relation, (SELECT @i:=0) v WHERE @i < 100;
нарізано

@slicedtoad SELECT DISTINCT help_keyword_id FROM mysql.help_relation WHERE help_keyword_id>0 AND help_keyword_id<=100також працював. Але якщо 100 змінити на 10000, обидва будуть порушені.
jimmy23013

1
Просто приєднайтесь до нього, якщо вам потрібно більше рядків.
нарізаний хліб

Наскільки мені відомо, MySQL - єдиний діалект SQL, який не має простого генератора рядків. Більшість може просто використовувати рекурсивний загальний вираз таблиці.
Бен

@Ben Але рекурсивні способи не завжди виглядають добре. Я не виправлю свою відповідь, змінюючи діалект, тому що вже є відповідь Oracle SQL.
jimmy23013

3

Рубін

1.upto(100) do |i|

  rules = { 3 => 'Fizz', 4 => 'Jazz', 5 => 'Buzz' }

  print(i) unless rules.select! { |n,s| i.modulo(n) > 0 or print(s) }

  puts

end

3

JavaScript


Мабуть, не найефективніший спосіб, але я думаю, що це простий і досить <3

(function fizzBuzz(iter){
    var str = '';
    

    if(!(iter % 3)) str += 'Fizz'
    if(!(iter % 4)) str += 'Jazz'
    if(!(iter % 5)) str += 'Buzz'


    console.log(str || iter)


    if(iter >= 100) return

    
    fizzBuzz(++iter)
})(1)


Осипати СУХО і некрасиво потерти: C

(function fizzBuzz(iter){
    var 
        str,
        fijabu = ['Fi','Ja','Bu']
    ;
    

    (function isMod(_str,val){

        if(!(iter % val)) _str += fijabu[val-3] + 'zz'


        if(val >= 5) return str = _str


        isMod(_str,++val)
    })('',3)


    console.log(str || iter)


    if(iter >= 100) return

    
    fizzBuzz(++iter)
})(1)


8
Чому подвійний інтервал?
Анко

Особиста конвенція. Я думаю, що приємніше читати.
саундйогі


Я роблю це лише в особистих проектах і для розваги. Більшості команд це не подобається.
саундйогі

2

JavaScript

DRYish ...;)

(function FizzJazzBuzz(iter) {
    var output = ["Fi", "Ja", "Bu"];
    var str = "";

    output.map(function(v,i,a) {
        if(!(iter%(i+3))) str += output[i] + "zz";
    });

    console.log(str || iter);

    if(iter < 100) FizzJazzBuzz(++iter);

    return;
})(1);

2

Доволі тупі C #

Половина резюме було "НЕ ПОВТОРЮЙТЕ СЕБЕ", тож я зрозумів це настільки буквально, наскільки я міг із C #, і випадково перейшов у гольф-код. Це мій перший гольф, і я це зробив у C #, нерозумно знаю, але ось результат:

Гольф ( 240 232 230 символів):

namespace System{using Diagnostics;using i=Int32;using s=String;class P{static void Main(){s[] z=new s[]{"Fi","Ja","Bu"};for(i a=1;a<100;a++){s l="";for(i b=3;b<6;b++)if(a%b==0)l+=z[b-3]+"zz";Trace.WriteLine((l!="")?l:a+"");}}}}

Безголовки:

namespace System
{
   using Diagnostics;
   using i = Int32;
   using s = String;
   class P 
   { 
      static void Main() 
      {
         s[] z = new s[] { "Fi","Ja","Bu" }; 
         for(i a = 1;a < 100;a++) 
         { 
            s l = ""; 
            for(i b = 3;b < 6;b++)
               if(a % b == 0)
                  l += z[b - 3] + "zz"; 
            Trace.WriteLine((l != "") ? l : a+""); 
         } 
      } 
   }
}

Метою було скоротити будь-яку річ, яку мені довелося використовувати не раз, і взагалі, щоб код був короткий, створюючи повну програму C #. Для цього вам потрібно буде використовувати VisualStudio і встановити для об'єкта StartUp значення "P", вам також потрібно буде шукати вихід у вікні налагодження виводу.

Тут є деякі серйозні обмеження:

  • Код передбачає, що всі слова закінчуються на "zz"
  • Код передбачає, що модуль відбуватиметься послідовно (3,4,5,6 ...)
  • Код все ще підтримує відсутність або повторення справжнього гольфу, додається більше символів, щоб уникнути повторень

2

Пітон 2

Я хотів написати відповідь на це в якомусь охайному Python, який би демонстрував особливості мови, відповідав принципу DRY та був досить читабельним.

group = range(100)
rules = [('fizz', group[::3]), ('jazz', group[::4]), ('buzz', group[::5])]
for number in group[1:]:
    labelset = ''
    for label, matches in rules:
        if number in matches:
            labelset += label
    print labelset if labelset else number

Цей невеликий приклад показує нарізку, inоператор та багатослівний, але зрозумілий потрійний синтаксис. Він взагалі не використовує оператор модуля. Він не розрахований на ефективність роботи, але це не було ціллю. Він розроблений таким чином, щоб він був коротким, зрозумілим та підтримуваним.


Чому б не використовувати set(group[...])в правилах?
гніблер

Я йшов на елегантність, а не на швидкість. Звичайно, використання real () було б швидшим у реальних програмах.
Логічний лицар

2

Python 2.7, 111 байт

Це мій перший внесок. Я спробував застосувати деякі трюки з кодовим гольфом Python (переплетення рядків, доступ до кортежних індексів замість if). Якщо у вас є якісь пропозиції, будь ласка, поділіться ними!

for i in range(1,101):
 p=""
 for x in 3,4,5:
  if not(i%x):p+="FJBiauzzzzzz"[x-3::3]
 print((p,i)[not len(p)])

Вихід:

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

Я також не зміг повністю застосувати принцип DRY, оскільки є дві forпетлі. Напевно, є розумніший спосіб це зробити!


Можливо, я можу також використовувати кортеж у першому forтвердженні. Оновлять, коли зможу!
Нефо

Гаразд, так це працює з двома змінними в одному циклі, але я переходжу
Nepho

1

Іди

Паралельний FizzJazzBuzzer

package main

import (
    "fmt"
    "sort"
    "sync"
)

var hooks map[int]string = map[int]string{
    3: "Fizz",
    4: "Jazz",
    5: "Buzz"}

type candidate struct {
    num     int
    message string
}

func FizzJazzBuzzer(hooks map[int]string) (chan<- int, *sync.WaitGroup) {
    var wg *sync.WaitGroup = new(sync.WaitGroup)
    final := func(c chan candidate) {
        for i := range c {
            if i.message == "" {
                fmt.Println(i.num)
            } else {
                fmt.Println(i.message)
            }
            wg.Done()
        }
    }
    prev := make(chan candidate)
    go final(prev)
    var keys []int = make([]int, 0)
    for k := range hooks {
        keys = append(keys, k)
    }
    sort.Sort(sort.Reverse(sort.IntSlice(keys)))
    for _, mod := range keys {
        c := make(chan candidate)
        s := hooks[mod]
        go (func(in chan candidate, next chan candidate, mod int, s string) {
            for i := range in {
                if i.num%mod == 0 {
                    i.message += s
                }
                next <- i
            }
        })(c, prev, mod, s)
        prev = c
    }
    in := make(chan int)
    go (func(in <-chan int) {
        for i := range in {
            prev <- candidate{i, ""}
        }
    })(in)
    return in, wg
}

func main() {
    in, wg := FizzJazzBuzzer(hooks)
    for i := 1; i < 20; i++ {
        wg.Add(1)
        in <- i
    }
    wg.Wait()
}

Спробуйте тут: http://play.golang.org/p/lxaZF_oOax

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

Вам потрібно лише внести зміни 3 різних місця, щоб розширити це, на hooksкарті, FizzJazzBuzzerім'я функції та, звичайно, виклик FizzJazzBuzzerфункції.


1

R

Це створює функцію, яка дозволяє користувачеві задавати пари слів і дільників (і, можливо, максимальне число, 100 за замовчуванням). Функція створює вектор від 1 до максимальної кількості, потім замінює будь-які числа на позиціях "fizzbuzz" на "" і, нарешті, вставляє кожне слово у потрібне положення. Функція упорядковує список від найнижчого до найвищого числа, щоб найменше число завжди було першою частиною "fizzbuzz". Позиції обчислюються за допомогою seqстворення вектора, починаючи з заданого числа і збільшуючись з кроком цього числа до досягнення максимального бажаного числа.

fizzbuzzer = function(max.num=100, ...){

input = list(...)
input = input[order(unlist(input))] #reorder input list by number
words = names(input)

#vector containing the result
output = seq_len(max.num)

#remove numbers at positions to contain a "fizzbuzz"
sapply(input, function(x) output[seq(x, max.num, x)] <<- "")

#add words at required points
sapply(seq_len(length(input)), function(i) output[seq(input[[i]], max.num, input[[i]])] <<- paste0(output[seq(input[[i]], max.num, input[[i]])], words[i]))

return(output)
}    

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

приклади використання:

fizzbuzzer(fizz=3, buzz=5)
fizzbuzzer(fizz=3, buzz=5, jazz=4)
fizzbuzzer(max.num=10000, golf=10, stack=100, code=1, exchange=1000)

Вихід fizzbuzzer(fizz=3, buzz=5):

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

(числа в квадратних дужках - це показники вектора, який функція виводить)


1

Хаскелл

Жодна модульна арифметика не використовується, за винятком обчислення найменшого спільного множини, щоб уникнути повторення непотрібної роботи. З'єднання рядків потрібно робити лише 60 разів, незалежно від того, для чого ми встановили верхню межу.

-- Don't repeat `transpose` from `Data.List`
import Data.List (transpose)

-- The desired problem
lst = [(3, "Fizz"), (4, "Jazz"), (5, "Buzz")]

-- Map a function over both sides of a tuple.
-- We could also get this from importing Bifunctor (bimap), bit it's not in the core libraries
bimap f g (x, y) = (f x, g y)

-- Make infinite lists with the word occuring only once every n items, starting with the first
fizzify = map (cycle . uncurry take . bimap id (:repeat ""))

-- Reorganize the lists so there's a single infinite list, smash the words together, and drop the first set.
fjb = tail . map concat . transpose . fizzify

-- The following two functions avoid repeating work building the lists
-- Computes the least common multiple of a list of numbers
lcms = foldr lcm 1

-- fjbLcm is just a more efficient version of fjb; they can be used interchangably
fjbLcm lst = cycle . take (lcms . map fst $ lst) . fjb $ lst

-- show the number if there aren't any words
result = zipWith (\x y -> if null x then show y else x) (fjbLcm lst) [1..100]

main = print result

Заміна fjbLcmна fjbробить саме те ж саме, без арифметики, окрім як у [1..100]та take.


Це по суті те саме рішення Німі , якого я раніше не помічав.
Cirdec

1

Python2

Оновлення: Нова версія не використовує жодних операцій модифікації чи поділу.

word_dict = {3: 'Fizz', 4: 'Jazz', 5: 'Buzz'}

def fizz_jazz_buzz(n, d):
    counters = {k: k for k in d}
    for i in xrange(1, n + 1):
        u = ''
        for k in d:
            if counters[k] == i:
                u += d[k]
                counters[k] += k
        print u or i

fizz_jazz_buzz(100, word_dict)

Якщо ви хочете додати ще одне слово до тесту, просто киньте пару ключів / значень у словник word_dict:

word_dict[7] = 'Razz'
fizz_jazz_buzz(100, word_dict)

Якщо ви хочете позбутися слова, просто видаліть його (використовуючи del) або встановіть його ''.

del word_dict[3]
fizz_jazz_buzz(100, word_dict)

Дивіться також відповіді Python Gnibbler та Jakube , які були розміщені перед моїми.


1

C #

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

Dictionary<int, string> dict = new Dictionary<int, string>()
{
    {3, "Fizz"},
    {4, "Jazz"},
    {5, "Buzz"}
};
for (int i = 0; i < 100; i++)
{
    string msg = null;
    foreach (var pair in dict)
        if (i % pair.Key == 0)
            msg += pair.Value;
    Console.WriteLine(msg ?? i + "");
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.