Fizz Buzz z unikatowymi postaciami w kolumnach

21

Zainspirowany przez Cyfry na swoich liniach oraz 1, 2, Fizz, 4, Buzz

Wprowadzenie

Twoim zadaniem jest wygenerowanie dokładnie następujących danych wyjściowych:

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

Wyzwanie

To wyzwanie opiera się na wyzwaniu Fizz Buzz, a oto podsumowanie: wypisz liczby od 1 do 100 włącznie, każdy numer w osobnej linii, ale jeśli liczba jest wielokrotnością 3, powinieneś wypisać „Fizz” zamiast oryginalny numer, jeśli liczba jest wielokrotnością 5, powinieneś wypisać „Buzz” zamiast oryginalnego numeru. Jeśli liczba jest wielokrotnością 15, powinieneś wypisać „FizzBuzz” zamiast oryginalnego numeru.

Jednak oprócz powyższego wymagania należy również wciąć każdą linię za pomocą spacji, aby każda kolumna zawierała tylko unikalne znaki (z wyjątkiem spacji i nowych linii). Spacje poprzedzające każdą linię to minimum wymagane do tego, aby wszystkie linie pojawiły się, zanim (włącznie) będzie miała unikalne znaki w każdej kolumnie.

Na przykład, 1,2,Fizz,4nie potrzeba żadnego wcięcia bo oni już mają unikalne znaki w każdej kolumnie (kolumna 1: 12F4, column2: i, kolumna3: z, column4: z), ale podczas dodawania Buzzmusimy tiret dwóch przestrzeniach, ponieważ w przeciwnym razie mamy dwa z„s zarówno w trzeciej, jak i czwartej kolumnie. Ponieważ do osiągnięcia celu wystarczą dwa pola, nie należy wcinać go o trzy pola. 7i 8nie potrzebuje żadnego wcięcia, ale podczas wypisywania 11musimy wcięcia o jedną spację, ponieważ pierwsza kolumna ma już znak 1. 13następnie muszą być wcięte o trzy spacje, ponieważ teraz pierwsza, druga i trzecia kolumna mają znak 1. Wcięcia dla pozostałych linii są zgodne z tą samą zasadą.

Aby uprościć wyzwanie, górny limit został zmieniony na 50.

Okular

  • Możesz napisać program lub funkcję. Żadne z nich nie powinno przyjmować żadnych niepustych danych wejściowych. Przyjmowanie pustych danych jest w porządku.

  • Ponieważ jest to wyzwanie KC, musisz wygenerować dane wyjściowe zgodnie z opisem we wstępie. Pojedynczy znak nowej linii jest w porządku. Brak nowych linii nagłówka lub dodatkowych spacji nagłówka. Brak dodatkowych spacji dla każdej linii.

  • Twój program może wyjść z błędem lub mieć niepuste wyjście STDERR, o ile STDOUT jest zgodny ze specyfikacją.

  • Jest to międzyjęzykowy , program z najmniejszą liczbą bajtów wygrywa w swoim języku.

  • Obowiązują domyślne luki .

Weijun Zhou
źródło
2
Podany wynik nie jest dokładnie zgodny ze specyfikacją, np. Wiersze 12, 20, 35 i 50.
Bubbler
1
Ale drugim znakiem w pierwszych dwóch wierszach jest powrót karetki.
Kumulacja
Wyłączyłem spacje, teraz powinienem również wykluczyć znaki nowej linii.
Weijun Zhou

Odpowiedzi:

9

Python 2 , 127 bajtów

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

Wypróbuj online!

Pięćdziesięciobajtowa tabela odnośników wydaje się boleć wielkości kodu mniejszej niż logika niezbędna do śledzenia, które znaki wystąpiły w każdej kolumnie.

Lynn
źródło
1
Logika byłaby lepsza, gdybyśmy musieli zamiast tego wydrukować do 100 ...
Bubbler
5

Python 2 , 167 166 163 161 157 bajtów

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

Wypróbuj online!

Edycje:

  • whilejest krótszy niż for..range()o 1 bajt.
  • Dzięki @ovs za golenie 3 bajtów. Zawsze zapominam exec...
  • Dostosowana i%3/2sztuczka z odpowiedzi Lynn (-2 bajty).
  • @Lynn sugeruje a=map(set,[[]]*99), ale okazało się, za pomocą innego sposobu evali reprz tych samych bajtów (-4 bajtów).

Użyj listy zestawów, aby śledzić znaki używane w każdej kolumnie, i ustaw nierówność członkostwa. Reszta jest zgodna z podaną dokładną specyfikacją.

Bubbler
źródło
4

C (gcc) , 145 144 bajtów (143 dla heksadecymalnego)

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

Wypróbuj 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
źródło
3

Ruby , 129 bajtów

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

Wypróbuj online!

Podwójne uznanie dla Lynna za podejście do tabeli odnośników i algorytm fizzbuzz .

Algorytm FizzBuzz jest bardzo interesujący i opiera się na niezwykłym zbiegu okoliczności, że wszystkie dodatnie, niepodzielne liczby mniejsze niż 15 (inne niż 3 i 5), po podniesieniu do 4. potęgi, są o 1 większe niż wielokrotność 15. W fakt:

 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

Wartości 3**4%15i 5**4%15są dokładnie 4 osobno: długość ciągu „Fizz”. Możemy to wykorzystać, używając ich do indeksowania od końca łańcucha o długości co najmniej 9 znaków. Wielokrotności 3 będą indeksowane od początku ciągu, a wielokrotności 5 będą indeksować od 5 znaków od końca. Każda inna liczba spróbuje zaindeksować od początku łańcucha i zakończy się niepowodzeniem, powracając nil. Następnie 15, oczywiście, indeksuje od 0 znaku. Fakt, że „FizzBuzz” ma tylko 8 znaków, stanowi niewielką przeszkodę; używamy znaku nowej linii, aby go wstawić, który później zostanie zignorowany przez puts.

Możliwe jest, że stół przeglądowy może zostać pokonany przez podejście bardziej proceduralne, ale moja próba była w okolicach 190 bajtów.

benj2240
źródło
2
Ciekawy. Należy zauważyć, że fakt, że wszystkie liczby są kopiowane do 15 po podniesieniu do 4. potęgi równej 1 modułowi 15, można wyprowadzić z małego twierdzenia Fermata.
Weijun Zhou
2

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

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

`

Wypróbuj online!

Sam program ostrzegawczy działa w niedopuszczalnym czasie

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

Wypróbuj online!

l4m2
źródło
Twoja odpowiedź nie wygląda tak samo jak link TIO
Jo King
@JoKing tablica wyjść TIO i nie wiem, czy jest to dozwolone
l4m2
2

Java (JDK 10) , 185 bajtów

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

Wypróbuj online!

Kredyty

Olivier Grégoire
źródło
1

Haskell , 190 187 186 178 176 bajtów

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

Wypróbuj online!

Nieco bardziej czytelna (i opatrzona komentarzem) wersja:

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

Edycja: W końcu wprowadziłem niektóre funkcje w wersji golfowej, aby zaoszczędzić więcej bajtów.

Cristian Lupascu
źródło
@Laikoni Racja. Naprawiony.
Cristian Lupascu
1

Jstx , 122 bajty

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

Wypróbuj online!

Quantum64
źródło