Fizzbuzz w dowolnej bazie


10

Wyzwanie

Wejście:

Liczba całkowita od 2 do 62 (włącznie).b

Wynik:

Policz od do równowartości w podstawie , używając dowolnej rozsądnej reprezentacji cyfr.1500010b

Jednak:

  • Jeśli liczba jest podzielna przez (zaokrąglona w dół, np. Podstawa 7 będzie wynosić 7/2 = 3,5, 3,5 + 1 = 4,5, zaokrąglona do 4 ), a następnie wypisz „Fizz” zamiast liczby .b÷2+1

  • Jeśli liczba jest podzielna przez (zaokrąglona w górę, np. + 3 = 6,666, zaokrąglona do 7 ), następnie wyślij „Buzz”.b÷3+3

  • Jak zapewne można się domyślić, jeśli twój numer jest podzielny przez oba, wypisz „Fizzbuzz”.

Przykłady

Używanie [0–9] , [AZ] i [az] jako cyfr

(Podałem tylko pierwsze 10 wartości, aby przykłady były krótkie - zwykle w każdej sekwencji było o 4990 więcej pozycji)

Wejście: 10 (więc „Fizz” = 6 i „Buzz” = 7)

Wyjście: 1, 2, 3, 4, 5, Fizz, Buzz, 8, 9, 10

Wejście: 2 (więc „Fizz” = 2 i „Buzz” = 4)

Wyjście: 1, Fizz, 11, Fizzbuzz, 101, Fizz, 111, Fizzbuzz, 1001, Fizz

(Podałem pierwsze 50 wartości z poniższych, aby lepiej pokazać, jak działają)

Dane wejściowe: 55 (więc „Fizz” = = i „Buzz” = = )2810s552210m55

Wyjście: 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, g, h, i, j, k, l, Buzz, n, o, p, q, r, Fizz, t, u, v, w, x, y, z, A, B, C, D, E, F, G, H, I, J, K, L, M, N

Zasady

  • Standardowe luki są zabronione
  • To jest Code Golf, więc wygrywa najkrótsza odpowiedź w bajtach
  • Dane wejściowe i wyjściowe mogą odbywać się za pośrednictwem konsoli lub argumentów / zwrotów funkcji
  • Wiodące / końcowe białe znaki są w porządku, podobnie jak puste linie
  • Odstępy między „Fizz” a „Buzz” są niedozwolone
  • Każdy wariant wielkich liter w „Fizz” / „Buzz” / „Fizzbuzz” jest w porządku.
  • Wyniki powinny być oddzielone znakami nowej linii.
  • Jeśli zwrócisz tablicę 10 „cyfr” zamiast reprezentować je za pomocą znaków, muszą one być w odpowiedniej kolejności!

2
Nie mam nic przeciwko. Jeśli chcesz używać emoji zamiast cyfr, nadal nie mam nic przeciwko. Liczy się baza, a nie reprezentacja.
Geza Kerecsenyi

2
Ok, teraz wyjaśnione.
Geza Kerecsenyi

5
Technicznie rzecz biorąc, w bazie 36 słowo buzzsamo pojawia się w indeksie 553391, fizzw 724463i fizzbuzzo 1216820199599. Niestety, żadna z nich nie jest podzielna przez liczby tej bazy
Jo King

3
Dlaczego baza 10 nie jest oryginalnym FizzBuzz? : Nie mogłem wymyślić algorytmu, który zarówno generowałby oryginalne liczby w bazie 10, jak i przenosiłby dobrze do innych baz. I nie chciałem dodawać specjalnego przypadku odmowy, ponieważ moim zdaniem po prostu skomplikowałoby to pytanie.
Geza Kerecsenyi

3
W przypadku przyszłych wyzwań zastanów się nad bardziej elastycznym We / Wy. Uciążliwe formaty wejścia / wyjścia to najbardziej popularny temat w temacie Rzeczy, których należy unikać podczas pisania wyzwań .
Arnauld

Odpowiedzi:


3

Galaretka ,  42 38 34 33 29  32 bajtów

+3, aby zastosować się do ścisłych zasad formatowania

