Створіть програму «BizzFuzz»


18

У традиційному 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 '* \ n + або} /

Все ще не особливо цікава проблема.


Потрібно пояснити:

Для значень 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
reindenting everything = CTRL + K
Джон Дворак

Чи можете ви пояснити це?
Йоганнес Кун

"Не дуже цікава проблема". Так, у мене була думка, що це було так, коли я розміщував це. Все-таки це варіація.
Джо Z.

Також вона стає цікавішою як гра в салони з друзями, а не проблема програмування. По черзі намагаючись сказати числа по порядку. Це в основному FizzBuzz Hardcore Edition, якщо ви не запам’ятали попередньо послідовність.
Джо Z.

15

Пітона, 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]

4
По-справжньому красиве зловживання eval

3

Пітон 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
Відновіть Monica

@WolframH: Дякую! Я застосував ті , з деякими змінами , щоб зробити 143.
Рибаковим

Добре, це мене вразило, вражаюча робота. Я люблю 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.
Ри-

Я думаю, що IDE, який я використовував, вставив їх за замовчуванням. Я був на машині Windows, і спроба кодування за допомогою текстового редактора в Windows є брутальною.
Джо Z.

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мінітех використовувалась лише тоді, коли на наступній ітерації сума 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}крім того) та раніше {.
Ри-

Не відрізнявся ні, просто змінився досить, що я вважав, що варто було вступити.

Гаразд, але вам слід пограти в поле для пробілів.
Ри-

@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])

1

Javascript 127 байт

f='Fizz';b='Buzz';F='Fuzz';B='Bizz';z=n=>(n?z(n-1):0,console.log([f,b,B,F,B+F,f+b,b+f,n]["43775777071707767772"[n%20]]));z(100)

Пояснення

f = 'Fizz';
b = 'Buzz';
F = 'Fuzz';
B = 'Bizz';

z = n => (
    n?z(n-1):0,  // If n is greater than 0, we keep going downwards, this happens before printing.
    console.log(
        // These are the values that we a want to print, it is
        // very important that it is written inline inside the
        // function, otherwise, we couldn't have 'n' in it
        [f,b,B,F,B+F,f+b,b+f,n][
          // The game cycles every 20 steps, so we can build a
          // look up table that we'll use to index into the other
          // table. We take advantage of implicit string -> Number
          // conversion inside the index operator, and use a
          // string instead of an array, saving 1 byte per entry
          "43775777071707767772"[n%20]])
);

z(100);

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.