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 имеют a 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));}
l4m2
источник
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)}

Попробуйте онлайн!

Двойной кредит отдается Линн за подход к таблице поиска и алгоритм 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 байтов.

benj2240
источник
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 байта, Арнаулд

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

Попробуйте онлайн!

l4m2
источник
Ваш ответ не похож на ссылку 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]

Редактировать: в конечном итоге я добавил некоторые функции в версии для гольфа, чтобы сохранить больше байтов.

Кристиан Лупаску
источник
@ Лайкони Верно. Исправлена.
Кристиан Лупаску,