5ȷɓ;8Ä:2,3‘ḍȧ"“Ƈד=%»ḟ0Fȯb@K¥ð€Y

Pełen program, który drukuje 5000 linijek tekstu, każdy wiersz zawierający szereg liczb całkowitych (cyfry) lub jednym z fizz, buzzlub fizzbuzz(działa dobrze poza podstawy 62).

Wypróbuj online!

W jaki sposób?

Zwróć uwagę, że ... i
b÷2+1 =b÷2+1

b÷3+3=b÷3+2+1=(b+6)÷3+1=(b+8)÷3+1

aktualizuję ...

5ȷɓ;8Ä:2,3‘ḍȧ"“Ƈד=%»ḟ0Fȯb@ð€ - Link: integer, b
5ȷ                            - 5*10³ = 5000
  ɓ                        ð€ - for €ach n in [1,2,...,5000] get this f(b,n):
    8                         -   eight
   ;                          -   concatenate      -> [b,8]
     Ä                        -   cumulative sums  -> [b,b+8]
       2,3                    -   pair literal        [2,3]
      :                       -   integer division -> [b//2, (b+8)//3]
          ‘                   -   increment        -> [b//2+1, (b+8)//3+1]
           ḍ                  -   divides n?       -> [n is fizzy?, n is buzzy?]
              “Ƈד=%»         -   list of dictionary strings = ['fizz','buzz']
             "                -   zip with:
            ȧ                 -     logical AND    -> [0,0], ['fizz',0], [0,'buzz'],
                              -                       or ['fizz','buzz']
                      0       -   zero
                     ḟ        -   filter discard   -> [], ['fizz'], ['buzz'],
                              -                       or ['fizz','buzz']
                       F      -   flatten          -> [], ['fizz'], ['buzz'],
                              -                       or ['fizzbuzz']
                          @   -   using swapped arguments:
                         b    -     (n) to a list of digits in base (b)  (say, [nb])
                        ȯ     -   logical OR       -> [nb], ['fizz'], ['buzz'],
                              -                       or ['fizzbuzz']

Wyzwanie mówi, że produkcja musi odbywać się w osobnych liniach
Embodiment of Ignorance

Prawdziwe. Chociaż nie mam nic przeciwko reprezentacji (choć jest to granica), generowanie tablicy nie jest tym samym, co granie w grę. Jeśli jednak wypiszesz tablicę cyfr w każdej linii, zaakceptuję to.
Geza Kerecsenyi

3
@GezaKerecsenyi Zaktualizowano. Nie rozumiem jednak, w jaki sposób reprezentacja jest „granicy” - w podstawie b cyfry są w . Lub jak wyjście tablicy nie „gra” („Wejście i wyjście może odbywać się za pomocą konsoli lub argumentów / zwrotów funkcji”). Korzystanie z innych arbitralnych danych wyjściowych jest tak proste, jak podstawianie, a formatowanie jest po prostu płytą podstawową i prostopadłą do rdzenia wyzwania. [0,n1]
Jonathan Allan

Implementacja terser może po prostu wziąć listę pożądanych cyfr zamiast podstawy numerycznej, tak jak to .
Jonathan Allan

3

Węgiel drzewny , 40 bajtów

NθE…·¹×⁵φ∨⁺⎇﹪ι⊕÷θ²ωFizz⎇﹪ι÷⁺¹¹θ³ωBuzz⍘ιθ

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

Nθ                                      Input `b` into variable `q`
   ¹                                    Literal 1
 …·                                     Inclusive range to
      φ                                 Predefined variable 1000
    ×                                   Multiplied by
     ⁵                                  Literal 5
E                                       Map to
           ι                            Current value
          ﹪                             Modulo
              θ                         Input value
             ÷                          Floor divide
               ²                        Literal 2
            ⊕                           Incremented
         ⎇                              If nonzero
                ω                       Then predefined empty string
                 Fizz                   Otherwise literal `Fizz`
        ⁺                               Concatenated with
                       ι                Current value
                      ﹪                 Modulo
                            θ           Input value
                         ⁺              Plus
                          ¹¹            Literal 11
                        ÷               Integer divided by
                             ³          Literal 3
                     ⎇                  If nonzero
                              ω         Then predefined empty string
                               Buzz     Otherwise literal `Buzz`
       ∨                                Logical Or
                                    ι   Current value
                                   ⍘    Converted to base
                                     θ  Input value
                                        Implicitly print each result on its own line

3

R , 163 131 bajtów

b=scan();for(d in 1:5e3)cat(list(d%/%b^rev(0:log(d,b))%%b,'fizz','buzz','fizzbuzz')[[1+(!d%%((b+2)%/%2))+2*!d%%((b+11)%/%3)]],'\n')

Wypróbuj online!

Dzięki @digEmAll za zaoszczędzenie 23 bajtów. Następnie kontynuowałem grę w golfa @ digEmAll, aby uratować kolejne 9.


140 bajtów Pracowałem nad tym, nie patrząc na twoją odpowiedź, ale jest zbyt podobny do innego postu;)
digEmAll

@digEmWszystkie dzięki. Zagrałem jeszcze twoją odpowiedź, aby uzyskać 131 bajtów i wyraziłem uznanie; mam nadzieję, że to w porządku.
Nick Kennedy

absolutnie ! ;)
digEmAll

