Fizzbuzz in qualsiasi base


10

Sfida

Ingresso:

Un numero intero tra 2 e 62 (compreso).b

Produzione:

Contare da all'equivalente di nella base , usando qualsiasi rappresentazione ragionevole per le cifre.1500010b

Però:

  • Se il numero è divisibile per (arrotondato per , ad es. La base 7 sarebbe 7/2 = 3.5, 3.5 + 1 = 4.5, arrotondata a 4 ), quindi emettere 'Fizz' invece del numero .b÷2+1

  • Se il numero è divisibile per (arrotondato per eccesso, ad esempio 11/3 = 3.666, 3.666 + 3 = 6.666, arrotondato a 7 ), quindi emettere "Buzz".b÷3+3

  • Come probabilmente puoi immaginare, se il tuo numero è divisibile per entrambi, genera "Fizzbuzz".

Esempi

Usando [0-9] , [AZ] e [az] come cifre

(Ho incluso solo i primi 10 valori per mantenere brevi gli esempi - normalmente ci sarebbero stati 4990 altri elementi in ogni sequenza)

Input: 10 (quindi 'Fizz' = 6 e 'Buzz' = 7)

Uscita: 1, 2, 3, 4, 5, Fizz, Buzz, 8, 9, 10

Input: 2 (quindi 'Fizz' = 2 e 'Buzz' = 4)

Uscita: 1, Fizz, 11, Fizzbuzz, 101, Fizz, 111, Fizzbuzz, 1001, Fizz

(Ho incluso i primi 50 valori seguenti per mostrare meglio come funzionano)

Input: 55 (quindi 'Fizz' = = e 'Buzz' = = )2810s552210m55

Uscita: 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

Regole

  • Sono vietate le scappatoie standard
  • Questo è Code Golf, quindi vince la risposta più breve in byte
  • L'input e l'output possono avvenire tramite console o argomenti / restituzioni di funzioni
  • Lo spazio bianco iniziale / finale va bene, così come le linee vuote
  • Gli spazi tra 'Fizz' e 'Buzz' non sono consentiti
  • Qualsiasi variante di maiuscole / minuscole di "Fizz" / "Buzz" / "Fizzbuzz" va bene.
  • Gli output dovrebbero essere separati da newline.
  • Se restituisci un array di 10 cifre di base invece di rappresentarle con caratteri, devono essere nell'ordine corretto!

2
Non mi dispiace davvero. Se vuoi usare le emoji invece delle cifre, non mi dispiace ancora. È la base che conta, non la rappresentazione.
Geza Kerecsenyi,

2
Ok, chiarito ora.
Geza Kerecsenyi,

5
Tecnicamente, nella base 36 la parola buzzappare da sola in corrispondenza di index 553391, fizzat 724463e fizzbuzzat 1216820199599. Purtroppo, nessuno di loro è divisibile per i numeri di quella base
Jo King,

3
Perché la base 10 non è l'originale FizzBuzz? : Non riuscivo a pensare a un algoritmo che generasse entrambi i numeri originali nella base 10 e trasferisse bene su altre basi. E non volevo aggiungere un caso speciale di diniego poiché, a mio avviso, ciò avrebbe complicato la questione.
Geza Kerecsenyi,

3
Per le tue sfide future, considera la possibilità di consentire un I / O più flessibile. I formati ingombranti di I / O sono l'argomento più votato in Cose da evitare quando si scrivono sfide .
Arnauld,

Risposte:


3

Gelatina ,  42 38 34 33 29  32 byte

+3 per aderire alle rigide regole di formattazione

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

Un programma completo che stampa 5000 righe di testo, ogni riga che contiene una serie di numeri interi (le cifre) o di uno dei fizz, buzzo fizzbuzz(funziona bene al di là di base 62).

Provalo online!

Come?

Si noti che ... e
b÷2+1 =b÷2+1

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

in aggiornamento...

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

La sfida afferma che l'output deve essere su linee
separate

Vero. Mentre sto bene con la rappresentazione (anche se è al limite), produrre un array non è lo stesso del giocare. Tuttavia, se si emette la matrice di cifre su ciascuna riga, lo accetterò.
Geza Kerecsenyi,

