Fizzbuzz en cualquier base


10

Desafío

Entrada:

Un entero entre 2 y 62 (inclusive).b

Salida:

Cuente de al equivalente de en la base , utilizando cualquier representación razonable para los dígitos.1500010b

Sin embargo:

  • Si el número es divisible por (redondeado hacia abajo, por ejemplo, la base 7 sería 7/2 = 3.5, 3.5 + 1 = 4.5, redondeado a 4 ), entonces envíe 'Fizz' en lugar del número .b÷2+1

  • Si el número es divisible por (redondeado hacia arriba, p. Ej. 11/3 = 3.666, 3.666 + 3 = 6.666, redondeado a 7 ), entonces emite 'Buzz'.b÷3+3

  • Como probablemente pueda adivinar, si su número es divisible por ambos, envíe 'Fizzbuzz'.

Ejemplos

Usando [0-9] , [AZ] y [az] como dígitos

(Solo he incluido los primeros 10 valores para mantener los ejemplos cortos, normalmente hay 4990 elementos más en cada secuencia)

Entrada: 10 (entonces 'Fizz' = 6 y 'Buzz' = 7)

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

Entrada: 2 (entonces 'Fizz' = 2 y 'Buzz' = 4)

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

(He incluido los primeros 50 valores de los siguientes para mostrar mejor cómo funcionan)

Entrada: 55 (entonces 'Fizz' = = y 'Buzz' = = )2810s552210m55

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

Reglas

  • Las lagunas estándar están prohibidas
  • Este es Code Golf, por lo que la respuesta más corta en bytes gana
  • La entrada y la salida pueden ser a través de la consola, o los argumentos / devoluciones de funciones
  • El espacio en blanco inicial / final está bien, al igual que las líneas vacías
  • No se permiten espacios entre 'Fizz' y 'Buzz'
  • Cualquier variante de capitalización de 'Fizz' / 'Buzz' / 'Fizzbuzz' está bien.
  • Las salidas deben estar separadas por nuevas líneas.
  • Si devuelve una matriz de 'dígitos' de base 10 en lugar de representarlos con caracteres, ¡entonces deben estar en el orden correcto!

2
Realmente no me importa. Si quieres usar emoji en lugar de dígitos, todavía no me importa. Es la base lo que importa, no la representación.
Geza Kerecsenyi

2
Ok, aclaró ahora.
Geza Kerecsenyi

55
Técnicamente, en la base 36, la palabra buzzaparece por sí sola en index 553391, fizzat 724463y fizzbuzzat 1216820199599. Lamentablemente, ninguno de ellos es divisible por los números de esa base
Jo King

3
¿Por qué la base 10 no es el FizzBuzz original? : No podía pensar en un algoritmo que generara los números originales en la base 10 y se transfiriera bien a otras bases. Y no quería agregar un caso especial para denary ya que eso complicaría demasiado la pregunta, en mi opinión.
Geza Kerecsenyi

3
Para sus desafíos futuros, considere permitir E / S más flexibles. Los formatos de E / S engorrosos son el tema más votado en Cosas para evitar al escribir desafíos .
Arnauld

Respuestas:


3

Gelatina ,  42 38 34 33 29  32 bytes

+3 para cumplir con estrictas reglas de formato

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

Un programa completo que imprime 5000 líneas de texto, cada línea que contiene una serie de números enteros (las cifras) o uno de fizz, buzzo fizzbuzz(bien que funciona más allá de base 62).

Pruébalo en línea!

¿Cómo?

Tenga en cuenta que ... y
b÷2+1 =b÷2+1

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

actualizando ...

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

El desafío establece que la producción debe estar en líneas separadas
Encarnación de la ignorancia

Cierto. Si bien estoy bien con la representación (aunque es límite), generar una matriz no es lo mismo que jugar el juego. Sin embargo, si genera la matriz de dígitos en cada línea, lo aceptaré.
Geza Kerecsenyi

3
@GezaKerecsenyi Actualizado. Sin embargo, no entiendo cómo la representación es "límite" - en la base b los dígitos están en . O cómo la salida de una matriz no es "jugar el juego" ("La entrada y la salida pueden ser a través de la consola, o argumentos / devoluciones de funciones"). Usar alguna otra salida arbitraria es tan simple como la sustitución y el formato es simplemente repetitivo y ortogonal al núcleo del desafío. [0,n1]
Jonathan Allan