BTW, jeśli masz jakąkolwiek dyskusję na temat gry w golfa w R, zapytaj na tym czacie
digEmAll

Ups, nie zdawałem sobie sprawy, że jest już odpowiedź R, moja odpowiedź może być przydatna na trochę więcej gry w golfa?
Tylko ASCII,

3

JavaScript (ES6),  117  116 bajtów

Wyświetla cyfry rozdzielane przecinkami, przy czym każda cyfra jest wyrażana jako liczba dziesiętna (np. to a to ).19201921201,1

b=>(g=n=>n>1?g(n-1)+`
`+((s=n%(b+2>>1)?'':'Fizz',n%(b/3+3.9|0)?s:s+'Buzz')||(g=n=>n?[...g(n/b|0),n%b]:s)(n)):1)(5e3)

Wypróbuj online!

(ograniczony do 100, aby wyjście TIO nie wybuchło)


Czy jest jakaś szansa na wyjaśnienie, co |0i co (5e3)robi?
njras

@psinaught Wykonanie bitowej OR z na liczbie wymusza wymuszenie jej na najbliższą mniejszą liczbę całkowitą, więc jest to w zasadzie równoważne (z wyjątkiem, że działa tylko dla ). jest wykładniczym zapisem dla - który jest tutaj argumentem przekazanym do funkcji zewnętrznej strzałki . n 0 n < 2 31 g0nMath.floor(n)0n<2315e35000g
Arnauld

2

Python 2 , 116 bajtów

b=input()
i=0
exec"a=i=i+1;d=[]\nwhile a:d=[a%b]+d;a/=b\nprint'Fizz'*(i%(b/2+1)<1)+'Buzz'*(i%(~-b/3+4)<1)or d;"*5000

Wypróbuj online!

Lub z 0-9a-zA-Zwyjściem:

Python 2 , 143 bajty

b=input()
i=0
exec"a=i=i+1;d=''\nwhile a:d=chr(a%b+48+(a%b>9)*39-a%b/36*58)+d;a/=b\nprint'Fizz'*(i%(b/2+1)<1)+'Buzz'*(i%(~-b/3+4)<1)or d;"*5000

Wypróbuj online!


1

05AB1E , 39 37 36 bajtów

8+‚U5₄*LεX23S÷>Ö”FizzÒÖ”#×JDõQiyIв]»

-2 bajtów, tworząc port @JonathanAllan jest Jelly odpowiedź .

Wypróbuj online lub sprawdź wszystkie przypadki testowe (ale jako listę wyników i pierwsze 100 zamiast 5000).

Wyjaśnienie:

8+               # Add 8 to the (implicit) input
                # Pair it with the (implicit) input
   U             # Pop and store it in variable `X`
