1, 2, Fizz, 4, Buzz


148

pengantar

Dalam upaya kami baru-baru ini untuk mengumpulkan katalog solusi terpendek untuk latihan pemrograman standar, berikut ini adalah tantangan FizzBuzz vanilla PPCG yang pertama. Jika Anda ingin melihat tantangan katalog lain, ada "Hello World!" dan "Apakah angka ini prima?" .

Tantangan

Tulis program yang mencetak angka desimal dari 1 hingga 100 inklusif. Tetapi untuk kelipatan tiga cetak "Fizz" bukan nomor dan untuk kelipatan lima cetak "Buzz". Untuk angka yang merupakan kelipatan dari tiga dan lima cetak "FizzBuzz".

Keluaran

Output akan berupa daftar angka (dan Fizzes, Buzzes dan FizzBuzzes) yang dipisahkan oleh baris baru (baik \natau \r\n). Newline tambahan dapat diterima, tetapi newline terkemuka tidak. Terlepas dari pilihan Anda pada baris baru, hasilnya akan terlihat persis seperti ini:

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
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz

Satu-satunya pengecualian untuk aturan ini adalah output konstan dari juru bahasa Anda yang tidak dapat ditekan, seperti salam, kode warna ANSI atau lekukan.

Aturan selanjutnya

  • Ini bukan tentang menemukan bahasa dengan pendekatan terpendek untuk bermain FizzBuzz, ini tentang menemukan pendekatan terpendek dalam setiap bahasa. Karenanya, tidak ada jawaban yang akan ditandai sebagai diterima.

  • Kiriman dinilai dalam byte dalam pengkodean yang sudah ada sebelumnya, biasanya (tetapi tidak harus) UTF-8. Beberapa bahasa, seperti Folder, agak sulit untuk dinilai - jika ragu, silakan tanyakan di Meta.

  • Tidak ada yang bisa dicetak ke STDERR.

  • Tidak seperti aturan kami yang biasa, jangan ragu untuk menggunakan bahasa (atau versi bahasa) meskipun itu lebih baru daripada tantangan ini. Jika ada yang ingin menyalahgunakan ini dengan menciptakan bahasa tempat program kosong menghasilkan keluaran FizzBuzz, maka selamat telah membuka jalan untuk jawaban yang sangat membosankan.

    Perhatikan bahwa harus ada penerjemah agar pengajuan dapat diuji. Diperbolehkan (dan bahkan dianjurkan) untuk menulis sendiri penerjemah ini untuk bahasa yang sebelumnya tidak diterapkan.

  • Jika bahasa pilihan Anda adalah varian sepele dari bahasa lain (berpotensi lebih populer) yang sudah memiliki jawaban (pikirkan dialek BASIC atau SQL, kerang Unix atau turunan Brainfuck sepele seperti Alphuck dan ???), pertimbangkan untuk menambahkan catatan ke yang sudah ada menjawab bahwa solusi yang sama atau sangat mirip juga merupakan yang terpendek dalam bahasa lain.

  • Karena output sudah diperbaiki, Anda dapat membuat hardcode output (tetapi ini mungkin bukan pilihan terpendek).

  • Anda dapat menggunakan solusi yang sudah ada sebelumnya, selama Anda menghargai penulis asli program.

  • Celah standar tidak diizinkan.

Sebagai catatan tambahan, tolong jangan turunkan jawaban yang membosankan (tetapi valid) dalam bahasa yang tidak banyak memiliki golf; ini masih berguna untuk pertanyaan ini karena mencoba mengkompilasi katalog selengkap mungkin. Namun, lakukan sebagian besar upvote jawaban dalam bahasa di mana penulis benar-benar harus berusaha golf kode.

Katalog

var QUESTION_ID=58615;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk";var OVERRIDE_USER=30525;var answers=[],answers_hash,answer_ids,answer_page=1,more_answers=true,comment_page;function answersUrl(index){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(index,answers){return"https://api.stackexchange.com/2.2/answers/"+answers.join(';')+"/comments?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(data){answers.push.apply(answers,data.items);answers_hash=[];answer_ids=[];data.items.forEach(function(a){a.comments=[];var id=+a.share_link.match(/\d+/);answer_ids.push(id);answers_hash[id]=a});if(!data.has_more)more_answers=false;comment_page=1;getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:true,success:function(data){data.items.forEach(function(c){if(c.owner.user_id===OVERRIDE_USER)answers_hash[c.post_id].comments.push(c)});if(data.has_more)getComments();else if(more_answers)getAnswers();else process()}})}getAnswers();var SCORE_REG=/<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;var OVERRIDE_REG=/^Override\s*header:\s*/i;function getAuthorName(a){return a.owner.display_name}function process(){var valid=[];answers.forEach(function(a){var body=a.body;a.comments.forEach(function(c){if(OVERRIDE_REG.test(c.body))body='<h1>'+c.body.replace(OVERRIDE_REG,'')+'</h1>'});var match=body.match(SCORE_REG);if(match)valid.push({user:getAuthorName(a),size:+match[2],language:match[1],link:a.share_link,});else console.log(body)});valid.sort(function(a,b){var aB=a.size,bB=b.size;return aB-bB});var languages={};var place=1;var lastSize=null;var lastPlace=1;valid.forEach(function(a){if(a.size!=lastSize)lastPlace=place;lastSize=a.size;++place;var answer=jQuery("#answer-template").html();answer=answer.replace("{{PLACE}}",lastPlace+".").replace("{{NAME}}",a.user).replace("{{LANGUAGE}}",a.language).replace("{{SIZE}}",a.size).replace("{{LINK}}",a.link);answer=jQuery(answer);jQuery("#answers").append(answer);var lang=a.language;lang=jQuery('<a>'+lang+'</a>').text();languages[lang]=languages[lang]||{lang:a.language,lang_raw:lang.toLowerCase(),user:a.user,size:a.size,link:a.link}});var langs=[];for(var lang in languages)if(languages.hasOwnProperty(lang))langs.push(languages[lang]);langs.sort(function(a,b){if(a.lang_raw>b.lang_raw)return 1;if(a.lang_raw<b.lang_raw)return-1;return 0});for(var i=0;i<langs.length;++i){var language=jQuery("#language-template").html();var lang=langs[i];language=language.replace("{{LANGUAGE}}",lang.lang).replace("{{NAME}}",lang.user).replace("{{SIZE}}",lang.size).replace("{{LINK}}",lang.link);language=jQuery(language);jQuery("#languages").append(language)}}
body{text-align:left!important}#answer-list{padding:10px;width:290px;float:left}#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table>


1
Nothing can be printed to STDERR. Apakah ini benar hanya ketika berjalan, atau juga ketika kompilasi (dengan asumsi itu adalah langkah terpisah?)
AShelly

@ AShelly Only saat menjalankan
Beta Decay

Saya tidak yakin saya suka fakta bahwa Anda memasukkan kode 100 ke tantangan. Dengan begitu, program yang hanya menghasilkan output yang diharapkan adalah entri yang valid, tetapi tidak menarik untuk tantangan ini. Saya pikir tantangannya harus mengharapkan program untuk memasukkan jumlah item ke output.
Timwi

6
@Timwi Sementara saya setuju bahwa itu akan membuatnya (hanya sedikit) lebih menarik, saya sangat sering melihat FizzBuzz hanya 1 hingga 100 (di Wikipedia dan Rosetta Code, misalnya). Jika tujuannya adalah untuk memiliki tantangan FB "kanonik", itu masuk akal.
Geobits

58
"Vanilla fizzbuzz" terdengar lezat.
iamnotmaynard

Jawaban:


76

Python 2, 56

i=0;exec"print i%3/2*'Fizz'+i%5/4*'Buzz'or-~i;i+=1;"*100

6
Dang, itu jenius berdarah. Bisakah saya mencuri ide Anda untuk melipatgandakan string dengan hasil mod?
AdmBorkBork