Una implementación terser podría simplemente tomar una lista de los dígitos deseados, en lugar de la base numérica, como esta .
Jonathan Allan

3

Carbón , 40 bytes.

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

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

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 bytes

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

Pruébalo en línea!

Gracias a @digEmAll por guardar 23 bytes. Luego jugué más a los esfuerzos de @ digEmAll para salvar otros 9.


140 bytes Trabajé en esto sin mirar su respuesta, pero es demasiado similar para otra publicación;)
digEmAll

@digEmAll gracias. Además, analicé su respuesta para obtener 131 bytes y le di crédito; Espero que esté bien.
Nick Kennedy

absolutamente! ;)
digEmAll

Por cierto, si tiene alguna discusión sobre golf en R, pregunte en este chat
digEmAll

Vaya, ¿no me di cuenta de que ya había una respuesta R, mi respuesta podría ser útil para un poco más de golf?
Solo ASCII

3

JavaScript (ES6),  117116  bytes

Emite dígitos delimitados por comas, cada dígito se expresa como una cantidad decimal (por ejemplo, es y es ).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)

Pruébalo en línea!

(limitado a 100 para que la salida de TIO no explote)


¿Alguna posibilidad de que puedas explicar qué |0y qué (5e3)hace?
njras

@psinaught Realizar un OR bit a bit con en un número obliga a que se coaccione al entero más pequeño más cercano, por lo que es básicamente equivalente a (excepto que solo funciona para ). es la notación exponencial para - que es aquí el argumento pasado a la función de flecha externa . n 0 n < 2 31 g0nMath.floor(n)0n<2315e35000g
Arnauld

2

Python 2 , 116 bytes

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

Pruébalo en línea!

O con 0-9a-zA-Zsalida:

Python 2 , 143 bytes

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

Pruébalo en línea!


1

05AB1E , 39 37 36 bytes

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

-2 bytes creando un puerto de la respuesta Jelly de @JonathanAllan .

Pruébelo en línea o verifique todos los casos de prueba (pero como salida de lista y con los primeros 100 en lugar de 5000).

Explicación:

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)

Ver este consejo 05AB1E mío (sección Cómo usar el diccionario? ) Para entender por qué ”FizzÒÖ”es "Fizz Buzz".


Tengo una versión en bucle de 33 bytes en caso de que quiera intentar optimizar esto. Todavía un byte más largo que Jelly :(
Emigna

@Emigna ¿Ya lo has publicado? ¿O es bastante similar a mi respuesta y se entiende como un golf? PD: Jelly tiene algunos atajos incorporados con, por ejemplo, la [input, input+8]parte y la parte del filtro después (que ahora hago DõQi yIв, pero tengo la sensación de que se puede jugar un poco más ...)
Kevin Cruijssen

En cuanto a la distancia de Levenshtein, es muy diferente a la suya (aunque las partes se pueden reescribir para que sean más parecidas a las suyas). Pero también uso el truco n + 8 de Jonathan, así que pensé que te dejaría probar y jugar el tuyo si quieres. De lo contrario, lo publicaré como una respuesta separada.
Emigna

@Emigna Actualmente estoy un poco ocupada en el trabajo, así que realmente no tengo tiempo para jugar esta respuesta. Entonces, si lo desea, puede publicarlo como su propia respuesta. Tienes mi voto a favor. ;)
Kevin Cruijssen

Desafortunadamente, descubrí un error en mi versión, así que ahora es 34. Tengo algunas ideas que podrían acortar la tuya o la mía que exploraré más adelante. Sin embargo, golpear / atar a Jelly parece difícil ahora.
Emigna


0

R , 138 bytes

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)

Pruébalo en línea!


0

C # (compilador interactivo de Visual C #) , 180 171 bytes

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

Salidas como la respuesta de Arnauld. Gracias a digEmAll por la idea de usar una pila para invertir la salida.

Pruébalo en línea!


1
Voy a tener que decir 'no' a los dígitos inversos. Si bien es matemáticamente la idea correcta, no es el programa Fizzbuzz, digamos que un empleador querría. Es lamentable que C # no tenga una función inversa de matriz.
Geza Kerecsenyi

0

05AB1E , 34 bytes

Utiliza el conocimiento matemático de Jonathan que ceil(n/3+3)=floor((n+8)//3)+1

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

Pruébalo en línea!

Explicación

Ž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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.