Fizzbuzz di pangkalan apa pun


10

Tantangan

Memasukkan:

Bilangan bulat b antara 2 dan 62 (inklusif).

Keluaran:

Hitung dari 1 hingga ekuivalen 500010 dalam basis b , menggunakan representasi yang masuk akal untuk digit.

Namun:

  • Jika angkanya dapat dibagi dengan b÷2+1 (dibulatkan ke bawah, mis. Basis 7 akan menjadi 7/2 = 3,5, 3,5 + 1 = 4,5, dibulatkan menjadi 4 ), maka keluaran 'Fizz' bukan angka.

  • Jika nomor habis dibagi b÷3+3 (dibulatkan, misalnya 11/3 = 3,666, 3,666 + 3 = 6,666, dibulatkan menjadi 7 ), maka output 'Buzz'.

  • Seperti yang Anda mungkin bisa menebak, jika nomor Anda dapat dibagi oleh keduanya, output 'Fizzbuzz'.

Contohnya

Menggunakan [0-9] , [AZ] dan [az] sebagai digit

(Saya hanya menyertakan 10 nilai pertama untuk menjaga contoh singkat - biasanya ada 4990 lebih banyak item di setiap urutan)

Input: 10 (jadi 'Fizz' = 6 dan 'Buzz' = 7)

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

Input: 2 (jadi 'Fizz' = 2 dan 'Buzz' = 4)

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

(Saya sudah memasukkan 50 nilai pertama berikut ini untuk lebih menunjukkan cara kerjanya)

Input: 55 (jadi 'Fizz' = 2810 = s55 dan 'Buzz' = 2210 = m55 )

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

Aturan

  • Celah standar dilarang
  • Ini Golf Code, jadi jawaban tersingkat dalam byte menang
  • Input dan output dapat melalui konsol, atau argumen fungsi / pengembalian
  • Leading / trailing white space baik-baik saja, seperti halnya baris kosong
  • Spasi antara 'Fizz' dan 'Buzz' tidak diizinkan
  • Varian kapitalisasi 'Fizz' / 'Buzz' / 'Fizzbuzz' baik-baik saja.
  • Keluaran harus dipisahkan oleh baris baru.
  • Jika Anda mengembalikan array 'digit' 10 basis alih-alih mewakili mereka dengan karakter, maka mereka harus berada dalam urutan yang benar!

2
Saya tidak begitu keberatan. Jika Anda ingin menggunakan emoji alih-alih angka, saya masih tidak keberatan. Basislah yang penting, bukan representasi.
Geza Kerecsenyi

2
Ok, sudah diklarifikasi sekarang.
Geza Kerecsenyi

5
Secara teknis, di base 36 kata buzzmuncul dengan sendirinya di index 553391, fizzat 724463, dan fizzbuzzat 1216820199599. Sayangnya, tidak ada dari mereka yang dapat dibagi dengan angka
Jo King

3
Mengapa basis 10 bukan FizzBuzz asli? : Saya tidak bisa memikirkan algoritma yang akan menghasilkan angka asli di basis 10, dan mentransfer dengan baik ke pangkalan lainnya. Dan saya tidak ingin menambahkan kasus khusus untuk penolakan karena itu hanya akan memperumit pertanyaan, menurut saya.
Geza Kerecsenyi

3
Untuk tantangan Anda di masa depan, harap pertimbangkan memungkinkan I / O yang lebih fleksibel. Format I / O yang rumit adalah topik yang paling banyak dipilih dalam Hal yang harus dihindari ketika menulis tantangan .
Arnauld

Jawaban:


3

Jelly ,  42 38 34 33 29  32 byte

+3 untuk mematuhi aturan pemformatan yang ketat

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

Sebuah program penuh yang mencetak 5000 baris teks, setiap baris berisi serangkaian bilangan bulat (angka) atau salah satu dari fizz, buzzatau fizzbuzz(bekerja dengan baik di luar basis 62).

Cobalah online!

Bagaimana?


b÷2+1 =b÷2+1

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

memperbarui ...

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

Tantangannya menyatakan bahwa output harus pada jalur yang terpisah
Perwujudan Ketidaktahuan

Benar. Walaupun saya baik-baik saja dengan representasi (meskipun ini batas), menghasilkan array tidak sama dengan bermain game. Namun, jika Anda menampilkan array angka pada setiap baris, saya akan menerimanya.
Geza Kerecsenyi

