Fizz Buzz dengan karakter unik di kolom

21

Terinspirasi oleh Digit di jalur mereka dan 1, 2, Fizz, 4, Buzz

pengantar

Tugas Anda adalah untuk menghasilkan persis output berikut:

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

Tantangan

Tantangan ini didasarkan pada tantangan Fizz Buzz, dan inilah rekapnya: mengeluarkan angka dari 1 hingga 100 inklusif, masing-masing angka pada barisnya sendiri, tetapi jika jumlahnya kelipatan 3, Anda harus menampilkan "Fizz" alih-alih nomor aslinya, jika nomornya adalah kelipatan 5, Anda harus menampilkan "Buzz" alih-alih nomor aslinya. Jika angka adalah kelipatan 15, Anda harus menampilkan "FizzBuzz" daripada nomor aslinya.

Namun, selain persyaratan di atas, Anda juga harus membuat indentasi setiap baris menggunakan spasi untuk membuat setiap kolom berisi karakter unik (tidak termasuk spasi dan baris baru) saja. Spasi yang ditambahkan ke setiap baris adalah minimum yang diperlukan untuk membuat semua baris muncul sebelum (termasuk) memiliki karakter unik di setiap kolom.

Misalnya, 1,2,Fizz,4tidak perlu lekukan apapun karena mereka sudah memiliki karakter yang unik di setiap kolom (kolom 1: 12F4, column2: i, column3: z, column4: z), tapi saat menambahkan Buzzkita perlu indent oleh dua ruang karena kalau tidak kita akan memiliki dua z's di kolom ke-3 dan ke-4. Karena dua ruang sudah cukup untuk mencapai tujuan, Anda tidak boleh membuat indentasi dengan tiga ruang. 7dan 8tidak memerlukan indentasi apa pun tetapi ketika mengeluarkan 11kita perlu membuat indentasi dengan satu spasi karena kolom 1 sudah memiliki a 1. 13maka perlu indentasi oleh tiga spasi karena sekarang kolom 1, 2 dan 3 semua memiliki a 1. Lekukan untuk baris yang tersisa mengikuti aturan yang sama.

Untuk membuat tantangan lebih sederhana, Batas atas telah diubah menjadi 50.

Spesifikasi

  • Anda dapat menulis suatu program atau fungsi. Tak satu pun dari mereka harus mengambil input yang tidak kosong. Mengambil input kosong tidak masalah.

  • Karena ini adalah tantangan KC, Anda perlu menghasilkan output seperti yang ditentukan di bagian Pendahuluan. Satu baris tambahan baru baik-baik saja. Tidak ada judul baru atau ruang judul tambahan. Tidak ada spasi tambahan untuk setiap baris.

  • Program Anda dapat keluar dengan kesalahan atau memiliki output STDERR yang tidak kosong selama STDOUT sesuai dengan spesifikasi.

  • Ini adalah intra-bahasa , program dengan jumlah byte terkecil yang menang dalam bahasanya.

  • Celah default berlaku.

Weijun Zhou
sumber
2
Output yang diberikan tidak persis cocok dengan spek, misalnya baris 12, 20, 35 dan 50.
Bubbler
1
Tetapi karakter kedua dalam dua baris pertama adalah carriage return.
Akumulasi
Saya telah mengecualikan spasi, sekarang saya harus mengecualikan baris baru juga.
Weijun Zhou

Jawaban:

9

Python 2 , 127 byte

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

Cobalah online!

Tabel lookup lima puluh byte tampaknya kurang baik ukuran kode kurang dari logika yang diperlukan untuk melacak karakter yang telah terjadi di setiap kolom.

Lynn
sumber
1
Logika akan lebih baik jika kita diminta untuk mencetak hingga 100 sebagai gantinya ...
Bubbler
5

Python 2 , 167 166 163 161 157 byte

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

Cobalah online!

Suntingan:

  • whilelebih pendek dari for..range()1 byte.
  • Terima kasih kepada @ovs karena mencukur 3 byte. Saya selalu lupa exec...
  • i%3/2Trik yang diadaptasi dari jawaban Lynn (-2 byte).
  • @ Lynn menyarankan a=map(set,[[]]*99), tapi saya menemukan cara lain menggunakan evaldan reprdengan byte yang sama (-4 byte).

Gunakan daftar set untuk melacak karakter yang digunakan untuk setiap kolom, dan mengatur ketidaksetaraan untuk keanggotaan. Sisanya mengikuti spesifikasi yang diberikan.

Bubbler
sumber
4

C (gcc) , 145 144 byte (143 untuk hex)

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

Cobalah 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
sumber
3

Ruby , 129 byte

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

Cobalah online!

Kredit ganda jatuh ke Lynn di sini, untuk pendekatan tabel pencarian dan algoritma fizzbuzz .

Algoritma FizzBuzz sangat menarik, dan bergantung pada kebetulan yang luar biasa bahwa semua angka positif, non-komposit kurang dari 15 (selain 3 dan 5), ketika dinaikkan ke kekuatan 4, adalah 1 lebih dari kelipatan 15. Dalam fakta:

 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

Nilai-nilai 3**4%15dan 5**4%15persis 4 terpisah: panjang string "Fizz". Kami dapat memanfaatkan ini dengan menggunakannya untuk mengindeks dari ujung string, setidaknya 9 karakter. Perkalian 3 akan diindeks dari awal string, dan kelipatan 5 akan diindeks dari 5 karakter dari akhir. Setiap angka lainnya akan berusaha mengindeks dari sebelum awal string, dan gagal, kembali nil. Kemudian 15, tentu saja, indeks dari karakter ke-0. Fakta bahwa "FizzBuzz" hanya 8 karakter adalah hambatan kecil; kami menggunakan karakter baris baru untuk membalutnya, yang nantinya akan diabaikan oleh puts.

Ada kemungkinan bahwa tabel pencarian dapat keluar-golf dengan pendekatan yang lebih prosedural, tetapi upaya saya berada di lingkungan 190 byte.

benj2240
sumber
2
Menarik. Perlu dicatat bahwa fakta semua angka coprime ke 15 ketika dinaikkan ke kekuatan 4 sama dengan 1 modulo 15 dapat diturunkan dari teorema kecil Fermat.
Weijun Zhou
2

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

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

`

Cobalah online!

Program peringatan itu sendiri menjalankan waktu yang tidak dapat diterima

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

Cobalah online!

l4m2
sumber
Jawaban Anda tampaknya tidak sama dengan tautan TIO
Jo King
@JoKing array output TIO, dan saya tidak tahu apakah itu diizinkan
l4m2
2

Java (JDK 10) , 185 byte

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

Cobalah online!

Kredit

Olivier Grégoire
sumber
1

Haskell , 190 187 186 178 176 bytes

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

Cobalah online!

Versi yang sedikit lebih mudah dibaca (dan beranotasi):

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

Sunting: Saya akhirnya menggarisbawahi beberapa fungsi dalam versi golf untuk menghemat lebih banyak byte.

Cristian Lupascu
sumber
@Laikoni Benar. Tetap.
Cristian Lupascu
1

Jstx , 122 byte

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

Cobalah online!

Quantum64
sumber