5₄*L             # Create a list in the range [1,5000]
    ε            # Map each value `y` to:
     X23S÷       #  Integer-divide the input by 2, and the input+8 by 3
          >      #  Increase both by 1
           Ö     #  Check for both if they divide value `y` evenly (1 if truthy; 0 if falsey)
     FizzÒÖ”    #  Push dictionary string "Fizz Buzz"
             #   #  Split on spaces
              ×  #  Repeat the strings the result amount of times (0 or 1)
               J #  Join both strings together to a single string
     DõQi        #  If this string is empty:
         yIв     #   Push value `y` in Base-input (as list) instead
    ]            # Close the if-statement and map
     »           # Join the list by new-lines (and inner lists by spaces implicitly)
                 # (and output the result implicitly)

Zobacz moją wskazówkę 05AB1E (sekcja Jak korzystać ze słownika? ), Aby zrozumieć, dlaczego tak ”FizzÒÖ”jest "Fizz Buzz".


Mam zapętloną wersję o wielkości 33 bajtów, na wypadek gdybyś chciał spróbować ją zoptymalizować. Nadal bajt dłuższy niż Jelly :(
Emigna

@Emigna Czy już go opublikowałeś? Czy jest dość podobny do mojej odpowiedzi i ma służyć jako golf? PS: Galaretka ma kilka wbudowanych skrótów, na przykład z [input, input+8]częścią, a potem z filtrem (co teraz robię DõQi yIв, ale mam wrażenie, że można trochę
zagrać w

Jeśli chodzi o odległość Levenshteina, to bardzo różni się od twojej (chociaż części można przepisać, aby były bardziej podobne do twojej). Ale używam także sztuczki Jonathana n + 8, więc pomyślałem, że pozwolę ci spróbować grać w golfa, jeśli chcesz. W przeciwnym razie opublikuję to jako osobną odpowiedź.
Emigna

@Emigna Obecnie jestem trochę zajęty w pracy, więc nie mam czasu na grę w golfa. Więc jeśli chcesz, możesz opublikować go jako własną odpowiedź. Masz moje poparcie. ;)
Kevin Cruijssen

Niestety odkryłem błąd w mojej wersji, więc teraz jest 34. Mam kilka pomysłów, które mogą skrócić twój lub mój, do zbadania później. Jednak bicie / wiązanie galaretki wydaje się teraz trudne.
Emigna


0

R , 138 bajtów

function(b,`*`=rep)Map(function(i)"if"((s=paste0("","Fizz"*!i%%(b%/%2+1),"Buzz"*!i%%((b+11)%/%3)))>0,s,i%/%b^((log(i,b)%/%1):0)%%b),1:5e3)

Wypróbuj online!


0

C # (interaktywny kompilator Visual C #) , 180 171 bajtów

n=>{for(int i=1,p;i<5001;){p=i;var j=new Stack<int>();for(;p>0;p/=n)j.Push(p%n);var s=i%(n/2+1)<1?"Fizz":"";Print(i++%((n+8)/3+1)<1?s+"Buzz":s==""?string.Join("-",j):s);}}

Wyjścia takie jak odpowiedź Arnaulda. Dzięki digEmAll za pomysł użycia stosu do odwrócenia danych wyjściowych.

Wypróbuj online!


1
Będę musiał powiedzieć „nie” odwrotnym cyfrom. Chociaż jest to poprawny matematycznie pomysł, nie jest to program Fizzbuzz, powiedzmy, że pracodawca by tego chciał. Szkoda, że ​​C # nie ma funkcji odwracania tablic.
Geza Kerecsenyi

0

05AB1E , 34 bajty

Wykorzystuje matematyczny wgląd Jonathana, który ceil(n/3+3)=floor((n+8)//3)+1

ŽJćG8+‚2L>÷>NsÖ…™Ázz'ÒÖ‚×JNIв‚õKн,

Wypróbuj online!

Wyjaśnienie

ŽJćG                                # for N in [1 ...5001)
    8+‚2L>÷>                        # push [input//2+1, (input+8)//3+1]
            NsÖ                     # check each if N is divisible by it
               …™Ázz                # push "fizz"
                    'ÒÖ             # push "buzz"
                       ‚            # pair
                        ×           # repeat a number of times corresponding to the result of the 
                                    # divisibility test
                         J          # join to string
                          NIв‚      # pair with N converted to base <input>
                              õK    # remove empty string
                                н,  # print head of the remaining list
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.