Fizz Buzz з унікальними символами в стовпцях


21

Натхненний Цифрами в їх смугах і 1, 2, Fizz, 4, Buzz

Вступ

Ваше завдання - генерувати саме такий результат:

1
2
Fizz
4
  Buzz
    Fizz
7
8
      Fizz
        Buzz
 11
          Fizz
   13
    14
            FizzBuzz
     16
      17
              Fizz
       19
                  Buzz
                    Fizz
 22
    23
                      Fizz
                        Buzz
   26
                          Fizz
     28
      29
                            FizzBuzz
       31
      32
                              Fizz
34
                                  Buzz
                                    Fizz
 37
  38
                                      Fizz
                                        Buzz
        41
                                          Fizz
  43
   44
                                            FizzBuzz
      46
       47
                                              Fizz
         49
                                                  Buzz

Виклик

Цей виклик заснований на виклику Fizz Buzz, і ось резюме: виведіть числа від 1 до 100 включно, кожне число у своєму власному рядку, але якщо число кратне 3, вам слід вивести "Fizz" замість вихідний номер, якщо число кратне 5, слід вивести "Buzz" замість оригінального числа. Якщо число кратне 15, вам слід вивести "FizzBuzz" замість оригінального числа.

Однак, крім вищезазначеної вимоги, слід також відступити кожен рядок, використовуючи пробіли, щоб кожен стовпець містив лише унікальні символи (виключаючи пробіли та нові рядки). Пробіли, передбачені для кожного рядка, є мінімальним, необхідним для того, щоб всі рядки з’явились до того, як у ньому (включно) є унікальні символи у кожному стовпчику.

Наприклад, 1,2,Fizz,4не потрібен ніякий відступи , бо вони вже мають унікальні символи в кожному стовпці (стовпець 1: 12F4, column2: i, колонка3: z, column4: z), але при додаванні Buzzми повинні відступ два прогалин , тому що в іншому випадку ми мали б два z«пд.ш. і в 3-му, і в 4-му стовпцях. Оскільки для досягнення мети достатньо двох пробілів, ви не повинні відступати її на три пробіли. 7і 8не потребує жодних відступів, але при виведенні 11нам потрібно відступити на один пробіл, оскільки 1-й стовпець вже має а 1. 13то потрібно відступити трьома пробілами, оскільки тепер 1-й, 2-й та 3-й стовпці мають а 1. Відступ для решти рядків дотримується того самого правила.

Щоб зробити виклик більш простим, верхня межа була змінена на 50.

Технічні характеристики

  • Можна написати програму або функцію. Жоден із них не повинен приймати жодного непорожнього вводу. Порожній вхід - це добре.

  • Оскільки це виклик KC, вам потрібно отримати результат, як зазначено у розділі Введення. Єдиний зворотний новий рядок чудово. Немає нових рядків заголовка чи додаткових пробілів. Немає зайвих пробілів для кожного рядка.

  • Ваша програма може вийти з помилкою або мати не порожній вихід STDERR до тих пір, поки STDOUT відповідає специфікації.

  • Це внутрішньомовний , програма з найменшою кількістю байтів виграє своєю мовою.

  • Застосовуються лазівки за замовчуванням .


2
Даний вихід не точно відповідає характеристиці, наприклад, рядки 12, 20, 35 та 50.
Bubbler

1
Але другий символ у перших двох рядках - це повернення вагона.
Накопичення

Я виключив пробіли, тепер я повинен також виключити нові рядки.
Вейджун Чжоу

Відповіді:


9

Python 2 , 127 байт

i=0;exec"print ord('<<<<>@<<BD=F?@HABJCNP=@RT?VABXCBZ<^`=>bdDf>?hBCjEn'[i])%60*' '+(i%3/2*'Fizz'+i%5/4*'Buzz'or`-~i`);i+=1;"*50

Спробуйте в Інтернеті!

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


1
Логіка була б кращою, якби нам замість цього потрібно було надрукувати до 100 ...
Bubbler

5

Python 2 , 167 166 163 161 157 байт

a=eval(`[{0}]*99`);i=0
exec"f=i%3/2*'Fizz'+i%5/4*'Buzz'or`i+1`;i+=1;g=0\nwhile any(b>{c}for b,c in zip(a[g:],f)):g+=1\nmap(set.add,a[g:],f);print' '*g+f;"*50

Спробуйте в Інтернеті!

Зміни:

  • whileкоротше, ніж for..range()на 1 байт.
  • Дякуємо @ovs за бриття 3-х байт. Я завжди забуваю exec...
  • Адаптований i%3/2трюк з відповіді Лінни (-2 байти).
  • @Lynn запропонував a=map(set,[[]]*99), але я знайшов інший спосіб, використовуючи evalі reprз тими ж байтами (-4 байти).

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


4

C (gcc) , 145 144 байт (143 для шістнадцяткових)

i;main(){for(;i++<50;printf("%*s%s%.d\n","000402800:81>34@56B7BH14JH3N56P76R0RX12ZX8^23`67b9b"[i]-48,i%3?"":"Fizz",i%5?"":"Buzz",i%3*i%5?i:0));}

Спробуйте в Інтернеті!

