Создайте программу «BizzFuzz»

17

В традиционном FizzBuzz вас просят напечатать числа от 1 до 100, но замените каждое кратное 3 на «Fizz», каждое кратное 5 на «Buzz», а каждое кратное 3 и 5 (т.е. 15) на « FizzBuzz».

Тем не менее, как злой интервьюер, я изобрел свою собственную искаженную версию FizzBuzz, которую я решил назвать BizzFuzz и дать вам в интервью по кодированию.

Правила игры:

  • Напечатайте каждое число от 1 до 100, кроме случаев, когда число соответствует одному из следующих условий.

    • Если число делится на 4, выведите «Fizz».
    • Если число делится на 5, выведите «Buzz».

    • Если число делится на 4, а число сразу после него делится на 5, выведите «FizzBuzz» вместо «Fizz» и регулярно печатайте следующее число.

    • Если число делится на 5, а число сразу после него делится на 4, выведите «BuzzFizz» вместо «Buzz» и регулярно печатайте следующее число.

    • Если число находится непосредственно перед числом, кратным 4 и 5, выведите «Bizz».

    • Если число идет сразу после числа, делимого на 4 и 5, выведите «Fuzz».

    • Если число делится на 4 и 5, выведите «BizzFuzz».

Самый короткий код для реализации всех этих правил на любом языке выигрывает.

Джо З.
источник

Ответы:

4

GolfScript ( 83 80 символов)

(Предложение Н.Б. Говарда в комментариях позволяет сократить до 78 символов, но с пробелами в некоторых строках).

Здесь используется символ \0, поэтому здесь он находится в формате xxd:

0000000: 3130 302c 7b29 2e32 3025 2742 6946 750a  100,{).20%'BiFu.
0000010: 0046 750a 0000 0046 6942 750a 0000 0000  .Fu....FiBu.....
0000020: 4669 0a00 0042 750a 0000 4669 0a00 0000  Fi...Bu...Fi....
0000030: 4275 4669 0a00 0000 0042 690a 2731 2c2f  BuFi.....Bi.'1,/
0000040: 3d32 2f27 7a7a 272a 5c6e 2b6f 727d 2f0a  =2/'zz'*\n+or}/.

и base64:

MTAwLHspLjIwJSdCaUZ1CgBGdQoAAABGaUJ1CgAAAABGaQoAAEJ1CgAARmkKAAAAQnVGaQoAAAAA
QmkKJzEsLz0yLyd6eicqXG4rb3J9Lwo=

Используя ^ в качестве замены \0, это

100, {). 20% 'BiFu
 ^ Fu
 ^ ^ ^ FiBu
 ^ ^ ^ ^ Fi
 ^ ^ Bu
 ^ ^ Fi
 ^ ^ ^ BuFi
 ^ ^ ^ ^ Bi
'1, / = 2 /' ZZ '* \ п + или} /

Все еще не особенно интересная проблема.


Было запрошено объяснение:

Для значений 0до 99включительно:

100,{
...
}/

Увеличивает значение (мы хотим , 1чтобы 100) , а также выяснить , что порядковое значение mod 20:

).20%

Разделите волшебную строку вокруг \0персонажей:

MAGIC_STRING 1,/

Возьмите ( x mod 20) элемент этого массива, разбейте его на 2-символьные куски и склейте их вместе с zz. Примечание: строка либо пуста (в этом случае чанки отсутствуют, поэтому в итоге получается пустая строка), либо представляет собой последовательность [BF][iu]префиксов, за которой следует символ новой строки.

=2/'zz'*

Возьмите другую копию увеличенного числа, которое мы сохранили в стеке, и добавьте новую строку. Теперь любая строка, которую мы сохраним, будет заканчиваться символом новой строки.

\n+

Применить резервную операцию. (Это похоже на ||JavaScript или COALESCESQL).

or
Питер Тейлор
источник
@minitech, опечатка введена не копированием, потому что перерисовка всего - боль в шее. Исправлена.
Питер Тейлор
2
переопределение всего = CTRL + K
Джон Дворак
Вы можете это объяснить?
Йоханнес Кун
«Не очень интересная проблема». Да, у меня было предчувствие, что это имело место, когда я отправил это. Тем не менее, это вариация.
Джо З.
Это также становится более интересной, как игра в салон с друзьями, а не программирование. По очереди пытаюсь сказать номера по порядку. Это в основном FizzBuzz Hardcore Edition, если вы не запомните последовательность заранее.
Джо З.
13

Python, 114

a='Fizz'
b='Buzz'
c='Bizz'
d='Fuzz'
e=c+d
f=a+b
g=b+a
i=1
exec"print eval('ediifiiiaibiaiigiiic'[i%20]);i+=1;"*100

Исходное решение ( 131 ):

f='Fizz'
for i in range(1,101):x=i%20;print('Bizz'*(x%19<1)+'Fuzz'*(x<2)or(i%4<1)*f+'Buzz'*(i%5<1or x==4)+f*(x==15)or i,i)[x%11==5]
GRC
источник
3
Действительно красивое злоупотребление eval
3

Python 2, 131