@TimmyD Silakan.
feersum

15
Metode yang berbeda untuk 56 (dari sini ): i=1;exec"print'FizzBuzz'[i%-3&4:12&8-i%5]or i;i+=1;"*100. Adakah yang mau memaksa paksa ekspresi pencarian untuk mencoba mengoptimalkan bit bashing?
xnor

1
Teknik yang sangat bagus, saya suka pembagian hasil modulo untuk menjadikannya biner! Saya mengalami peningkatan untuk mendapatkan metode Anda menjadi 54 karakter ... Tentu saja saya tidak akan mempostingnya sebagai jawaban tanpa izin Anda (karena ~ 95% jawaban Anda);)
Tersosauros

2
@Tersosauros Silakan ... metode saya tidak terlalu sulit ditemukan dan tidak diragukan lagi telah ditemukan secara independen oleh banyak orang.
feersum

76

Hexagony , 91 byte

Terima kasih untuk hadiahnya :)

Wow, saya tidak akan pernah membayangkan bisa mengalahkan solusi Hexagony Martin . Tetapi — siapa yang akan melemparkannya — saya menyelesaikannya. Setelah beberapa hari gagal karena saya tidak punya pewarna Hexagony atau EsotericIDE untuk memeriksa solusi saya. Saya mendapatkan beberapa aspek dari spesifikasi yang salah, jadi saya menghasilkan beberapa "solusi" yang salah hanya menggunakan pena dan kertas dan editor teks. Akhirnya saya mengatasi kemalasan saya dan mengkloning kedua repositori, mengunduh VisualStudio dan mengompilasinya. Wow, alat apa yang bermanfaat bagi mereka! Seperti yang Anda lihat, saya jauh dari seseorang yang Anda panggil programmer (maksud saya, ayolah! Saya bahkan belum menginstal VisualStudio, dan tidak memiliki petunjuk tentang cara menyusun program);)

Masih butuh waktu beberapa saat untuk menemukan solusi yang berfungsi, dan itu cukup penuh dan kacau, tapi di sini semuanya dalam kemuliaan:

Fizzbuzz dalam ukuran 6 segi enam:

3}1"$.!$>)}g4_.{$'))\<$\.\.@\}F\$/;z;u;<%<_>_..$>B/<>}))'%<>{>;e"-</_%;\/{}/>.\;.z;i;..>(('

Tata letak heksagonal:

      3 } 1 " $ .
     ! $ > ) } g 4
    _ . { $ ' ) ) \
   < $ \ . \ . @ \ }
  F \ $ / ; z ; u ; <
 % < _ > _ . . $ > B /
  < > } ) ) ' % < > {
   > ; e " - < / _ %
    ; \ / { } / > .
     \ ; . z ; i ;
      . . > ( ( '

Dan membawakan lagu yang indah, terima kasih kepada Timwi Colorer Timwi :

Solusi Hexagony FizzBuzz berwarna

Jadi, inilah animasi GIF yang panjangnya 110 detik pada 2 fps, menunjukkan aliran program selama 6 angka pertama 1, 2, Fizz, 4, Buzz, Fizz pertama, 220 kutu pertama dari program (klik pada gambar untuk ukuran penuh):

masukkan deskripsi gambar di sini

Ya ampun, berkat perangkat lunak pengomposisian Natron, animasi pointer masih membosankan untuk dibuat, tetapi masih dapat dikelola. Menyimpan 260 gambar memori tidak terlalu menghibur. Sayangnya EsotericIDE tidak dapat melakukannya secara otomatis. Ngomong-ngomong, nikmati animasinya!

Lagi pula, begitu Anda membungkus kepala Anda di sekitar model memori dan pembungkus jalur yang agak berlawanan dengan intuisi yang melintasi batas segi enam, Hexagony tidak terlalu sulit untuk dikerjakan. Tapi bermain golf itu bisa menyebalkan. ;)

Itu menyenangkan!


1
Sangat bagus! :) Itulah yang saya dapatkan karena lupa untuk mencoba side-length 6 sendiri. ;) (Akan menarik untuk melihat apakah solusi saya cocok dengan panjang sisi 6 lebih mudah.)
Martin Ender

@ MartinBüttner Saya ingin sekali melihatnya :)
ML

2
Saya kurang seorang programmer daripada Anda, karena apa itu Visual Studio? : P
Rɪᴋᴇʀ

5
Sayangnya EsotericIDE tidak dapat melakukannya secara otomatis. - Silakan langsung ke depan dan mengajukan saran fitur , saya mungkin akan melakukan hal itu suatu hari :)
Timwi

1
(oops, ini muncul setelah 6 bulan balasan terakhir) Anda dapat bermain golf 1 byte dari akhir program dengan menggeser jalur abu-abu dengan 1 byte dan menempatkan "Membatalkan Operasi" di jalur oranye seperti 3}1"$.!$>)}g4_'{$))}\<$\.\.@\;F\$/;z;u;<%<_>_..$>B/<>}))'%<>{>;e"-</_%;\/{}/>.\)(z;i;..>('. Sekarang ada tambahan (setelah z, yang dapat "dibatalkan" dengan a) atau dengan meletakkan z di sana. Sekarang a) yang mendorong semua perintah pada jalur oranye 1 centang kemudian, dan kembali dengan no-op yang ada di baris 3. Btw Saya juga menginstal Visual Studio hanya karena Hexagony Colorer dan Esoteric IDE: P
Sunny Pun

44

Labirin , 94 byte

"):_1
\ } 01/3%70.105
" :   @ "     .
"  =";_""..:221
+  _
"! 5%66.117
_:= "     .
="*{"..:221

Sub-100! Ini menyenangkan.

Penjelasan

Mari kita mulai dengan primer singkat tentang Labyrinth - jangan lewatkan ini jika Anda sudah terbiasa dengan dasar-dasarnya:

  • Labirin memiliki dua tumpukan - tumpukan utama dan tumpukan tambahan. Kedua tumpukan memiliki jumlah nol yang tak terbatas di bagian bawah, misalnya +pada tumpukan kosong menambahkan dua nol, sehingga mendorong nol.

  • Kontrol aliran di Labirin ditentukan oleh persimpangan, yang melihat bagian atas tumpukan untuk menentukan ke mana harus pergi berikutnya. Negatif berarti belok kiri, nol berarti lurus ke depan dan positif berarti belok kanan ... tetapi jika kita menabrak dinding maka kita berbalik arah. Sebagai contoh, jika hanya lurus ke depan dan belok kiri adalah mungkin tetapi bagian atas tumpukan positif, maka karena kita tidak bisa belok kanan, kita belok kiri.

  • Digit di Labyrinth pop xdan push 10*x + <digit>, yang membuatnya mudah untuk membangun jumlah besar. Namun, ini berarti bahwa kita memerlukan instruksi untuk menekan 0 untuk memulai nomor baru, yang ada _di Labyrinth.

Sekarang mari kita ke kode aktual!

masukkan deskripsi gambar di sini

Merah

Eksekusi dimulai dari "di sudut kiri atas, yang merupakan NOP. Berikutnya adalah ), yang menambah bagian atas tumpukan, mendorong 1 pada lintasan pertama dan menambahn pada setiap lintasan berikutnya.

Selanjutnya kita duplikat ndengan :. Karena npositif, kami berbelok ke kanan, menjalankan }(menggeser bagian atas tumpukan utama ke pembantu) dan :. Kami menemui jalan buntu, jadi kami berbalik dan mengeksekusi }dan :sekali lagi, meninggalkan tumpukan seperti

Main [ n n | n n ] Aux

Sekali lagi, npositif dan kami berbelok ke kanan, mengeksekusi _101/yang membagi ndengan 101. Jika nadalah 101 lalu n/101 = 1dan kita berubah menjadi @, yang mengakhiri program. Kalau tidak, situasi kita saat ini adalah