0000h: 69 3B 6D 61 69 6E 28 29 7B 66 6F 72 28 3B 69 2B ; i;main(){for(;i+
0010h: 2B 3C 35 30 3B 70 72 69 6E 74 66 28 22 25 2A 73 ; +<50;printf("%*s
0020h: 25 73 25 2E 64 5C 6E 22 2C 22 FE FE FE 02 FE 00 ; %s%.d\n","......
0030h: 06 FE FE 08 06 FF 0C 01 02 0E 03 04 10 05 10 16 ; ................
0040h: FF 02 18 16 01 1C 03 04 1E 05 04 20 FE 20 26 FF ; ........... . &.
0050h: 63 28 26 06 2C 00 01 2E 04 05 30 07 30 22 5B 69 ; c(&.,.....0.0"[i
0060h: 5D 2B 32 2C 69 25 33 3F 22 22 3A 22 46 69 7A 7A ; ]+2,i%3?"":"Fizz
0070h: 22 2C 69 25 35 3F 22 22 3A 22 42 75 7A 7A 22 2C ; ",i%5?"":"Buzz",
0080h: 69 25 33 2A 69 25 35 3F 69 3A 30 29 29 3B 7D    ; i%3*i%5?i:0));}

3

Рубін , 129 байт

puts (1..50).map{|n|" "*(".<<<<>@<<BD=F?@HABJCNP=@RT?VABXCBZ<^`=>bdDf>?hBCjEn"[n].ord%60)+("FizzBuzz
"[i=n**4%-15,i+13]||n.to_s)}

Спробуйте в Інтернеті!

Тут подвійний кредит надається Lynn, для підходу до таблиці пошуку та алгоритму fizzbuzz .

Алгоритм FizzBuzz дуже цікавий, і він залежить від чудового збігу обставин, що всі позитивні, нескладені числа менше 15 (крім 3 і 5) при підвищенні до 4-ї потужності на 1 більше, ніж кратне 15. факт:

 n     n**4  n**4%15  n**4%-15
 1        1     1       -14
 2       16     1       -14
 3       81     6        -9
 4      256     1       -14
 5      625    10        -5
 6     1296     6        -9
 7     2401     1       -14
 8     4096     1       -14
 9     6561     6        -9
10    10000    10        -5
11    14641     1       -14
12    20736     6        -9
13    28561     1       -14
14    38416     1       -14
15    50625     0         0

Значення 3**4%15і 5**4%15рівно 4 один від одного: довжина рядка "Fizz". Ми можемо використати це, використовуючи їх для індексації від кінця рядка довжиною принаймні 9 символів. Множини 3 індексуватимуться з початку рядка, а кратні 5 - індексуватимуть від 5 символів з кінця. Будь-яке інше число намагатиметься проіндексувати до початку рядка і не вдасться повернутись nil. Тоді 15, звичайно, індексів від 0-го символу. Той факт, що "FizzBuzz" має лише 8 символів, є невеликою перешкодою; ми використовуємо символ нового рядка для вставки, який згодом буде проігноровано puts.

Цілком можливо, що таблиця пошуку може бути перевершена за допомогою більш процедурного підходу, але моя спроба була в районі 190 байт.


2
Цікаво. Слід зазначити, що факт, що всі числа врівень до 15 при підвищенні до 4-ї потужності дорівнюють 1 модулю 15, може бути отриманий з малої теореми Ферма.
Вейджун Чжоу

2

[JavaScript (Node.js) REPL], 144 байти

(f=(i,s=[['Fizz'][i%3]]+[['Buzz'][i%5]]||i+[],b=i>1?f(i-1):[])=>[...s].some((p,j)=>b.some(w=>w[j]==p&0!=p))?f(i,' '+s):b.push(s)&&b)(50).join`

`

Спробуйте в Інтернеті!

Сама програма попередження працює неприйнятно

JavaScript (Node.js) , 132 байти Arnauld

f=(a=n=[],s=`${b=++n%5?'':'Buzz',n%3?b||n:'Fizz'+b}
`)=>n>50?'':a.some(x=>[...x].some((c,i)=>c!=0&c==s[i]))?f(a,' '+s):s+f([s,...a])

Спробуйте в Інтернеті!


Здається, ваша відповідь не збігається із посиланням на TIO
Джо Кінг,

@JoKing TIO виводить масив, і я не знаю, чи це дозволено
l4m2

2

Java (JDK 10) , 185 байт

v->{for(int n=0,l;n<50;System.out.printf((l>0?"%"+l:"%")+"s%s%n","",(n%3<1?"Fizz":"")+(n%5<1?"Buzz":n%3<1?"":n)))l="####%'##)+$-&'/()1*57$'9;&=()?*)A#EG$%IK+M%&O)*Q,U#".charAt(n++)-35;}

Спробуйте в Інтернеті!

Кредити


1

Haskell , 190 187 186 178 176 байт

unlines$foldl(\a x->a++[[z|z<-iterate(' ':)x,all(\m->null[p|(p,q)<-m`zip`z,p==q&&p>' '])a]!!0])[]$h<$>[1..50]
a%b=a`mod`b<1
h n|n%15="FizzBuzz"|n%3="Fizz"|n%5="Buzz"|1<2=show n

Спробуйте в Інтернеті!

Трохи зручніша для читання (та примітка):

-- check if a is evenly divisible by b
a%b=a`mod`b<1
-- produce correct FizzBuzz output for a number
h n|n%15="FizzBuzz"|n%3="Fizz"|n%5="Buzz"|1<2=show n
-- test if all chars distinct between two strings
x#y=null[a|(a,b)<-x`zip`y,a==b&&a>' ']
-- given a new string and all previous strings
-- shift the new string to the right until all
-- chars are distinct
x!y=[z|z<-iterate(' ':)y,all(z#)x]!!0
g=h<$>[1..50]
f'=foldl step[]g
  where step acc x = acc++[acc!x]

Редагувати: я закінчив вбудувати деякі функції у версії для гольфу, щоб зберегти більше байтів.


@Laikoni Правильно. Виправлено.
Крістіан Лупаску

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