F,B,Z,I='Fizz','Buzz','Fuzz','Bizz'
for i in range(1,101):print{5:Z,19:I,i%4:B,i%5*4:F,3:B+F,16:F+B,0:I+Z,1:i,4:i}.get(i%4+i%5*4,i)
Рыбаковым
источник
1
Вы можете увеличить это до 154, используя а) логическое замыкание на выражении для печати, б) изменение значения, rчтобы вычислить его в меньшем количестве символов, в) размещение всего в одной строке:r,F,B,Z,I=1,'Fizz','Buzz','Fuzz','Bizz'\nfor i in range(1,101):a,b=i%4,i%5*4;print~-r and i or{5:Z,19:I,a:B,b:F,3:B+F,16:F+B,0:I+Z}.get(a+b,i);r=3!=a+b!=16
Восстановите Монику
@WolframH: Спасибо! Я применил их с некоторыми изменениями, чтобы сделать 143.
Ry-
Хорошо, это меня победило, впечатляющая работа. Я люблю print 1!=a+b!=4это дьявольское!
1
@LegoStormtroopr: нет. exec/ evalКомбо дьявольский;)
Рыбаковым
Да, это будет трудно победить. Я смог сжать и лишний раз сформировать ваш, хотя, изменив раздел печати наprint{5:Z,19:I,a:B,b:F,3:B+F,16:F+B,0:I+Z,1:i,4:i}.get(a+b,i)
1

Реализованная ссылочная реализация в Python, которая реализует каждое правило буквально (420 символов):

n = 1
while(n <= 100):
    if(n % 20 == 0):
        print "BizzFuzz"
    elif((n - 1) % 20 == 0):
        print "Fuzz"
    elif((n + 1) % 20 == 0):
        print "Bizz"
    elif(n % 5 == 0 and (n + 1) % 4 == 0):
        print "BuzzFizz"
        print n + 1
        n += 1
    elif(n % 4 == 0 and (n + 1) % 5 == 0):
        print "FizzBuzz"
        print n + 1
        n += 1
    elif(n % 4 == 0):
        print "Fizz"
    elif(n % 5 == 0):
        print "Buzz"
    else:
        print n
    n += 1
Джо З.
источник
3
Привет. Вы получили скобки в моем Python.
Ry-
Я думаю, что IDE, которую я использовал, вставил их по умолчанию. Я был на компьютере с Windows, и пытаться кодировать с помощью текстового редактора на Windows жестоко.
Джо З.
1

Питон, 150

Это производная от ответов на мини-версии (ранее), но я выжал из этого достаточно, чтобы сделать свой собственный:

F,B,Z,I='Fizz','Buzz','Fuzz','Bizz'
for i in range(1,101):a,b=i%4,i%5*4;print i if a+b in [1,4] else {5:Z,19:I,a:B,b:F,3:B+F,16:F+B,0:I+Z}.get(a+b,i)

Версия для разглаживания не намного более читабельна, но то, rчто использовала Minitech, срабатывает только в том случае, если на следующей итерации сумма, если a,bбыла, 1,0или 0,4, что эквивалентно, i%4 or i%5 == 0так что она собиралась появиться только в этих обстоятельствах. Таким образом, было возможно удалить назначение и вычисление rи вывести его из текущей стоимости iиспользования aи b:

F,B,Z,I='Fizz','Buzz','Fuzz','Bizz'
for i in range(1,101):
 a,b=i%4,i%5*4;
 print i if a+b in [1,4] else {5:Z,19:I,a:B,b:F,3:B+F,16:F+B,0:I+Z}.get(a+b,i)

Это также включает в себя предложения @ WolframH.


источник
Э-э, это не совсем так. В любом случае, уберите места вокруг [1,4](и используйте (1,4)или {1,4}помимо) и до {.
Ry-
Не отличается, нет, просто изменился достаточно, чтобы я думал, что это стоило входа.
Хорошо, но вы должны играть в гольф на пустое место.
Ry-
@minitech не беспокойся. Приветствия для чаевых на []расстоянии. Мне было интересно, почему вы использовали {}в своем первоначальном ответе.
1

R: 170 символов

a=b=1:100
o=!a%%4
i=!a%%5
w=o&i
a[o]="Fizz"
a[i]="Buzz"
a[c(i,F)&c(F,o)]="FizzBuzz"
a[c(F,i)&c(o,F)]="BuzzFizz"
a[w[-1]]="Bizz"
a[c(F,w)]="Fuzz"
a[w]="BizzFuzz"
cat(a[b])
plannapus
источник
0

Tcl, 185 символов

while {[incr i]<101} {puts [expr {$i%4?$i%5?($i-1)%4|($i-1)%5?($i+1)%4|($i+1)%5?$i:"Fuzz":"Bizz":($i-1)%4?($i+1)%4?"Buzz":"BuzzFizz":$i:($i-1)%5?($i+1)%5?$i%5?"Fizz":"FizzBuzz":$i:$i}]}
Йоханнес Кун
источник
Иногда whileциклы могут быть заменены timeконструкциями для сохранения байтов
sergiol