Main [ n 0 | n n ] Aux

Oranye 1 (mod 3)

3mengubah nol atas menjadi 3 ( 10*0 + 3 = 3) dan %melakukan modulo. Jika n%3positif, kami berbelok ke kanan menjadi kuning ". Kalau tidak kita lakukan 70.105.122:.., yang output Fizz. Perhatikan bahwa kita tidak perlu menekan angka nol baru _karena n%3nol dalam kasus ini, jadi kita dapat mengeksploitasi angka nol tanpa batas di bagian bawah tumpukan. Kedua jalur bertemu lagi dengan warna biru muda.

Biru muda

Bagian atas tumpukan saat ini n%3, yang bisa menjadi positif, sehingga _;hanya mendorong nol dan segera muncul untuk memastikan kami terus maju, daripada beralih ke @. Kami kemudian gunakan =untuk menukar bagian atas tumpukan utama dan tambahan, memberikan:

Main [ n | n%3 n ] Aux

Oranye 2 (mod 5)

Ini adalah situasi yang mirip dengan sebelumnya, kecuali jika 66.117.122:..output adalah nol.Buzzn%5

Biru tua

Bagian sebelumnya meninggalkan tumpukan seperti

Main [ n%5 | n%3 n ] Aux

{menggeser bagian n%3belakang ke tumpukan utama dan *melipatgandakan kedua modulos.

Jika salah satu modulo adalah nol, produknya nol jadi kami langsung menjadi kuning. =menukar bagian atas tumpukan dan _mendorong angka nol untuk memastikan kita terus maju, memberi

Main [ n 0 | 0 ] Aux

Jika tidak, jika kedua modulos bukan nol, maka produk tersebut bukan nol dan kami berbelok ke kanan menjadi hijau. =menukar bagian atas tumpukan, memberi

Main [ n | (n%5)*(n%3) ] Aux

setelah itu kita gunakan :untuk menduplikasi n, belok kanan, lalu gunakan !untuk outputn .

Ungu

Pada titik ini, tumpukan utama memiliki satu atau dua item, tergantung pada jalur mana yang diambil. Kita perlu menyingkirkan nol dari jalur kuning, dan untuk itu kita gunakan +, yang berkinerja n + 0dalam urutan untuk kedua kasus. Akhirnya,\ menghasilkan baris baru dan kami kembali di awal.

Setiap iterasi mendorong tambahan (n%5)*(n%3)ke tumpukan tambahan, tetapi jika tidak kita melakukan hal yang sama lagi.


7
Menyukai penjelasannya.
The_Basset_Hound

29

Perl 5, 49 byte

Skrip 46 byte + 3 byte -E"..."

Menggunakan say(yang mengharuskan -E"...") dapat mengurangi ini lebih jauh menjadi 46 byte karena saysecara otomatis menyertakan baris baru (Terima kasih @ Dennis !):

say'Fizz'x!($_%3).Buzz x!($_%5)||$_ for 1..100

Perl 5, 50 byte

print'Fizz'x!($_%3).Buzz x!($_%5)||$_,$/for 1..100

Anda dapat menyimpan beberapa byte dengan menggunakan say.
Dennis

Anda memecahkan papan skor ...
LegionMammal978

@ LegionMammal978 Ya. Ya saya lakukan ... Saya akan mencoba dan kata ulang judul itu! Argh!
Dom Hastings

Bukankah -E"..."8 byte? Spasi + Dasbor + Opsi + Argumen (+ Mengutip).
Erik the Outgolfer

1
@EriktheGolfer jadi karena saya memposting ini, konsensusnya adalah -E0 byte, tetapi karena jawaban primo diberi skor tidak termasuk tanda kutip, saya memilih untuk membuatnya adil dan menyertakan tanda kutip di tambang dan +1 untuk -E. Alasan itu diterima sebagai gratis adalah Perl biasanya dijalankan melalui perl -edan perl -Etidak ada lagi byte (saya pikir -M5.010atau use 5.010bisa bebas juga, tetapi mungkin tidak membaca kembali posting meta). Saat menambahkan -patau -nini dihitung sebagai +1 seperti yang akan Anda jalankan perl -pe. Semoga itu bisa membantu! Referensi meta: meta.codegolf.stackexchange.com/a/7539
Dom Hastings

27

Ruby, 50 byte

Membutuhkan versi 1.8, yang tampaknya populer di kalangan pegolf:

1.upto(?d){|n|puts'FizzBuzz
'[i=n**4%-15,i+13]||n}

Di Ruby modern, Anda ganti ?ddengan100 untuk solusi 51-byte.

Ini tampaknya menjadi rekor dunia.


1
Itu jahat, cinta itu.
Camden Narzt

?dhanya 100. The FizzBuzzString memiliki baris baru di dalamnya, ini berlaku di Ruby. string[i, s]adalah slice, mulai dari karakter i(0-diindeks), berlangsung untuk skarakter, mengabaikan indeks yang menunjuk di luar string. Jika argumen untuk putssudah memiliki baris baru, itu dipotong. Rumusnya harus sederhana untuk dibaca? Itu melakukan semua pekerjaan di sini. Saya tidak akan menemukannya tanpa bantuan beberapa pegolf Ruby yang benar-benar pro.
Lynn

catatan samping: jika Anda diizinkan untuk menambahkan 0 pada awal input (Anda tidak), 2 byte dapat disimpan dengan menggunakan ?e.timessebagai gantinya.
Shelvacu

Bisakah Anda jelaskan [i=n**4%-15,i+13]bagian itu? Sepertinya tidak bisa membungkus kepala saya di sekitarnya
Piccolo

2
@Piccolo Apakah cuplikan ini membantu? Jika i==-14irisannya di luar batas maka kita dapatkan nil. Jika i==-9kita mengiris i+13==4karakter mulai dari karakter ke-9 dari akhir, maka 'Fizz'. Jika i==-5kita mengiris 8 karakter mulai dari karakter ke-5 dari akhir, maka 'Buzz\n'. (Kami mencoba untuk mengiris 8 tetapi hanya ada 5, jadi kami mendapatkan 5.) Dan sebagainya.
Lynn

26

Java, 130 byte

Ini untuk versi Java terbaru (7+). Dalam yang lebih lama Anda dapat mencukur lebih banyak menggunakan enumtrik, tapi saya tidak berpikir logikanya lebih pendek dari ini (86 dalam main).

class F{public static void main(String[]a){for(int i=0;i++<100;)System.out.println((i%3<1?"Fizz":"")+(i%5<1?"Buzz":i%3<1?"":i));}}

Saya tidak berpikir trik blok penginisialisasi membantu di sini, karena pertanyaannya menentukan stderr kosong.
feersum

Hmm. Saya tahu trik statis mencetak ke stderr, tapi saya pikir enum berjalan dengan bersih. Baik untuk mengetahui :)
Geobits

4
mengalahkan saya dengan 14 byte! Menggunakan <1 bukannya == 0 adalah cara yang bagus untuk menghemat!
ESP

2
class F{public static-> interface F{staticdi java 8
TheNumberOne

1
Itu tidak cukup bagaimana enum bekerja. Anda harus melakukannya enum F{;public..., sehingga Anda tidak akan benar-benar menghemat byte.
HyperNeutrino

23

Pyth, 30

VS100|+*!%N3"Fizz"*!%N5"Buzz"N

Coba di sini

Penjelasan:

VS100|+*!%N3"Fizz"*!%N5"Buzz"N
VS100                            : for N in range(1,101)
     |                           : logical short-circuiting or
      +*!%N3"Fizz"               : add "Fizz" * not(N % 3)
                                 : Since not gives True/False this is either "" or "Fizz"
                  *!%N5"Buzz"    : Same but with 5 and Buzz
                             N   : Otherwise N
                                 : The output of the | is implicitly printed with a newline

23

Retina , 317 139 134 132 70 63 60 55 byte

.100{`^
_
*\(a`(___)+
Fi;$&
\b(_{5})+$
Bu;
;_*
zz
'_&`.

Cobalah online!

Penjelasan

.100{`^
_

Ini .adalah flag senyap global yang mematikan output implisit di akhir program. 100{membungkus sisa program dalam satu loop yang dieksekusi untuk 100 iterasi. Akhirnya, panggung itu sendiri hanya menyisipkan a_ di awal string, yang secara efektif menambah counter loop unary.

*\(a`(___)+
Fi;$&

Lebih banyak konfigurasi. *\(membungkus sisa program dalam sebuah grup, mencetak hasilnya dengan linefeed tambahan, tetapi juga menempatkan seluruh grup dalam proses kering, yang berarti bahwa hasilnya akan dibuang setelah pencetakan, sehingga penghitung putaran kami tidak benar-benar dimodifikasi .aadalah pengubah regex khusus yang mengaitkan regex ke seluruh string (yang menyimpan byte saat menggunakan ^dan $secara eksplisit).

Tahap atom itu sendiri mengurus Fizz. Dapat dibagi dengan 3mudah dapat diperiksa di unary: hanya menguji apakah nomor dapat ditulis sebagai pengulangan ___. Jika ini masalahnya, kami menambahkan Fi;string. Titik koma sedemikian sehingga masih ada batas kata di depan nomor untuk tahap berikutnya. Jika kita mengubah garis ke Fizz___...posisi di antara zdan _tidak akan dianggap sebagai batas, karena regex memperlakukan kedua huruf dan garis bawah sebagai karakter kata. Namun, tanda titik koma juga memungkinkan kami menghapus zzduplikasi dari Fizzdan Buzz.

\b(_{5})+$
Bu;

Kami melakukan hal yang sama persis untuk keterbagian oleh 5dan Bu;, meskipun kami tidak perlu menjaga _sekitar saat ini. Jadi kami akan mendapatkan hasil seperti

_
__
Fi;___
____
Bu;
Fi;______
...
Fi;Bu;
...

Ini membuatnya sangat mudah untuk menyingkirkan garis bawah hanya di baris-baris yang berisi Fizz, sementara juga mengisi zzs:

;_*
zz

Artinya, kita mengubah setiap titik koma menjadi zztetapi kita juga mengkonsumsi semua _setelahnya. Pada titik ini kita sudah selesai dengan FizzBuzz di unary. Tetapi tantangannya menginginkan hasil desimal.

'_&`.

&menunjukkan kondisi: tahap ini hanya dijalankan jika string berisi garis bawah. Oleh karena itu, Fizz, Buzzdan FizzBuzziterasi disentuh. Di semua iterasi lain (yaitu yang tidak dapat dibagi oleh 3 atau 5), kami hanya menghitung jumlah karakter, mengonversi hasilnya menjadi desimal.



20

Perl 5, 45 byte

say((Fizz)[$_%3].(Buzz)[$_%5]or$_)for+1..100

Membutuhkan -Eopsi, dihitung sebagai satu. Ini harus dijalankan dari baris perintah, yaitu:

perl -Esay((Fizz)[$_%3].(Buzz)[$_%5]or$_)for+1..100

Tanda kutip perintah tidak diperlukan, jika salah satu menghindari menggunakan spasi, atau karakter lain yang dapat bertindak sebagai pemisah baris perintah ( |, <,> , &, dll).


Perl 5, 48 byte

print+(Fizz)[$_%3].(Buzz)[$_%5]||$_,$/for 1..100

Jika opsi baris perintah dihitung sebagai masing-masing, -lakan menghemat satu byte (dengan mengganti $/). Namun, menurut Peraturan Perlgolf Klasik , ini akan dihitung 3: satu untuk -, satu untuk l, dan satu untuk ruang yang diperlukan.


Anda dapat menggunakan say, dengan -Esakelar, yang memiliki jarak edit 1 hingga -e, sehingga harus dihitung sebagai 1 byte.
Dennis

Hai primo, saya merasa seperti saya selingkuh dalam jawaban saya untuk menggunakan say, saya berasumsi bahwa -Edapat digunakan di tempat -eyang akan membawa Anda ke 44 daripada 46. Saya tidak berpikir adil bahwa saya mencetak gol berbeda dengan Anda, apa mekanisme penilaian yang disukai? Saya biasanya menggunakan printuntuk menghindari ini! Paling dekat dengan konsensus adalah ini ?
Dom Hastings

Pilihan pribadi saya adalah bahwa setiap byte tambahan pada baris perintah harus saybernilai 1. Khusus untuk , jika kode Anda dapat ditulis pada satu baris menghindari pemisah OS, skor 1 untuk -E. Jika Anda perlu menggunakan tanda kutip, misalnya -E"$a||$b", skor 3. Jika Anda tidak bisa mendapatkannya pada satu baris, beri nilai 5 untuk -M5.01. Tetapi pada saat itu Anda mungkin lebih baik menggunakan -l. Saya tidak setuju bahwa itu harus gratis secara default, karena dua alasan: 1) peningkatan itu sepele dan tidak menarik, dan 2) tidak ada versi penerjemah yang diaktifkan secara default.
primo

20

lilin lebah ,104 89 81 byte

Pengemasan yang lebih padat diizinkan untuk memotong 8 byte lebih banyak.

Solusi terpendek (81 byte), aliran program yang sama, pengemasan berbeda.

p?@<
p?{@b'gA<
p@`zzuB`d'%~5F@<f`z`<
 >~P"#"_"1F3~%'d`Fiz`b
 d;"-~@~.<
>?N@9P~0+d

Mengubah konsep memungkinkan saya untuk mengurangi kode sebanyak 15 byte. Saya ingin menyingkirkan tes mod 5 ganda dalam solusi, jadi saya menerapkan flag.

Penjelasan singkat:

jika n%3=0Fizz dicetak, dan bendera disetel. Bendera diwujudkan hanya dengan mendorong nilai lstack atas ke gstack (instruksi f).

Jika n%5=0, maka n%3=0(FizzBuzz case) atau n%3>0(Buzz case). Dalam kedua kasus, Buzz akan dicetak, dan bendera diatur ulang dengan membuka tumpukan hingga kosong (instruksi ?).

Sekarang kasus menarik:

Jika n%5>0, maka kita punya n%3=0(mencetak Fizz case, n tidak boleh dicetak) atau n%3>0(Fizz tidak dicetak, jadi n harus dicetak). Saatnya memeriksa bendera. Ini diwujudkan dengan mendorong panjang gstack di atas gstack (instruksi A). Jika n%3 was 0maka panjang gstack adalah> 0. Jika n%3 was >0, panjang gstack adalah 0. Lompatan bersyarat sederhana memastikan n hanya akan dicetak jika panjang gstack adalah 0.

Sekali lagi, setelah mencetak n, Fizz, dan / atau Buzz dan baris baru, gstack akan muncul dua kali untuk memastikan kosong. gstack adalah kosong [], yang mengarah ke [0]setelah instruksi A(panjang dorong gstack pada gstack), atau mengandung satu nol ( [0], hasil dari n% 3), yang mengarah ke [0 1], karena [0] memiliki panjang 1. Popping dari tumpukan kosong tidak mengubah tumpukan, jadi aman untuk meletus dua kali.

Jika Anda melihat lebih dekat Anda dapat melihat bahwa, pada prinsipnya, saya melipat

>      q
d`Fizz`f>

ke

<f`z`<
d`Fiz`b

yang membantu menyingkirkan semua ruang yang terbuang antara Adan <di akhir baris berikut dalam solusi yang lebih lama di bawah ini:

q?{@b'gA<       p      <

Solusi konsep baru (89 byte) termasuk penjelasan animasi:

q?@ <
 q?{@b'gA<       p      <
p?<@`zzuB`b'%~5F@<f`zziF`b'<
>N@9P~0+.~@~-";~P"#"_"1F3~%d

Tata letak heksagonal:

   q ? @   <
    q ? { @ b ' g A <               p             <
 p ? < @ ` z z u B ` b ' % ~ 5 F @ < f ` z z i F ` b ' <
> N @ 9 P ~ 0 + . ~ @ ~ - " ; ~ P " # " _ " 1 F 3 ~ % d

Animasi 326 kutu pertama di 2 fps, dengan tumpukan lokal dan global, dan output ke STDOUT.

animasi lilin lebah FizzBuzz


Sebagai perbandingan, di bawah ini adalah hamparan jalur dari solusi yang lebih lama dan lebih kompleks. Mungkin itu juga solusi yang lebih cantik, dari sudut pandang visual;)

Program dengan hamparan jalur


2
Ini gila dan seindah Hexagony. Punya +1!
ETHproduk

@ ETHproductions Saya masih perlu mencoba Hexagony, tetapi dari apa yang dapat saya katakan dari spesifikasi bahasa, lilin lebah saya bahkan tidak mendekati kegilaan Hexagony.
ML


Bagaimana Anda membuat animasi itu?
baordog

18

> <> , 68 66 65 64 byte

1\2+2foooo "Buzz"<
o>:::3%:?!\$5%:?!/*?n1+:aa*)?;a
o.!o"Fizz"/oo

Satu-satunya trik adalah melipatgandakan sisa sebagai syarat untuk mencetak nomor. Dengan begitu, jika salah satunya adalah 0 kita tidak akan mencetak nomornya.

Anda bisa mencobanya di sini .

Menyimpan satu byte berkat Sp3000 dan lainnya berkat randomra. Terimakasih banyak!


1
Sangat baik bermain golf, saya suka menggunakan kembali "\" di baris pertama dan yang di baris kedua.
cole

1
-1 byte jika Anda memindahkan oujung baris kedua ke ruang kosong di awal baris, saya percaya.
Sp3000

@ Sp3000 Memang, saya menghabiskan begitu banyak waktu bermain golf ini, saya tidak tahu bagaimana ini tidak terlintas dalam pikiran saya
Aaron

1
Siapa yang butuh desis desis ketika Anda bisa foooo Buzz?
caird coinheringaahing

17

GS2 , 28 27 (tanpa f)

Hex:

1b 2f fe cc 04 46 69 7a 7a 09 07 42 75 7a 7a 19 06 27 2d d8 62 32 ec 99 dc 61 0a

Penjelasan:

1b    100
2f    range1 (1..n)
fe    m: (map rest of program)

cc    put0 (pop and store in register 0)
04    string-begin
Fizz
09    9
07    string-separator
Buzz
19    25
06    string-end-array (result: ["Fizz"+chr(9) "Buzz"+chr(25)])

27    right-uncons
2d    sqrt
d8    tuck0 (insert value of register 0 under top of stack)
62    divides
32    times (string multiplication)
ec    m5 (create block from previous 5 tokens, then call map)

99    flatten
dc    show0 (convert register 0 to string and push it)
61    logical-or
0a    newline

Memasukkan 3 dan 5 ke dalam konstanta string tidak berfungsi karena \x05mengakhiri string literal.

Catatan: Masalah ini dapat diselesaikan dalam 1 byte dengan gs2 menggunakan built-in f.


16

C, 85 byte

i;main(){for(;i++<=99;printf("%s%s%.d\n",i%3?"":"Fizz",i%5?"":"Buzz",(i%3&&i%5)*i));}

-2 Berkat mual.


Mencoba mengkompilasi di sini tetapi gcctidak mengenali baris baru di dalam string sebagai \ n. Ini memberi saya kesalahan kompilasi. Apakah saya perlu meneruskan parameter apa pun ke kompiler? BTW, Anda ketinggalan <=dalam posting Anda (saya menghitung 88 byte dengan <= ... jadi saya anggap itu hilang).
wendelbsilva

oops. melewatkan kesalahan dalam peringatan. Menambahkan 2 karakter.
AShelly

Variabel global diinisialisasi ke nol, jadi alih-alih main(i), coba i;main(). Kemudian Anda dapat menyingkirkannya i--di awal for()loop. Anda tidak perlu jeda baris juga. Itu harus membawa hitungan byte ke 85.
osifrage mual

2
Bergantung pada bagaimana UB ingin Anda dapatkan, Anda dapat melakukan 73, 74, atau 75 byte. Inilah jawaban 74 byte saya .
Lynn

1
Ya ampun aku menghabiskan 3 jam mencoba untuk mendapatkan hal ini hanya satu byte lebih kecil. Ini dia Ganti (i%3&&i%5)*idengan i%3*i%5?i:0aku akan tidur
Albert Renshaw

16

CJam, 35 byte

100{)_[Z5]f%:!"FizzBuzz"4/.*s\e|N}/

Cobalah online di juru bahasa CJam .

Bagaimana itu bekerja

100{)_[Z5]f%:!"FizzBuzz"4/.*s\e|N}/
100{                             }/  For each integer I between 0 and 99:
    )_                                 Increment I and push a copy.
      [Z5]                             Push [3 5].
          f%                           Map % to push [(I+1)%3 (I+1)%5].
            :!                         Apply logical NOT to each remainder.
              "FizzBuzz"4/             Push ["Fizz" "Buzz"].
                          .*           Vectorized string repetition.
                            s\         Flatten the result and swap it with I+1.
                              e|       Logical OR; if `s' pushed an empty string,
                                       replace it with I+1.
                                N      Push a linefeed.

3
Solusi yang lebih mudah:100{):I3%!"Fizz"*I5%!"Buzz"*+Ie|N}/
aditsu

16

MUMPS, 56 54 byte

f i=1:1:100 w:i#5=0 "Fizz" w:i#3=0 "Buzz" w:$X<3 i w !

Apa ini w:$X<3 i, Anda bertanya? $Xadalah variabel ajaib ("intrinsik") yang menyimpan posisi horisontal kursor output (sebagai sejumlah karakter dari tepi kiri terminal). wadalah bentuk WRITEperintah yang disingkat . Sintaksnya command:condition argsadalah postconditional - "jika condition, lalu lakukan command args".

Jadi kami sedang memeriksa apakah kursor keluaran telah maju lebih dari dua karakter (yang berarti bahwa setidaknya satu "Fizz"atau "Buzz"telah ditulis ke terminal), dan jika tidak, tulisi ke terminal. The $Xvariabel - dan karenanya, semacam ini ketidakterpisahan mendalam dari terminal - adalah fitur kelas pertama gondok. Astaga.


15

Jelly , 24 20 byte

³µ3,5ḍTị“¡Ṭ4“Ụp»ȯµ€G

Cobalah online!

Bagaimana itu bekerja

³µ3,5ḍTị“¡Ṭ4“Ụp»ȯµ€G  Main link. No input.

³                     Yield 100.
 µ                    Begin a new, monadic chain.
                 µ€   Apply the preceding chain to all integers n in [1, ..., 100].
  3,5ḍ                Test n for divisibility by 3 and 5.
      T               Get all truthy indices.
                      This yields [1] (mult. of 3, not 5), [2] (mult. of 5, not 3),
                      [1, 2] (mult. of 15) or [].
        “¡Ṭ4“Ụp»      Yield ['Fizz', 'Buzz'] by indexing in a dictionary.
       ị              Retrieve the strings at the corr. indices.
                ȯ     Logical OR hook; replace an empty list with n.
                   G  Grid; join the list, separating by linefeeds.

lagi tidak ada yang keluar golf dennis (kecuali untuk jawaban gaya HQ9 +)
noɥʇʎԀʎzɐɹƆ

15

brainfuck, 206 byte

++>+++++>>>>>++++++++++[>+>>+>>+>+<<<[++++<-<]<,<,-<-<++<++++[<++>++++++>]++>>]>
[+[[<<]<[>>]+++<[<.<.<..[>]]<<-[>>>[,>>[<]>[--.++<<]>]]+++++<[+[-----.++++<<]>>+
..<-[>]]<[->>,>+>>>->->.>]<<]<[>+<<<,<->>>+]<]

Diformat:

++>+++++>>>>>
++++++++++[>+>>+>>+>+<<<[++++<-<]<,<,-<-<++<++++[<++>++++++>]++>>]
>
[
  +
  [
    [<<]
    <[>>]
    +++<
    [
      Fizz
      <.<.<..
      [>]
    ]
    <<-
    [
      >>>
      [
        ,>>[<]
        >[--.++<<]
        >
      ]
    ]
    +++++<
    [
      Buzz
      +[-----.++++<<]
      >>+..
      <-
      [>]
    ]
    <[->>,>+>>>->->.>]
    <<
  ]
  <[>+< <<,<->>>+]
  <
]

Cobalah online

Tata letak memori

0 a 122 105 70 b f 0 t d1 s d2 c d 10 0

di mana fsiklus oleh 3, bsiklus dengan 5, d1adalah angka satu, d2adalah angka sepuluh, sadalah bendera untuk apakah akan mencetak puluhan digit, dsiklus dengan 10, cadalah ruang salin untuk d, tadalah ruang kerja yang menampung 0 atau data sampah atau bendera untuk tidak -divisible-by-3, dan amenentukan terminasi program dengan mengimbangi pointer setelah Buzz telah dicetak 20 kali.


14

C #, 128 126 125 124 byte

class A{static void Main(){for(var i=0;i++<100;)System.Console.Write("{0:#}{1:;;Fizz}{2:;;Buzz}\n",i%3*i%5>0?i:0,i%3,i%5);}}

89 byte tanpa kode boilerplate.

Selesai dengan penggunaan pemformatan bersyarat C # .

Dengan dua pemisah bagian ;, Fizz atau Buzz dicetak jika nilai dari kondisinya nol.


Menyimpan total 4 byte berkat @RubberDuck, @Timwi dan @Riokmij.


Akan lebih singkat untuk memanggil Writedan menambahkan baris baru langsung ke string, bukan?
RubberDuck

Ini juga salah satu byte lebih pendek untuk menulis i%3*i%5>0?i:0bukan i%3*i%5==0?0:i.
Timwi

Anda dapat menyimpan byte lain pada forpernyataan dengan menggunakanfor(var i=0;i++<100;)
Najkin

1
Anda dapat menyimpan tiga byte lagi dengan memanfaatkan Interpolasi String dari C # 6.0 dan menyematkan argumen format ke dalam string itu sendiri (mis. $"{(i%3*i%5>0?i:0):#}...\n")
LiamK

1
dapat dilakukan dengan 121 byte hari ini - class A{static void Main(){for(var i=0;i<100;)System.Console.Write($"{(++i%3*i%5<1?0:i):#}{i%3:;;Fizz}{i%5:;;Buzz}\n");}}
Jerri Kangasniemi

14

Clojure, 113 106 101 100 91 byte

Golf pertamaku!

(dotimes[i 100](println(str({2'Fizz}(mod i 3))({4'Buzz}(mod i 5)({2""}(mod i 3)(inc i))))))

Tidak Terkumpul:

(dotimes [i 100] ; account for off-by-one later
  (println (str ({2 'Fizz} ; str converts symbols to strings
                 (mod i 3))
                ({4 'Buzz} ; 4 instead of 0 because of off-by-one
                 (mod i 5)
                 ({2 ""} ; shortest way to write when-not
                  (mod i 3)
                  (inc i))))))

1
Anda dapat menghapus 5 karakter dengan menangani printlncara yang sama seperti pada solusi Java , mis. (doall(map #(let[t(=(mod % 3)0)](println(str(if t"Fizz""")(if(=(mod % 5)0)"Buzz"(if t""%)))))(range 1 101)))
resueman

1
@resueman Terima kasih! Ini sebenarnya berakhir menjadi 7, karena (if t"Fizz""")dapat disederhanakan (if t"Fizz"). :)
Sam Estep

+1 Trik modulo yang bagus, pada awalnya saya pikir Anda memiliki kesalahan satu per satu.
coredump

14

brainfuck , 411 350 277 258 byte

Suntingan:

  • -61 byte dengan menyimpan nilai "Fizz Buzz" sebagai "BuziF" "BuziG" dan mengulangi bagian pencetakan nomor.

  • -71 byte dengan mengulangi bagian pencetakan nomor modulo, membelah penghitung lingkaran dan penghitung angka, dan menggunakan kembali sel baris baru sebagai nilai mod, antara lain

  • -19 byte dengan menyadari bahwa tidak ada angka 0 dalam angka FizzBuzz. Juga ditambahkan penjelasan

+[-[>+<<]>-]>--[>+>++>++>++++++>+>>>++++++[<<<]>-]<+++++[>+>+>->>->++>>>-->>>++[<<<]>>>-]>[>]+++>>[>+<<<-[<]<[>+++>+<<-.+<.<..[<]<]>>-[<<]>[.>.>..>>>>+[<]+++++<]>[>]>>[[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]>[-<+>]>,>[>]<[>-[<+>-----]<---.,<]++++++++++>]<.<<<<,>-]

Cobalah online!

Alih-alih memeriksa apakah nomor itu sendiri dapat dibagi oleh 5 atau 3, saya memiliki dua penghitung melacak modulo angka, mengurangi mereka untuk setiap nomor dan mencetak kata yang sesuai ketika mereka mencapai 0.

Bagaimana itu bekerja:

+[-[>+<<]>-]>--  Generate the number 61
[>+>++>++>++++++>+>>>++++++[<<<]>-] Set the tape to multiples of 61
TAPE: 0 0' 61  122 122 110 61  0 0 110
           "=" "z" "z" "n" "="
<+++++[>+>+>->>->++>>>-->>>++[<<<]>>>-]>[>]+++>> Modify values by multiples of 5
TAPE: 0' 5 66  117 122 105 71  3 0 100' 0 0 10
           "B" "u" "z" "i" "G"
Some info:
  5     - Buzz counter
  "Buz" - Buzz printing
  "ziG" - Fizz printing. Modifying the G in the loop is shorter than modifying it outside
  3     - Fizz counter
  0     - This is where the Fizz|Buzz check will be located
  100   - Loop counter
  0     - Number counter. It's not worth it to reuse the loop counter as this.
  0     - Sometimes a zero is just a zero
  10    - Value as a newline and to mod the number by

[ Loop 100 times
  >+<<<  Increment number counter
  -[<]<  Decrement Fizz counter
  [ If Fizz counter is 0
    >+++ Reset the Fizz counter to 3
    >+<< Set the Fizz|Buzz check to true
    -.+<.<.. Print "Fizz"
  [<]<] Sync pointers
  >>-[<<]> Decrement Buzz counter
  [ If Buzz counter is 0
    .>.>.. Print "Buzz"
    >>>>+  Set the Fizz|Buzz check to true
    [<]+++++< Reset the Buzz counter to 5
  ]
  >[>]>> Go to Fizz|Buzz check
  [ If there was no Fizz or Buzz for this number
    TAPE: 3% BuziG 5% 0 Loop Num' 0 10
    [->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]  Mod the number counter by 10
    TAPE: 3% BuziG 5% 0 Loop 0' Num 10-Num%10 Num%10 Num/10
    >[-<+>] Move Num back in place
    >,>[>]< Reset 10-Num%10
    [ For both Num/10 (if it exists) and Num%10
      >-[<+>-----]<--- Add 48 to the number to turn it into the ASCII equivilent
      .,< Print and remove
    ]
    ++++++++++> Add the 10 back
  ]
  <. Print the newline
  <<<<, Remove Fizz|Buzz check
  >- Decrement Loop counter
]

Bagus sekali Jo! Saya mungkin mencoba untuk mengalahkan itu suatu hari nanti :)
Forcent Vintier

13

PowerShell, 78 68 61 54 Bytes

1..100|%{(($t="Fizz"*!($_%3)+"Buzz"*!($_%5)),$_)[!$t]}

Sunting: Disimpan 10 byte berkat feersum

Sunting2: Menyadari bahwa dengan trik feersum, saya tidak perlu lagi memformulasikan $ t sebagai string-of-code-blocks

Sunting3: Disimpan 7 byte lagi berkat Danko Durbić

Semangat serupa dalam semangat untuk jawaban Kode Rosetta , tetapi bermain golf cukup sedikit.

Penjelasan

1..100|%{...} Buat koleksi 1 hingga 100, lalu untuk setiap objek dalam koleksi itu, lakukan

(...,$_)buat koleksi baru dari dua elemen: 0) $t=...mengatur variabel $tsama dengan string; 1)$_ jumlah loop saat ini

"Fizz"*!($_%3)ambil nomor-kita-saat ini, mod dengan 3, maka BUKAN hasilnya. Lipat gandakan "Fizz" dengan itu, dan tambahkan ke string (dan mirip dengan 5). PowerShell memperlakukan angka bukan nol sebagai $TRUE, dan dengan demikian BUKAN dari angka bukan nol adalah 0, yang berarti bahwa hanya jika angka kita saat ini adalah kelipatan dari 3 akan "Fizz" ditambahkan ke string.

[!$t]mengindeks ke dalam koleksi yang baru saja kita buat, berdasarkan pada nilai string $t- tidak kosong, cetak, atau cetak nomor kita saat ini


Atau, juga 54 byte

1..100|%{'Fizz'*!($_%3)+'Buzz'*!($_%5)-replace'^$',$_}

Terima kasih kepada TesselatingHeckler

Mirip dalam konsep, ini menggunakan -replaceoperator sebaris dan ekspresi reguler untuk menukar string kosong ^$dengan nomor kami saat ini. Jika string tidak kosong, itu tidak bisa ditukar.


Atau, juga 54 byte

1..100|%{($_,('Fizz'*!($_%3)+'Buzz'*!($_%5))|sort)[1]}

Ini adalah struktur loop yang sama seperti di atas, tetapi di dalamnya mengurutkan pasangan (n, string), dan bergantung pada fakta bahwa string kosong mengurutkan sebelum angka, tetapi string FizzBuzz mengurutkan setelah nomor. Kemudian indeks hasil sortir kedua.


Sebagai tambahan, jika PowerShell pernah mengimplementasikan ||operator, seperti di C #, kita mungkin bisa turun ke 43 byte dengan sesuatu yang mirip dengan 1..100|%{"Fizz"*!($_%3)+"Buzz"*!($_%5)||$_}... diragukan, karena |operator khusus yang begitu penting di PowerShell, tapi aku bisa bermimpi ...
AdmBorkBork

1
Bagaimana dengan 1..100|%{'Fizz'*!($_%3)+'Buzz'*!($_%5)-replace'^$',$_}54?
TessellatingHeckler

Anda dapat menggantinya if($t){$t}else{$_}dengan sesuatu seperti($t,$_)[!$t]
Danko Durbić

1
... sehingga Anda mendapatkan 1..100|%{(($t="Fizz"*!($_%3)+"Buzz"*!($_%5)),$_)[!$t]}yang juga 54 seperti saran @ TessellatingHeckler
Danko Durbić

@TessellatingHeckler PowerShell tidak ada artinya jika tidak fleksibel.
AdmBorkBork

13

JavaScript, 62 byte

for(i=0;++i<101;console.log(i%5?f||i:f+'Buzz'))f=i%3?'':'Fizz'

Saya rasa saya ini adalah solusi Javascript terpendek sekarang.


Wow Hanya wow! Tetapi semua jawaban JS lainnya digunakan console.log; itu jauh lebih menjengkelkan daripada harus menekan "OK" pada 100 kotak pop-up berturut-turut. Bisakah Anda mengubah ini? Itu hanya akan menjadi 62 byte, masih tiga lebih baik dari milikku.
ETHproduk

Saya harus melakukannya besok, karena saya sudah mengedit 5 posting saya sendiri dan tidak dapat mengedit lagi ...
Mama Fun Roll

2
Oh, saya tidak menyadari ada batasan untuk mengedit ...
ETHproduksi

12

C, 74 byte

main(i){for(;i<101;puts(i++%5?"":"Buzz"))printf(i%3?i%5?"%d":0:"Fizz",i);}

The 0argumen untuk printfbukan ""yang mencurigakan, tetapi tampaknya bekerja pada kebanyakan platform saya mencobanya.putssegfault ketika Anda mencoba hal yang sama. Tanpa itu, Anda mendapatkan 75 byte.

Ada solusi 73-byte yang bekerja pada golf anarki , dan saya menemukan satu penggalian di tempat yang tepat di internet, tetapi mereka bergantung pada perilaku platform-spesifik. (Seperti yang bisa Anda tebak, itu sesuatu dari bentuk puts("Buzz"±...).)


Trik yang bagus untuk mendapatkan i = 1 untuk kasus no args (argc = 1). Ini fitur: Anda dapat memulai urutan dari titik mana pun dengan menjalankan ./fizzbuzz $(seq 40): P
Peter Cordes

12

Scratch, 203 185 bytes

Byte dihitung dari representasi tekstual golf , per pos meta ini . Scratch tidak terlalu hemat ruang.

sayadalah hal yang paling dekat dengan stdout yang dimiliki Scratch: sprite menampilkan gelembung ucapan yang berisi apa pun yang dikatakannya. Dalam praktiknya, sebuah wait n secsblok diperlukan untuk benar-benar membaca output ini, tetapi untuk keperluan tantangan ini kode ini memenuhi persyaratan.


Anda kehilangan nomor setelah y =(dalam kedua kejadian)
Peluruhan Beta

@BetaDecay Maaf? Saya tidak mengikuti.
timothymh

Di dalam loop berulang, ada nilai set y to ...yang hilang
Beta Decay

1
@ BetaDecay Itulah string kosong. :) jika Anda mengklik gambar, Anda dapat melihatnya dalam aksi!
timothymh

Ohhh haha ​​maaf telah meragukan Anda;)
Beta Decay

12

R, 88 83 77 71 70 byte

Saya yakin ini bisa diperbaiki ... dan itu dengan kredit ke @flodel. Beberapa byte selanjutnya disimpan berkat saran dari @njnnja dan lainnya dari @ Joe

x=y=1:100;y[3*x]='Fizz';y[5*x]='Buzz';y[15*x]='FizzBuzz';write(y[x],1)

Seekor kucing menjawab. Mouse di atas :)
Silviu Burcea

1
Saya menemukan sedikit lebih baik:x=1:100;i=!x%%3;j=!x%%5;x[i]="Fizz";x[j]="Buzz";x[i&j]="FizzBuzz";cat(x,sep="\n")
flodel

@njnnja Terima kasih atas sarannya. Aku diimplementasikan dengan writeketimbang catmeskipun
MickyT

2
Necromancy di sini! The writepanggilan dapat mengambil 1 bukannya string kosong sehingga x=y=1:100;y[3*x]='Fizz';y[5*x]='Buzz';y[15*x]='FizzBuzz';write(y[x],1)adalah sepele 1 byte golf untuk 70 byte.
J.

68 byte . Bytecount mencakup tiga ruang mundur yang tidak dapat dicetak, dan itu tidak bekerja dengan benar di TIO.
J.

12

Haskell, 84 byte

main=mapM f[1..100]
f n|d<-drop.(*4).mod n=putStrLn$max(show n)$d 3"Fizz"++d 5"Buzz"

Semakin dekat dengan 81 byte henkma , tetapi belum sampai di sana.

d = drop.(*4).mod nadalah kunci di sini: d 3 "Fizz"adalah drop (n`mod`3 * 4) "Fizz". Ini adalah "Fizz"saat n `mod` 30 dan ""sebaliknya.


Penataan ulang golfs itu ke 82, saya pikir: (%)=drop.(*4).mod n;main=mapM putStrLn[max(show n)$3%"Fizz"++5%"Buzz"|n<-[0..100]].
CR Drost

Tunggu, lalu ntidak dalam ruang lingkup. Hm
CR Drost

Ya, itu tidak berhasil, tetapi saya telah menemukan solusi 85-byte alternatif yang sangat mirip:main=mapM putStrLn[max(show n)$3%"Fizz"++5%"Buzz"|n<-[0..100],(%)<-[drop.(*4).mod n]]
Lynn

Mengapa tidak menggunakan jeda baris? Ini sama pendeknya dengan titik koma tetapi kurang terbaca.
dfeuer

1
Saya sarankan Anda mempertimbangkan kembali pencarian Anda untuk kode yang dapat dibaca di situs web kode golf :)
Lynn

11

PHP, 54 byte

<?for(;$i++<100;)echo[Fizz][$i%3].[Buzz][$i%5]?:$i,~õ;

Berlaku untuk v5.5 dan seterusnya. The õkarakter 245, sedikit terbalik\n .

Saya menganggap pengaturan penerjemah default, karena tanpa ini. Jika Anda tidak yakin, Anda dapat menonaktifkan inisialisasi lokal Anda dengan -nseperti pada php -n fizzbuzz.php.

Versi yang akan menjalankan bebas kesalahan dengan mutlak file konfigurasi apa pun adalah 62 byte :

<?php
for(;$i++<100;)echo@([Fizz][$i%3].[Buzz][$i%5]?:$i),"
";

Operator STFU @ tidak harus berarti bahwa kode tersebut bebas kesalahan.
sitilge


@Kzqai ideone.com/0zRA9e short_open_tag adalah off, E_NOTICEaktif. Tidak satu pun dari ini adalah pengaturan default.
primo

Saya mendapat banyak kesalahan di 3v4l.org
seorang coder

@acoder pos meta yang relevan . 3v4l.org tampaknya bermanfaat.
primo

11

80386 kode mesin + DOS, 75 byte

Hexdump kode:

0D 0A 24 B1 64 33 C0 BA-03 05 BB 00 01 40 50 FE
CE 75 0C 83 EB 04 66 C7-07 42 75 7A 7A B6 05 FE
CA 75 0C 83 EB 04 66 C7-07 46 69 7A 7A B2 03 84
FF 74 0C D4 0A 04 30 4B-88 07 C1 E8 08 75 F4 52
8B D3 B4 09 CD 21 5A 58-E2 C0 C3

Kode sumber (sintaks TASM):

    .MODEL TINY

    .CODE
    .386
    org 100h

MAIN PROC
    db 13, 10, '$'
    mov cl, 100
    xor ax, ax
    mov dx, 503h

main_loop:
    mov bx, 100h
    inc ax
    push ax

    dec dh
    jnz short buzz_done
    sub bx, 4
    mov dword ptr [bx], 'zzuB'
    mov dh, 5
buzz_done:

    dec dl
    jnz short fizz_done
    sub bx, 4
    mov dword ptr [bx], 'zziF'
    mov dl, 3
fizz_done:

    test bh, bh
    jz short num_done

decimal_loop:
    aam;
    add al, '0'
    dec bx
    mov [bx], al
    shr ax, 8
    jnz decimal_loop

num_done:
    push dx
    mov dx, bx;
    mov ah, 9
    int 21h
    pop dx
    pop ax

    loop main_loop
    ret

MAIN ENDP
    END MAIN

Kode ini dihitung dari 1 hingga 100 in ax, membangun pesan keluaran dari akhir hingga awal. Akhir pesan (baris baru dan $karakter yang digunakan DOS untuk tanda akhir pesan) muncul di awal kode:

db 10, 10, '$'

Ini dijalankan sebagai instruksi yang tidak berbahaya ( or ax, 240ah). Saya bisa meletakkannya di tempat yang lebih konvensional, seperti setelah akhir kode, tetapi memilikinya di alamat 0x100 memiliki manfaat.

Kode ini juga menggunakan 2 penghitung tambahan:

  • Menghitung dari 3 hingga 0 in dl
  • Menghitung dari 5 hingga 0 in dh

Ketika penghitung mencapai 0, itu mendorong string Fizzatau Buzzke akhir pesan output. Jika ini terjadi, bxakan berkurang, dan bhakan menjadi nol. Ini digunakan sebagai kondisi untuk menghasilkan angka dalam bentuk desimal.

Catatan: Saya menggunakan data 32-bit di sini. Ini tidak akan berfungsi pada komputer pra-386.


Apakah TASM benar-benar menangani konstanta karakter multi-byte dalam urutan yang berlawanan dari NASM ? Di NASM, Anda menulis mov [mem], 'Fizz'untuk menyimpan Fizzdalam urutan itu dalam memori, sesuai dbarahan. Lihat saya overcomplicated "efisien" YASM FizzBuzz misalnya .
Peter Cordes

1
Apakah itu menyimpan byte untuk digunakan std, lalu stosb/ stosd? Anda harus mengganti test bh,bhdengan cmp di, 100hatau sesuatu. Alih-alih menyimpan / mengembalikan penghitung di AL, Anda bisa menyimpannya di BL dan hanya clobber eax kapan pun Anda mau. Misalnya sub bx, 4/ mov dword ptr [bx], 'zzuB'adalah 3 + 7 byte, kan? mov eax, 'zzuB' / stosdadalah 6 + 2 byte (awalan ukuran operan pada keduanya). Akan lebih baik jika jawabannya termasuk pembongkaran sehingga ukuran instruksi terlihat.
Peter Cordes

1
Ini adalah jawaban yang bagus - menyalahgunakan instruksi jinak untuk data dan menggunakan ruang memori PSP yang tidak pernah digunakan. @PeterCordes saya bermain dengan saran Anda menggunakan stosdtetapi saya tidak bisa melakukan pengurangan skor sendiri. Karena stosdpengurangan DIsetelah itu Anda tidak bisa kehilangan sub di, 4dan kemudian Anda memiliki DI4 byte pada akhirnya. Saya dapat -6 bytesmenggunakan beberapa perubahan kecil lainnya yang akhirnya saya posting sebagai jawaban yang terpisah (hanya karena saya tidak mungkin dapat memasukkan semua komentar). Pujian!
640KB

11

dc, 64 62 byte

[[Fizz]P]sI[[Buzz]P]sU[dn]sNz[zdd3%d0=Ir5%d0=U*0<NAPz9B>L]dsLx

Tidak Terkumpul:

[[Fizz]P]sI  # macro I: print "Fizz"
[[Buzz]P]sU  # macro U: print "Buzz"
[dn]sN       # macro N: print current stack depth

z            # increase stack depth

[            # Begin macro
  zdd           # Get current stack depth and ducplicate it twice
  3%d0=I        # Check modulo 3 and leave a duplicate. If it's 0, run macro I
  r             # Rotate top two elements, bringing up the stack depth again
  5%d0=U        # Check modulo 5 and leave a duplicate. It it's 0, run macro U
  *             # Multiply the duplicates of modulos of 3 and 5 ...
  0<N           # ... if it's not 0, run macro N
  AP            # Print a newline (`A` is 10)
                # The macro leaves the stack with one more element each time
  z9B>L      # Run macro L if stack depth is less than "ninety eleven" (101)
]         # End macro

dsLx  # store the macro in register L and execute it
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.