3
@GezaKerecsenyi Aggiornato. Tuttavia, non capisco come la rappresentazione sia "borderline" - nella base b le cifre sono in . O come l'output di un array non "gioca" ("Input e output possono avvenire tramite console o argomenti / restituzioni di funzioni"). L'utilizzo di altri output arbitrari è semplice come la sostituzione e la formattazione è solo una piastra di base e ortogonale al nocciolo della sfida. [0,n1]
Jonathan Allan,

Un'implementazione terser potrebbe semplicemente prendere un elenco delle cifre desiderate, anziché la base numerica, in questo modo .
Jonathan Allan,

3

Carbone , 40 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

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 byte

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

Provalo online!

Grazie a @digEmAll per aver salvato 23 byte. Ho quindi continuato gli sforzi di golf @ digEmAll per salvare altri 9.


140 byte Ho lavorato su questo senza guardare la tua risposta, ma è troppo simile per un altro post;)
digEmAll

@digEmAll grazie. Ho ulteriormente cercato la tua risposta per ottenere 131 byte e ti ho dato credito; spero che vada bene.
Nick Kennedy,

assolutamente! ;)
digEmAll

A proposito, se hai qualche discussione sul golf in R chiedi in questa chat
digEmAll

Oops, non hai realizzato che c'era già una risposta R, la mia risposta potrebbe essere utile per un po 'più di golf?
ASCII il

3

JavaScript (ES6),  117  116 byte

Emette cifre delimitate da virgole, ciascuna cifra espressa in quantità decimale (ad es. è e è ).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)

Provalo online!

(limitato a 100 in modo che l'output di TIO non esploda)


Qualche possibilità che potresti spiegare cosa |0e cosa (5e3)fa?
njras,

0nMath.floor(n)0n<2315e35000g

2

Python 2 , 116 byte

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

Provalo online!

O con 0-9a-zA-Zuscita:

Python 2 , 143 byte

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

Provalo online!


1

05AB1E , 39 37 36 byte

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

-2 byte creando una porta della risposta Jelly di @JonathanAllan .

Provalo online o verifica tutti i casi di test (ma come output di elenco e con i primi 100 anziché 5000).

Spiegazione:

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)

Vedere questo suggerimento 05AB1E mio (sezione Come utilizzare il dizionario? ) Per capire il motivo per cui ”FizzÒÖ”è "Fizz Buzz".


Ho una versione in loop a 33 byte nel caso tu voglia provare a ottimizzarlo. Ancora un byte più lungo di Jelly però :(
Emigna il

@Emigna L'hai già pubblicato? O è abbastanza simile alla mia risposta ed è inteso come un golf? PS: Jelly ha alcuni built-in di scorciatoia con ad esempio la [input, input+8]parte e la parte di filtro in seguito (che ora faccio come DõQi yIв, ma ho la sensazione che possa essere giocata a golf ancora un po '..)
Kevin Cruijssen,

La distanza di Levenshtein è molto diversa dalla tua (anche se le parti possono essere riscritte per essere più simili alle tue). Ma utilizzo anche il trucco n + 8 di Jonathan, quindi ho pensato di lasciarti provare a giocare a golf verso il basso se lo desideri. Altrimenti lo posterò come risposta separata.
Emigna,

@Emigna Al momento sono un po 'occupato al lavoro, quindi non ho davvero tempo di giocare a golf con questa risposta. Quindi, se vuoi, puoi pubblicarlo come risposta personale. Hai il mio voto. ;)
Kevin Cruijssen,

Sfortunatamente ho scoperto un bug nella mia versione, quindi ora è 34. Ho alcune idee che potrebbero accorciare la tua o la mia, che esplorerò in seguito. Tuttavia, battere / legare Jelly sembra difficile ora.
Emigna,


0

R , 138 byte

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)

Provalo online!


0

C # (compilatore interattivo Visual C #) , 180 171 byte

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

Output come la risposta di Arnauld. Grazie a digEmAll per l'idea di utilizzare uno stack per invertire l'output.

Provalo online!


1
Devo dire "no" alle cifre inverse. Sebbene matematicamente sia l'idea corretta, non è il programma Fizzbuzz, afferma che un datore di lavoro vorrebbe. È un peccato che C # non abbia una funzione di inversione di array.
Geza Kerecsenyi,

0

05AB1E , 34 byte

Utilizza l'intuizione matematica di Jonathan che ceil(n/3+3)=floor((n+8)//3)+1

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

Provalo online!

Spiegazione

Ž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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.