Fizz Buzz com caracteres únicos em colunas

21

Inspirado por dígitos nas faixas e 1, 2, Fizz, 4, Buzz

Introdução

Sua tarefa é gerar exatamente a seguinte saída:

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

Desafio

Esse desafio é baseado no desafio do Fizz Buzz, e aqui está uma recapitulação: produza os números de 1 a 100 inclusive, cada número em sua própria linha, mas se o número for múltiplo de 3, você deve gerar "Fizz" em vez de o número original, se o número for múltiplo de 5, você deve enviar "Buzz" em vez do número original. Se o número for múltiplo de 15, você deve enviar "FizzBuzz" em vez do número original.

No entanto, além do requisito acima, você também deve recuar cada linha usando espaços para que cada coluna contenha caracteres exclusivos (excluindo espaços e novas linhas). Os espaços anexados a cada linha são o mínimo necessário para fazer com que todas as linhas apareçam antes que (inclusive) possua caracteres exclusivos em cada coluna.

Por exemplo, 1,2,Fizz,4não precisa de nenhum recuo porque eles já têm personagens únicos em cada coluna (coluna 1: 12F4, column2: i, column3: z, column4: z), mas ao adicionar Buzzprecisamos travessão por dois espaços, porque caso contrário, teríamos dois z's na terceira e na quarta coluna. Como dois espaços são suficientes para atingir a meta, você não deve recuá-la em três espaços. 7e 8não precisa de nenhum recuo, mas ao sair 11precisamos recuar em um espaço, porque a 1ª coluna já possui a 1. 13precisa ser recuado por três espaços, porque agora a 1ª, a 2ª e a 3ª colunas têm a 1. O recuo para as linhas restantes segue a mesma regra.

Para simplificar o desafio, o limite superior foi alterado para 50.

Especificações

  • Você pode escrever um programa ou uma função. Nenhum deles deve receber nenhuma entrada não vazia. Receber uma entrada vazia é bom.

  • Como esse é um desafio da KC, é necessário produzir a saída conforme especificado na seção Introdução. Uma única nova linha à direita é boa. Sem novas linhas de cabeçalho ou espaços extras de cabeçalho. Não há espaços extras à direita para cada linha.

  • Seu programa pode sair com erro ou ter uma saída STDERR não vazia, desde que STDOUT esteja em conformidade com a especificação.

  • Este é o intra-idioma , o programa com o menor número de bytes vence em seu idioma.

  • Aplicam-se brechas padrão .

Weijun Zhou
fonte
2
O dado de saída não corresponder exatamente a especificação, por exemplo, linhas 12, 20, 35 e 50.
Bubbler
1
Mas o segundo caractere nas duas primeiras linhas é o retorno de carro.
Acumulação 28/03/19
Excluí espaços, agora também devo excluir novas linhas.
Weijun Zhou 28/03

Respostas:

9

Python 2 , 127 bytes

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

Experimente online!

Uma tabela de pesquisa de cinquenta bytes parece prejudicar o tamanho do código menos que a lógica necessária para rastrear quais caracteres ocorreram em cada coluna.

Lynn
fonte
1
Logic teria sido melhor se fomos obrigados a imprimir até 100 em vez ...
Bubbler
5

Python 2 , 167 166 163 161 161 157 bytes

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

Experimente online!

Edições:

  • whileé menor que for..range()1 byte.
  • Obrigado a @ovs por remover 3 bytes. Eu sempre esqueço exec...
  • i%3/2Truque adaptado da resposta de Lynn (-2 bytes).
  • @ Lynn sugeriu a=map(set,[[]]*99), mas eu encontrei outra maneira usando evale reprcom os mesmos bytes (-4 bytes).

Use uma lista de conjuntos para rastrear os caracteres usados ​​para cada coluna e defina a desigualdade para associação. O restante segue as especificações exatas fornecidas.

Bubbler
fonte
4

C (gcc) , 145 144 bytes (143 para hex)

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));}

Experimente online!

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
fonte
3

Ruby , 129 bytes

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

Experimente online!

O crédito duplo é para Lynn aqui, pela abordagem da tabela de pesquisa e pelo algoritmo fizzbuzz .

O algoritmo FizzBuzz é muito interessante e depende da notável coincidência de que todos os números positivos, não compostos, com menos de 15 (exceto 3 e 5), quando elevados à quarta potência, são 1 a mais que um múltiplo de 15. facto:

 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

Os valores 3**4%15e 5**4%15são exatamente 4 separados: o comprimento da string "Fizz". Podemos explorar isso usando-os para indexar a partir do final de uma string, com pelo menos 9 caracteres. Múltiplos de 3 serão indexados a partir do início da string e múltiplos de 5 serão indexados a partir de 5 caracteres no final. Todos os outros números tentarão indexar antes do início da string e falharão, retornando nil. Então 15, é claro, indexa o 0º caractere. O fato de "FizzBuzz" ter apenas 8 caracteres é um pequeno obstáculo; usamos um caractere de nova linha para preenchê-lo, que mais tarde será ignorado por puts.

É possível que a tabela de pesquisa possa ter um resultado mais procedimental, mas minha tentativa foi de aproximadamente 190 bytes.

benj2240
fonte
2
Interessante. Deve-se notar que o fato de todos os números coprimarem para 15 quando aumentados para a quarta potência igual a 1 módulo 15 pode ser derivado do pequeno teorema de Fermat.
Weijun Zhou 28/03
2

[JavaScript (Node.js) REPL], 144 bytes

(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`

`

Experimente online!

O próprio programa de aviso executa um tempo inaceitável

JavaScript (Node.js) , 132 bytes por 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])

Experimente online!

l4m2
fonte
A sua resposta não parece ser o mesmo que o link TIO
Jo rei
@JoKing variedade TIO saídas, e eu não sei se isso é permitido
l4m2
2

Java (JDK 10) , 185 bytes

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;}

Experimente online!

Créditos

Olivier Grégoire
fonte
1

Haskell , 190 187 186 178 176 bytes

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

Experimente online!

A versão um pouco mais legível (e anotada):

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

Edit: Acabei inline algumas funções na versão golfed para salvar mais bytes.

Cristian Lupascu
fonte
@Laikoni Right. Fixo.
Cristian Lupascu 28/03
1

Jstx , 122 bytes

◄50-☺6*ø($♥:ø↕♂Fizz♀☺(◙$♣:ø↕♂Buzz♀6☺(◙"ø↕$6◙♂<<<<>@<<BD=F?@HABJCNP=@RT?VABXCBZ<^`=>bdDf>?hBCjEn'[i])%60*♀&P◄59▼ö,► 7.☻a0.2

Experimente online!

Quantum64
fonte