3
[0,n1]

Implementasi terser hanya bisa mengambil daftar digit yang diinginkan, bukan basis numerik, seperti ini .
Jonathan Allan

3

Arang , 40 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

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

Cobalah online!

Terima kasih kepada @digEmAll untuk menghemat 23 byte. Saya kemudian melanjutkan upaya-upaya golf @ digEmAll untuk menyimpan lebih lanjut 9.


140 byte Saya mengerjakan ini tanpa melihat jawaban Anda, tetapi terlalu mirip untuk posting lain;)
digEmAll

@digEmSemua terima kasih. Saya telah meneruskan jawaban Anda untuk mendapatkan 131 byte dan memberi Anda kredit; harap itu ok
Nick Kennedy

tentu saja! ;)
digEmAll

BTW, jika Anda memiliki diskusi tentang golf di R, tanyakan obrolan ini
digEmAll

Ups, tidak sadar sudah ada jawaban R, jawaban saya mungkin bisa membantu untuk sedikit lebih banyak bermain golf?
ASCII

3

JavaScript (ES6),  117  116 byte

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)

Cobalah online!

(terbatas pada 100 sehingga output TIO tidak meledak)


Adakah peluang Anda bisa menjelaskan apa |0dan apa yang harus (5e3)dilakukan?
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

Cobalah online!

Atau dengan 0-9a-zA-Zoutput:

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

Cobalah online!


1

05AB1E , 39 37 36 byte

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

-2 byte dengan membuat port dari jawaban Jelly @ JonathanAllan .

Cobalah secara online atau verifikasi semua kasus uji (tetapi sebagai daftar-keluaran dan dengan 100 yang pertama, bukan 5000).

Penjelasan:

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)

Lihat ini ujung 05AB1E saya (bagian Cara menggunakan kamus? ) Untuk memahami mengapa ”FizzÒÖ”adalah "Fizz Buzz".


Saya memiliki versi perulangan pada 33 byte jika Anda ingin mencoba dan mengoptimalkan ini. Masih satu byte lebih lama dari Jelly :(
Emigna

@Emigna Sudahkah Anda mempostingnya? Atau ini mirip dengan jawaban saya dan ini dimaksudkan sebagai golf? PS: Jelly memiliki beberapa builtin jalan pintas dengan misalnya [input, input+8]bagian, dan bagian filter sesudahnya (yang sekarang saya lakukan DõQi yIв, tapi saya merasa bisa
bermain golf

Dari segi jarak Levenshtein sangat berbeda dari milik Anda (walaupun beberapa bagian dapat ditulis ulang menjadi lebih seperti milik Anda). Tapi saya juga menggunakan trik n + 8 Jonathan, jadi saya pikir saya akan membiarkan Anda mencoba dan golf turun ke arah itu jika Anda mau. Kalau tidak, saya akan mempostingnya sebagai jawaban terpisah.
Emigna

@Emigna Saat ini saya agak sibuk di tempat kerja, jadi tidak punya waktu untuk bermain golf jawaban ini. Jadi, jika mau, Anda dapat memposting sebagai jawaban Anda sendiri. Anda mendapat dukungan saya. ;)
Kevin Cruijssen

Sayangnya saya menemukan bug di versi saya jadi sekarang 34. Saya punya beberapa ide yang mungkin membuat Anda atau saya lebih pendek yang akan saya jelajahi nanti. Mengalahkan / mengikat Jelly tampaknya sulit sekarang.
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)

Cobalah online!


0

C # (Visual C # Interactive Compiler) , 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);}}

Keluaran seperti jawaban Arnauld. Berkat digEmAll untuk ide menggunakan stack untuk membalikkan output.

Cobalah online!


1
Saya harus mengatakan 'tidak' ke digit terbalik. Sementara itu ide yang benar matematis, itu bukan yang Program fizzbuzz, mengatakan majikan ingin. Sangat disayangkan bahwa C # tidak memiliki fungsi array terbalik.
Geza Kerecsenyi

0

05AB1E , 34 byte

Menggunakan wawasan matematika Jonathan yang ceil(n/3+3)=floor((n+8)//3)+1

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

Cobalah online!

Penjelasan

Ž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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.