The Smart Person's Mirage


29

Sekali waktu, saya membaca pertanyaan / jawaban ini di Quora

Apakah benar ada programmer dengan gelar ilmu komputer yang tidak dapat lulus tes FizzBuzz

Kode ini diberikan sebagai jawaban yang jelas

for i in range(1, 100):
    if i % 3 == 0 and i % 5 == 0:
        print "FizzBuzz"
    elif i % 3 == 0:
        print "Fizz"
    elif i % 5 == 0:
        print "Buzz"
    else:
        print i

Tentu saja FizzBuzz telah bermain golf sampai mati, tetapi bukan itu pertanyaannya. Anda lihat, di komentar, seseorang menyebutkan bahwa jawaban yang jelas ini bagus karena mudah untuk menambahkan kondisi tambahan seperti mencetak "Jazz" untuk kelipatan 4. (saya tidak setuju. Memperluas skema ini membutuhkan O (2 ** n ) baris kode.)

Tantangan Anda adalah menulis versi FizzJazzBuzz yang paling indah sebagaimana dinilai oleh rekan-rekan Anda.

Beberapa hal yang perlu dipertimbangkan pemilih:

  1. KERING
  2. Efisiensi operasi divisi / modulus

Banyak jawaban di Quora menggunakan Python, tetapi tidak ada batasan bahasa di sini.

Saya akan menerima jawaban dengan suara terbanyak satu bulan dari sekarang

Output sampel:

1
2
Fizz
Jazz
Buzz
Fizz
7
Jazz
Fizz
Buzz
11
FizzJazz
13
14
FizzBuzz
Jazz
17
Fizz
19
JazzBuzz
Fizz
22
23
FizzJazz
Buzz
26
Fizz
Jazz
29
FizzBuzz
31
Jazz
Fizz
34
Buzz
FizzJazz
37
38
Fizz
JazzBuzz
41
Fizz
43
Jazz
FizzBuzz
46
47
FizzJazz
49
Buzz
Fizz
Jazz
53
Fizz
Buzz
Jazz
Fizz
58
59
FizzJazzBuzz
61
62
Fizz
Jazz
Buzz
Fizz
67
Jazz
Fizz
Buzz
71
FizzJazz
73
74
FizzBuzz
Jazz
77
Fizz
79
JazzBuzz
Fizz
82
83
FizzJazz
Buzz
86
Fizz
Jazz
89
FizzBuzz
91
Jazz
Fizz
94
Buzz
FizzJazz
97
98
Fizz
JazzBuzz
popularity-contest  code-challenge  word  popularity-contest  string  grid  language-design  code-golf  source-layout  math  fastest-algorithm  assembly  code-golf  json  code-golf  arithmetic  array-manipulation  code-golf  ascii-art  code-golf  crossword  code-golf  string  restricted-complexity  code-golf  ascii-art  kolmogorov-complexity  code-golf  string  decision-problem  balanced-string  syntax  code-golf  grid  puzzle-solver  hexagonal-grid  code-golf  math  number  sequence  code-golf  string  decision-problem  code-golf  cryptography  king-of-the-hill  code-challenge  fastest-code  code-golf  number  code-golf  code-golf  string  code-golf  cryptography  king-of-the-hill  java  code-golf  number-theory  base-conversion  code-golf  code-golf  array-manipulation  code-golf  array-manipulation  sorting  code-challenge  restricted-source  quine  code-golf  tips  python  king-of-the-hill  code-golf  source-layout  fractal  code-golf  tips  game  king-of-the-hill  path-finding  grid  code-golf  kolmogorov-complexity  natural-language  code-golf  tips  python  code-golf  number  arithmetic  sequence  array-manipulation  code-golf  number  combinatorics  random  integer-partitions  code-golf  string  code-golf  vim  comment  code-golf  combinatorics  counting  code-challenge  rosetta-stone  code-golf  combinatorics  sequence  subsequence  code-golf  code-challenge  restricted-source  primes  printable-ascii  popularity-contest  graphical-output  image-processing 

1
Poin kedua Anda agak kabur ... Apa yang membuat divisi efisien? Mengapa itu penting untuk tantangan?
Sanchises

@sanchises, masih ada platform, terutama mikrokontroler, yang memiliki operasi divisi yang sangat mahal (dalam siklus / waktu). Setidaknya salah satu jawaban di bawah ini menghindari pembagian / modulus sama sekali - tetapi mungkin menyakitkan keterbacaan. Ini sesuatu yang harus dipertimbangkan oleh pemilih.
gnibbler

1
@menyembunyikan tidak samar sama sekali IMHO intinya tidak menggunakan pembagian / modulus sama sekali. Anda dapat melakukannya dengan hanya menyimpan variabel untuk setiap n = (3,4,5 ...) dan meresetnya pada saat itu tidak cocok dan mencetak kata dan menambah ketika tidak. Bagian Kering dapat melakukan fungsi / metode menerima (n, kata) dan dengan demikian "pemeliharaan" menambahkan lebih banyak kata
jean


Jawaban:


101

Versi paling indah, katamu? Lalu, mari kita coba yang ini di ...

Bahasa Pemrograman Shakespeare

The Marvelously Insane FizzBuzzJazz Program.

Lady Capulet, an old bossy woman that loves to count.
The Archbishop of Canterbury, an old fart who adores to spit out letters.


          Act I: The only one of them.

          Scene I: The Archbishop of Canterbury is a bastard.

[Enter The Archbishop of Canterbury and Lady Capulet]

The Archbishop of Canterbury:
 You are nothing!

          Scene II: Count, Lady Capulet, count.

The Archbishop of Canterbury:
 You are as beautiful as the sum of yourself and a cat!

Lady Capulet:
 Am I worse than the square of the product of the sum of a warm gentle flower and a rose
 and my pretty angel?

The Archbishop of Canterbury:
 If not, let us proceed to Scene VIII.

          Scene III: Fizzing to no end!

The Archbishop of Canterbury:
 Is the remainder of the quotient between yourself and the sum of a happy cow and a
 chihuahua as good as nothing?

Lady Capulet:
 If not, let us proceed to Scene IV. Thou art as handsome as the sum of the sum of
 the sweetest reddest prettiest warm gentle peaceful fair rose and a happy proud kindgom
 and a big roman. Speak thy mind!

 Thou art as fair as the sum of thyself and a honest delicious cute blossoming peaceful
 hamster. Thou art as cunning as the sum of the sum of an embroidered King and a horse
 and thyself. Speak thy mind!

 Thou art as amazing as the sum of the sum of a good happy proud rich hero and a hair and
 thyself! Speak thy mind.

 Speak your mind!

          Scene IV: Milady, there is jazz in thy robe.

The Archbishop of Canterbury:
 Is the remainder of the quotient between yourself and a proud noble kingdom as good as
 nothing?

Lady Capulet:
 If not, let us proceed to Scene V. You are as charming as the sum of the sum of a noble
 cunning gentle embroidered brave mighty King and a big warm chihuahua and an amazing
 pony! Speak your mind!

 You are as prompt as the sum of yourself and a big black sweet animal. You are as noble
 as the sum of the sum of a gentle trustworthy lantern and yourself and a hog. Speak your
 mind!

 You are as bold as the sum of the sum of yourself and a good delicious healthy sweet
 horse and my smooth cute embroidered purse. You are as peaceful as the sum of a flower
 and yourself. Speak your mind.

 Speak your mind!

          Scene V: Buzz me up, Scotty!

The Archbishop of Canterbury:
 Is the remainder of the quotient between yourself and the sum of a gentle happy cow and a
 chihuahua as good as nothing?

Lady Capulet:
 If not, let us proceed to Scene VI. Thou art as handsome as the sum of the sweetest
 reddest prettiest warm gentle peaceful fair rose and a small town. Speak your mind!

 You are as prompt as the sum of yourself and a big healthy peaceful fair rich kingdom.
 You are as loving as the sum of the sum of an embroidered King and a horse and thyself.
 You are as amazing as the sum of yourself and a cute fine smooth sweet hamster. Speak
 your mind!

 You are as prompt as the sum of the sum of yourself and an amazing cunning Lord and a
 hair. Speak your mind.

 Speak your mind!

The Archbishop of Canterbury:
 Let us proceed to Scene VII.

          Scene VI: Output or die!

The Archbishop of Canterbury:
 Open your heart!

          Scene VII: Oh, to jump the line.

Lady Capulet:
 You are as handsome as the sum of a proud noble rich kingdom and a rural town. Speak your
 mind! You are as gentle as the sum of the sum of yourself and a green mistletoe and my
 father. Speak your mind!

The Archbishop of Canterbury:
 We must return to Scene II.

          Scene VIII: Goodbye, cruel world!

[Exeunt]

Jadi, setelah perjuangan saya dengan SPL di sini , saya merasa harus melakukan setidaknya satu pengajuan dengan itu pada setiap tantangan. Dan ini dia.

Jadi, ada apa ini?

Jadi, pertama, kami mendeklarasikan variabel yang akan kami gunakan di seluruh program, yang harus berasal dari drama Shakespeare. Muak dengan Romeo, Juliet, Ophelia dan Othello, saya pergi dengan Uskup Agung Canterbury dan Lady Capulet . Deskripsi mereka, serta judul Kisah Para Rasul '/, adegan dihilangkan oleh parser, sehingga Anda dapat meletakkan apa pun yang Anda suka di sana.

Jadi, mari kita buat raja terjemahan ke sesuatu yang sedikit kurang omong kosong .

Babak I, Adegan I

Begin Lady Capulet = 0;

Babak I cukup mudah: kita menginisialisasi variabel kita dengan 0.

Babak I, Adegan II

Lady Capulet += 1; if(Lady Capulet < Math.pow((2*2*1+1)*(2*1),2)) continue; else goto Scene VIII;

Kami menambah nilai Lady Capulet dan membandingkannya dengan 100 (ya, seluruh kalimat itu hanya berfungsi untuk mendapatkan angka 100); jika tidak lebih kecil, kita lompat ke Scene VIII (akhir); jika tidak, kami melanjutkan ke Adegan berikutnya.

Babak I, Adegan III

if(Lady Capulet % (2+1) == 0) continue; else goto Scene IV; The Archbishop of Canterbury = 2*2*2*2*2*2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*2*2*1; The Archbishop of Canterbury += 2*1+1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*2*1+1; System.out.print((char)The Archbishop of Canterbury); System.out.print((char)The Archbishop of Canterbury);

Pertama, kita melihat apakah modulus pembagian dengan 3 adalah 0; jika tidak, kita lompat ke Adegan IV; jika ya, kita mulai melakukan operasi aritmatika dan menyimpannya di Archieperson, mengeluarkannya dalam bentuk karakter begitu kita menemukan yang kita cari. Ya, pada akhirnya, idenya adalah untuk mendapatkan Fizz.

Babak I, Adegan IV

if(Lady Capulet % (2*2) == 0) continue; else goto Scene V; The Archbishop of Canterbury = 2*2*2*2*2*2*1+2*2*1+2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*1; The Archbishop of Canterbury += 2*2*1+(-1); System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*2*1+2*2*2*1; The Archbishop of Canterbury += 1; System.out.print((char)The Archbishop of Canterbury); System.out.print((char)The Archbishop of Canterbury);

Pertama memeriksa apakah modulus pembagian dengan 4 adalah 0, kemudian berlanjut sebagai adegan yang sama seperti sebelumnya, untuk Jazz.

Babak I, Adegan V

if(Lady Capulet % (2*2+1) == 0) continue; else goto Scene VI; The Archbishop of Canterbury = 2*2*2*2*2*2*1+2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*2*2*1; The Archbishop of Canterbury += 2*1+1; The Archbishop of Canterbury += 2*2*2*2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2+1; System.out.print((char)The Archbishop of Canterbury); System.out.print((char)The Archbishop of Canterbury); goto Scene VII;

Berfungsi seperti dua sebelumnya, memeriksa apakah modulus pembagian dengan 5 mengembalikan 0, kemudian mencoba untuk menulis Buzz; satu-satunya perbedaan adalah, pada akhirnya, kami melewatkan adegan.

Babak I, Adegan VI

System.out.print(Lady Capulet);

Untuk mencapai Adegan ini, nomor yang diasumsikan oleh Lady Capulet pastilah bukan Fizz, Jazz, atau Buzz; jadi, kami mengeluarkannya dalam bentuk angka.

Babak I, Adegan VII

The Archbishop of Canterbury = 2*2*2*1+2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*1+1; System.out.print((char)The Archbishop of Canterbury); goto Scene II;

Jadi, ini adalah satu-satunya cara yang saya temukan untuk melompat ke baris berikutnya: output, pertama, CR, lalu LF; lalu, kita kembali ke Scene II, untuk itu kita bisa melanjutkan program.

Babak I, Adegan VIII

End.

Cukup mudah.

Saya masih mencoba untuk melihat apakah saya dapat menunjukkan ini berjalan online, tetapi saya tidak dapat menemukan kompiler online - yang saya tahu tampaknya tidak dapat digabungkan dengan baik dengan program apa pun kecuali yang sudah dimuat, atau mungkin ada semacam masalah dengan antarmuka antara keyboard dan kursi ...

Pembaruan 1:

Setelah komentar mathmandan, saya mengedit urutan adegan Jazz dan Buzz. Itu harus dilakukan.


1
Sepertinya saya memiliki masalah DNS. Maaf untuk alarm salah.
Rainbolt

17
Orang bertanya-tanya mengapa Shakespeare tidak pernah mendapatkan kode-golf.
Sanchises

5
Saya berharap bahwa Adegan III, IV dan V akan sesuai dengan Fizz, Jazz dan Buzz, masing-masing. Tetap saja, dilakukan dengan indah!
mathmandan

1
@mathmandan Sial. Kesempatan yang sia-sia untuk melakukan sesuatu yang cemerlang. MENGUTUK!!
Rodolfo Dias

1
Ini luar biasa, tetapi saya tampaknya telah melihat bug. Saya pikir itu mengeluarkan nomor jika itu bukan Buzz, terlepas dari apakah itu Fizz atau Jazz. Saya tidak menjalankannya, tetapi sepertinya saya tidak dapat menemukan cek untuk ini. Mungkin Anda bisa memeriksa pada akhirnya apakah Archbishop adalah a zdan mengatur ulangnya sebelum setiap loop.
matega

45

> <> (Ikan)

1 > :9b*)?; 0& v
               \ :3%?v "Fizz" r}oooo &1+& \
               /     <                    /
               \ :4%?v "Jazz" r}oooo &1+& \
               /     <                    /
               \ :5%?v "Buzz" r}oooo &1+& \
               /     <                    /
               \   &?v :n                 \
  ^  +1 oa           <                    /

> <> adalah bahasa pemrograman 2D di mana instruksi adalah karakter tunggal dan penunjuk instruksi (IP) dapat bergerak ke atas, bawah, kiri atau kanan, tergantung pada panah ^>v<dan cermin /\. Tidak memiliki variabel atau string sehingga tidak mengulangi diri sendiri sedikit lebih sulit, tapi saya pikir ini bagus dengan caranya sendiri.

Kami mendorong 1dan memulai loop. :9b*)?;memeriksa apakah jumlahnya lebih besar dari 99 ( 9b* = 9*11), dan jika demikian program berhenti ;. Jika tidak, masukkan 0 ke dalam register dan pindah vke bagian bergelombang.

:3%?memeriksa nomor modulo 3. Jika bukan nol, maka kita turun vsatu baris dan bergerak ke kiri <. Kalau tidak, kita lewati panah ke bawah dan tekan "Fizz", cetak ( r}oooo) dan tambah register ( &1+&) sebelum memantul dari cermin dinding kanan untuk turun satu baris. Apa pun cara kita akhirnya bergerak ke kiri di sepanjang baris ketiga, sampai kita terpental dari cermin dinding kiri. Kemudian kami ulangi untuk Jazzdan Buzz.

Ini berlanjut hingga baris ke-7, yang memeriksa nilai register &. Jika bukan nol, maka kita turun saja. Kalau tidak, kami mencetak nomor itu sendiri nsebelum turun.

Akhirnya, ao(ingat, kita bergerak ke kiri sekarang!) Mencetak baris ASCII dan 1+menambah nomor, sebelum kita naik ^dan melakukan loop >lagi.

(Sekarang kita menunggu jawaban estetika Piet ...)


3
Ini indah. Ini harus masuk ke hall of fame untuk> <> jawaban.
Joshpbarron

2
Mataku langsung melompat ke: 3.
EMBLEM

Ya, bahasa itu tidak akan memenangkan penghargaan keterbacaan apa pun, tapi bahasa itu cukup rapi.
William T Froggard

40

LOLCODE

Anggun? Nggak. Efisien? Tentu saja tidak. Indah? Nah, Anda tahu apa yang mereka katakan: kecantikan ada di mata yang melihatnya.

HAI
I HAS A kitty ITZ 1
IM IN YR house UPPIN YR kitty TIL BOTH SAEM kitty AN 100

    BTW, computin yr mods
    I HAS A d00d ITZ NOT MOD OF kitty AN 3
    I HAS A doge ITZ NOT MOD OF kitty AN 4
    I HAS A bro ITZ NOT MOD OF kitty AN 5

    ANY OF d00d bro doge MKAY, O RLY?
    YA RLY
        d00d, O RLY?
        YA RLY
            VISIBLE "Fizz"!
        OIC
        doge, O RLY?
        YA RLY
            VISIBLE "Jazz"! BTW, wow such jazz
        OIC
        bro, O RLY?
        YA RLY
            VISIBLE "Buzz"!
        OIC
    NO WAI
        VISIBLE kitty!
    OIC

    VISIBLE ""
IM OUTTA YR house
KTHXBYE

Beberapa penjelasan:

Program LOLCODE dimulai dengan HAIdan diakhiri dengan KTHXBYE.

Variabel diketik secara dinamis dan ditugaskan menggunakan I HAS A <variable> ITZ <value>. Setelah didefinisikan, variabel juga dapat ditugaskan menggunakan <variable> R <value>.

Loop di LOLCODE diberi nama. Sintaksnya adalah:

IM IN YR <loop> UPPIN YR <index> TIL BOTH SAEM <index> AN <end>
    <stuff to do>
IM OUTTA YR <loop>

Ini hanya Internet berbicara untuk "loop sampai i = end". Dalam LOLCODE 1.2, variabel pengindeksan perlu diinisialisasi sebelum loop. Di sini loop dinamai "rumah" karena membuat pembacaan inisialisasi loop terdengar lucu.

VISIBLEmencetak ke stdout. Secara default, baris baru ditambahkan, tetapi menambahkan akan !menekan baris baru.

Persyaratan ditentukan sebagai berikut:

<condition>, O RLY?
YA RLY
    <code to execute if condition is true>
NO WAI
    <code to execute if condition is false>
OIC

Kondisi harus berupa ekspresi yang mengevaluasi ke nilai boolean atau boolean. Dalam LOLCODE, tipe boolean dipanggil TROOFdan memiliki nilai WIN(true) dan FAIL(false).

Komentar baris tunggal dimulai dengan BTW.

Tidak berpengalaman dalam bahasa Internetz? Beri tahu saya dan saya akan dengan senang hati memberikan penjelasan lebih lanjut.


3
Besar. Ini luar biasa. Saya masih tertawa
rpax

@ rpax: Luar biasa ... Semua berjalan sesuai rencana ...
Alex A.

33

Python3

lst = [('Fizz', 3),
       ('Jazz', 4),
       ('Buzz', 5),
       ]

for i in range(1, 101):  
    print(*[w for w, m in lst if i % m == 0] or [i], sep='')

Di antara jawaban teratas saat ini, ini adalah satu-satunya yang memiliki bentukEfficiency of division/modulus operations
aross

@aross Apa maksudmu? Semua jawaban yang saya lihat menggunakan paling banyak jumlah operasi divisi / modulus yang sama dengan yang ini.
Hjulle

Sangat? Semua jawaban lain menggunakan operator modulus untuk masing-masing (3, 4, 5). Ini digandakan tiga kali. Ini adalah satu-satunya jawaban teratas dengan hanya operator modulus tunggal.
aross

1
Saya baru saja membaca komentar pada pertanyaan. Saya kira saya salah mengartikan kalimat yang dikutip. Seharusnya disebut DRYsebagai gantinya. Selanjutnya, jawaban ini disusun oleh OP.
aross

31

Piet

Tampilan Lebih Besar"Sumber" yang sebenarnya

Saya memutuskan untuk mencoba dan bermain dengan Piet dan melihat betapa cantiknya kode yang bisa saya buat. Saya mencoba untuk tidak mengulangi apa pun di sini, meskipun jujur ​​saya harus mengulangi perhitungan mod. Namun, setiap mod yang berbeda (n% 3, n% 4, dan n% 5) hanya dijalankan sekali per iterasi kode.

Gambar yang lebih kecil adalah sumber yang tepat, dan dapat diunggah dan dijalankan di sini .

Nikmati!


4
"Apakah benar-benar programmer dengan gelar ilmu komputer yang tidak bisa lulus ujian FizzBuzz di Piet ?"
Sanchises

26

Mathematica

Dalam Mathematica, Anda dapat menetapkan dan membebani fungsi untuk parameter yang sangat spesifik (tidak hanya berdasarkan jenis, tetapi juga oleh kondisi logis arbitrer). Mari kita mendefinisikan beberapa fungsi:

Fizz[n_, s___] := {n, s}
Fizz[n_ /; Divisible[n, 3], s___] := {n, "Fizz" <> s}
Jazz[n_, s___] := {n, s}
Jazz[n_ /; Divisible[n, 4], s___] := {n, "Jazz" <> s}
Buzz[n_, s___] := {n, s}
Buzz[n_ /; Divisible[n, 5], s___] := {n, "Buzz" <> s}
DoThe[n_] := n
DoThe[_, s_] := s

Dan sekarang program sebenarnya hanyalah

DoThe @@@ Fizz @@@ Jazz @@@ Buzz /@ Range[100] // TableForm

Sekarang sementara di atas hanya tumbuh secara linear dengan jumlah pembagi, itu masih tidak terlalu KERING. Tapi kita sebenarnya bisa menggunakan variabel sebagai nama dalam definisi ini. Jadi kita sebenarnya bisa menulis fungsi yang menghasilkan definisi fungsi ini:

addFunction[f_, divisor_] := (
  f[n_, s___] := {n, s};
  f[n_ /; Divisible[n, divisor], s___] := {n, ToString[f] <> s}
)
addFunction[Fizz, 3];
addFunction[Jazz, 4];
addFunction[Buzz, 5];
DoThe[n_] := n
DoThe[_, s_] := s

DoThe @@@ Fizz @@@ Jazz @@@ Buzz /@ Range[100] // TableForm

Sekarang yang harus Anda lakukan adalah menambahkan addFunctionpanggilan lain dan menambahkan panggilan baru Anda **zzke baris terakhir.


13
DoThe @@@ Time @@@ Warp @@@ Again /@ Range[100] // TableForm
Sp3000

10
Itu hanya JMPke kiri!
MikeTheLiar

"Yang harus Anda lakukan adalah menambahkan panggilan addFunction lain." ... dan menambahkan fungsi baru ke baris terakhir?
Sparr

@Parr oh ya itu benar
Martin Ender 515

22

Haskell

Kalian tidak menganggap serius KERING. Ada pola yang jelas yang dapat diperhitungkan dalam urutan "Fizz Jazz Buzz".

import Control.Applicative

-- All words end with "zz" and the numbers are in a sequence
fizzes = zip [3..] $ (++ replicate 2 'z') <$> words "Fi Ja Bu"

main = putStrLn . unlines $ fizzIt <$> [1..99]

-- Point free style with reader monad ((->) a) to minimize
-- unnecessary repetition of variable names
fizzIt = nonFizzy =<< fizzy

-- Show the number if no fizziness was found. Partially point free
-- with respect to n. But xs is needed to prevent the error:
-- "Equations for ‘nonFizzy’ have different numbers of arguments"
nonFizzy "" = show
nonFizzy xs = const xs

-- (Ab)use the list monad for concatenating the strings

fizzy i = snd =<< filter ((==0).mod i.fst) fizzes
-- Could also be written as:
-- > fizzy i = concat [ str | (n,str) <- fizzes, i`mod`n==0]
-- but that would be way too readable, and not pointless (ahem, point free) enough. ;)

Kode ini juga mudah diperluas. Untuk mengatasi masalah "Fizz Jazz Buzz Tizz", yang perlu Anda lakukan adalah menambahkan Tisetelah Budalam string. Ini jauh lebih sedikit daripada apa yang dibutuhkan dalam solusi lain mana pun.


5
Bagaimana jika Anda harus menyelesaikan masalah Fizz-Jazz-Buzz-Sosis?
Anko

@Anko saya bisa melakukan sesuatu seperti ini fizzes = zip [3..] $ ((++ replicate 2 'z') <$> words "Fi Ja Bu") ++ ["Sausage"], atau kembali saja fizzes = zip [3..] $ words "Fizz Jazz Buzz Sausage".
Hjulle

3
replicate 2 zmerentangkannya sedikit. . .
Soham Chowdhury

3
@octatoan saya tidak bisa menolak. ;)
Hjulle

16

Excel VBA

             Sub scopeeeeeeeeeeeeeeee()
                     '   ||
               For u = 1 To 100
   If u Mod 3 = 0 Then yell = "Fizz"
If u Mod 4 = 0 Then yell = yell & "Jazz" '---------------------------------------------|
If u Mod 5 = 0 Then yell = yell & "Buzz" '---------------------------------------------|
            'made in USA
            If yell = "" Then yell = u
             Debug.Print yell      '\\
             yell = ""              '\\
            Next                     '\\
           End Sub                    '\\

Ini mungkin terdengar bodoh, tapi ini adalah senapan sniper 2D!


Setengah dari itu.!!!!
Pengoptimal

2
Juga, ini lucu - "Jika Anda mode 3"
Pengoptimal

Terima kasih!! Saya tidak berharap seseorang menyadari bagian u mode 3 begitu cepat
Alex

Saya tidak mengerti mengapa setengahnya!
Alex

Sniper hanya setengah. Lingkup biasanya di tengah sniper.
Pengoptimal

15

Jawa

void fizzy(int limit){
    String[] output = new String[limit];
    Arrays.fill(output,"");

    List<SimpleEntry<Integer,String>> tests = new ArrayList<SimpleEntry<Integer,String>>();
    tests.add(newEntry(3,"Fizz"));      
    tests.add(newEntry(4,"Jazz"));      
    tests.add(newEntry(5,"Buzz"));      

    for(SimpleEntry<Integer,String> test : tests)
        for(int i=test.getKey();i<limit;i+=test.getKey())
            output[i] += test.getValue();           

    for(int i=1;i<limit;i++)
        System.out.println(output[i].length()<1 ? i : output[i]);
}   

SimpleEntry<Integer,String> newEntry(int key, String value){
    return new SimpleEntry<Integer,String>(key,value);
}

Jadi Java tidak benar-benar dianggap "indah" oleh kebanyakan orang, tapi itu subjektif subjektif jadi saya pergi dengan pedoman dalam pertanyaan:

  • Jangan Ulangi Diri Anda Sendiri: Tidak masalah. Anda hanya perlu menambahkan satu baris untuk setiap nomor. Saya bahkan membuat fungsi pembantu sehingga Anda tidak perlu mengetik sebanyak saat Anda melakukannya (Java terkadang bisa sedikit bertele-tele, jika Anda tidak tahu).
  • Efisiensi operasi divisi / modulus: Efisiensi sempurna, karena tidak ada modulus atau pembagian sama sekali.

Itu bukan untuk mengatakan bahwa algoritma secara keseluruhan adalah yang paling efisien (bukan), tapi saya pikir itu menyentuh poin yang baik.


2
Ini tidak akan menjadi Java jika Anda tidak mendefinisikan kelas. : D
Adrian Leonhard

Saya ingin menyukai jawaban Java dan saya suka pendekatan ini, tetapi saya merasa seperti menanamkan kode untuk-pernyataan adalah kebingungan yang tidak perlu. Beautiful Java adalah Java yang dapat dibaca!
Alex Pritchard

@AlexPritchard Saya menganggap itu efek samping dari kode golf. Akan diperbaiki ketika di PC :)
Geobits

11

Informasikan 7

Inform 7 adalah bahasa pemrograman berbasis aturan yang dirancang untuk fiksi interaktif. Hal ini penting untuk menjadi salah satu bahasa pemrograman berbasis bahasa alami yang paling sukses. Lihat pameran bahasa Inform 7 untuk contoh lain dan beberapa hal sepele.

The number printing rules are a number based rulebook.

Definition: a number is fizzy if the remainder after dividing it by 3 is 0.
Definition: a number is jazzy if the remainder after dividing it by 4 is 0.
Definition: a number is buzzy if the remainder after dividing it by 5 is 0.

A number printing rule for a fizzy number:
    say "Fizz";

A number printing rule for a jazzy number:
    say "Jazz";

A number printing rule for a buzzy number:
    say "Buzz";

A number printing rule for a number (called N):
    unless a paragraph break is pending:
        say N;
    say conditional paragraph break;

To print a series of numbers from (min - a number) to (max - a number):
    repeat with N running from min to max:
        follow the number printing rules for N;

Kode ini memiliki keuntungan bahwa setiap aturan FizzBuzz sepenuhnya independen: aturan tambahan dapat ditambahkan kapan saja tanpa perlu mengubah kerangka umum. Sayangnya itu sedikit berulang, terutama dengan frasa definisi. Saya dapat mendefinisikan operator%, tetapi kemudian bukan bahasa Inggris. ;)

Kode ini dapat dijalankan secara online menggunakan Playfic .


7

Dyalog APL

∇FizzJazzBuzz;list;items;names
   items ← ⍳100    
   list  ← ↑('Fizz' 3) ('Jazz' 4) ('Buzz' 5)   

   names ← (,/ ↑(↓0=⍉list[;2]∘.|items) /¨ ⊂list[;1]) ~¨ ' '
   ⎕← ↑,/↑names ,¨ (∊0=⍴¨names) ⍴¨ ⊂¨⍕¨items
∇
  • KERING: tidak ada kode ganda
  • Kondisi yang mudah diubah: nama diambil dari daftar, secara berurutan, per pembagi, dengan perubahan minimal yang diperlukan
  • Mudah untuk mengubah rentang: items dapat diubah ke daftar angka yang berubah-ubah
  • Efisien: memanfaatkan algoritma berbasis daftar yang diparalel dengan mudah yang hanya terdiri dari primitif bebas efek samping.
  • Aliran kode sederhana: tidak hanya tidak ada goto , tidak ada saat atau jika s baik. Kode ini sepenuhnya linier.
  • Amankan pekerjaan Anda: hampir tidak ada orang lain yang bisa mengerjakannya ...

Apa nilai ⎕MLdan ⎕IO?
FUZxxl

Keduanya 1, yang merupakan default.
marinus

7

C #

for(int i = 1; i <= 99; i++){
    string s = "";
    if (i % 3 == 0) s += "Fizz";
    if (i % 4 == 0) s += "Jazz";
    if (i % 5 == 0) s += "Buzz";
    System.Console.WriteLine(s == "" ? "" + i : s);
}

Periksa mod, build string, cetak nomor jika kosong atau string jika tidak. Tidak ada pengulangan. Hanya perlu menambahkan kondisi & keluaran untuk persyaratan baru.


2
"Tidak mengulangi"? (Oke, setidaknya ukuran kode tumbuh secara linear dengan kata-kata tambahan.)
Anko

Saya mengambil tantangan untuk tidak mengulangi sedikit lebih jauh dengan jawaban C # saya, tetapi mengorbankan fleksibilitas apa pun ketika datang ke nomor mana untuk modulus aktif. Saya pikir hasil terbaik adalah struktur data yang berhubungan dengan angka dan kata.
sydan

@Anko Tidak yakin apa yang Anda maksud, tidak ada fungsi yang diulang. Saya tidak melakukan hal yang sama dua kali di mana saja dalam kode.
rapjr11

@ rapjr11 Cek kode i- %-sesuatu kali, juga menambahkan sberkali-kali. (Banyak sintaks yang berulang juga, tapi itu mungkin salah C #).
Anko

7

Python 2.7

Saya mencoba membuatnya puitis ...

Saya tidak pandai puisi cinta ...

of = 1
my_love = 100
youre = "ever"

#You are
for ever in range(of, my_love) :
    never = "out my mind"
    for I,am in[#audibly
                (3, "Fizzing"),
                (4, "Jazzing"),
                #and
                (5, "Buzzing")]:
        if( ever % I ==0):# near you
            never += am #I lonely.
    #because
    youre = ever #in my mind.
    if( youre, never == ever,"out my mind" ):
        never += str(youre) #(I gave up with this line...)
    #then our foot-
    print"""s will"""( never [11:3])# part. 

Ini juga akan jauh lebih baik tanpa konstanta awal: P


Kreatif, tetapi ini tidak berjalan untuk saya di Python 2.7.9. Ia mengatakan: TypeError: 'str' object is not callable.
Alex A.

Hmmmm ... Sial ... Tidak sepenuhnya yakin bagaimana saya melewatkan itu: /
JamJar00

5

Java dengan kelas

Algoritma:

public static void main(String... args) {

    List<Condition> conditions = new ArrayList<Condition>();
    conditions.add(new TerminatingCondition(100));
    conditions.add(new ModuloCondition(3, "Fizz"));
    conditions.add(new ModuloCondition(4, "Jazz"));
    conditions.add(new ModuloCondition(5, "Buzz"));
    conditions.add(new EchoCondition());

    while (true) {
        for (Condition c : conditions){
            c.apply();
        }
    }

}

Kelas-kelas:

interface Condition {
    void apply();
}

static class ModuloCondition implements Condition {
    int modulo, count = 0;
    String message;
    ModuloCondition(int modulo, String message){
        this.modulo = modulo;
        this.message = message;
    }
    public void apply() {
        count++;
        if (count == modulo) {
            out.append(message);
            count = 0;
        }
    }
}

static class TerminatingCondition implements Condition {
    int limit, count = 0;
    TerminatingCondition(int limit) {
        this.limit = limit;
    }
    public void apply() {
        count++;
        if (count > limit) {
            System.exit(0);
        }
    }
}

static class EchoCondition implements Condition {
    int count = 0, lastOutCount = 0;
    public void apply() {
        count++;
        out.println((lastOutCount == out.count) ? String.valueOf(count) : "");
        lastOutCount = out.count;
    }
}

static class Out {
    int count = 0;
    void append(String s) {
        System.out.append(s);
        count++;
    }
    void println(String s){
        append(s + System.lineSeparator());
    }
}

static Out out = new Out();

2
+1, Anda telah benar-benar menangkap semangat Java coding dengan FizzBuzzJazz 70-baris ini. Berorientasi objek dan ditulis dalam gaya yang jelas, tidak disingkat, dapat dibaca. Sangat panjang. Tapi sangat enak dibaca. ; ^)
DLosc

4

MATLAB / Oktaf

Tentu saja, menulis loop Anda sendiri adalah hal yang menyenangkan untuk programmer, tetapi semua orang tahu betapa membosankannya pengindeksan yang sebenarnya (yang belum menulis for(j=i;j<n;i++) dalam satu lingkaran setidaknya sekali dalam hidup mereka?)

MATLAB memiliki solusinya. Sungguh, kode ini bukan yang paling efisien, dan tentu saja bukan kode-golf, tetapi ini tentu saja sebuah karya yang bagus dari fungsi MATLAB yang lebih menarik. Oktaf adalah versi GNU dari MATLAB; namun tidak cocok untuk kode-golf karena sedikit lebih ketat dengan tipe variabel, yang merugikan bagi kode-golf.

Sunting: sampai penyorotan sintaks untuk MATLAB ada di SE, saya memposting versi dengan komentar yang sangat sedikit, karena kalau tidak itu hanya blok teks biasa yang menakutkan.

function out = fizzjazzbuzz(n)
    %Initialization
    numberlist=1:n;
    fizz=cell(1,100);
    jazz=fizz;buzz=jazz;

    %Complex loops - no, wait, easy logical indexing.
    fizz(~mod(numberlist,3))={'Fizz'}; 
    jazz(~mod(numberlist,4))={'Jazz'};
    buzz(~mod(numberlist,5))={'Buzz'};
    out=strcat(fizz,buzz,jazz);
    %Fill with numbers
    out(cellfun(@isempty,out))=num2cell(numberlist(cellfun(@isempty,out)));

    %Pretty output (although the default printing is perfectly acceptable)
    out=cellfun(@num2str,out,'UniformOutput',0);
    strjoin(out,sprintf('\n'));
end

2
for(j=i;j<n;i++)? Pertanyaan saya adalah: yang tidak menulis ini "setidaknya sekali dalam hidup mereka"? Jika Anda melakukannya, saya punya barang baru yang buruk untuk Anda ...
Bogdan Alexandru

1
@BogdanAlexandru Anda tidak pernah dalam hidup Anda secara tidak sengaja menambah variabel yang salah dalam satu forlingkaran (misalnya saat loop pengulangan)? Apakah Anda orang yang kodenya berhasil dikompilasi setiap kali? Jika Anda, saya punya berita tuhan untuk Anda ...
Sanchises

2
Saya tidak berbicara tentang penambahan variabel yang salah, kode saya tidak ditulis oleh Tuhan. Saya berbicara tentang gaya pengkodean, itu sendiri sangat rawan kesalahan. The jnama untuk variabel lokal lingkaran baik-baik saja, tetapi inama adalah praktek yang sangat buruk dan itu adalah sumber kesalahan Anda. Ini bukan murni tidak sengaja :)
Bogdan Alexandru

@ BogdanAlexandru Ah ya, saya cukup setuju; alasan saya masih menggunakan gaya loop ini adalah ketika menerapkan tugas yang diberikan (saya seorang mahasiswa master); Saya lebih suka menggunakan notasi indeks yang digunakan oleh profesor yang bersangkutan, daripada untuk membingungkan orang tua miskin dengan menggunakan saya sendiri.
Sanchises

1
Tidak masalah memberikan satu nama huruf ke indeks loop, tetapi variabel lain harus memiliki nama yang lebih bermakna.
Bogdan Alexandru

4

Python

from collections import defaultdict

lst = [(3, 'Fizz'),
       (5, 'Buzz'),
       (4, 'Jazz')]

word_list = defaultdict(list)

for d, w in sorted(lst):
    for i in range(d, 100, d):
        word_list[i].append(w)

for i in range(1, 100):
    print(''.join(word_list[i]) or i)

Ini tentu saja terlalu lama. solusi gnibbler jauh lebih baik. (meskipun diganti*..., sep='' dengan''.join akan lebih indah)

Tetapi ini cukup efisien dalam hal operasi divisi / modulus.


1
Mengapa Anda menggunakan sorted(lst), mengapa tidak memasukkannya ke dalam urutan yang Anda butuhkan saat Anda mendefinisikannya?
mbomb007

Atau urutkan di tempat sebelum loop. lst.sort()
Davidmh

4

Rubi

100.times do |n|
  l = [nil, 'Fizz', 'Jazz', 'Buzz'].select.with_index{|x, i| x && (n % (i+2)) == 0 }
  puts l.empty? ? n : l * ''
end

Sepertinya ini kelipatan 2,3 dan 4?
gnibbler

@gnibbler Whoops, ya itu. Tetap.
Gagang pintu

4

Haskell

inp = [(3, "Fizz"), (4, "Jazz"), (5, "Buzz")]

mkList (n, str) = cycle $ replicate (n-1) "" ++ [str]

merge lists = (head =<< lists) : merge (map tail lists)

checkFJB "" n = show n
checkFJB s  _ = s

fjb = zipWith checkFJB (merge $ map mkList inp) [1..]

print100fjb = mapM_ putStrLn $ take 100 fjb

Namun solusi lain tanpa pembagian atau modulus. fjbmembuat daftar Fizzes, Jazzes, Buzzes dan / atau angka yang tak terbatas. takeberapapun jumlah yang Anda inginkan, seperti yang terlihat di print100fjbmana mencetak 100 elemen pertama.


4

SQL (MySQL)

SELECT COALESCE(GROUP_CONCAT(FizzJazzBuzz.str ORDER BY FizzJazzBuzz.n SEPARATOR ''), I.id)
FROM I
    LEFT JOIN (
        SELECT 3 n,'Fizz' str
        UNION SELECT 4, 'Jazz'
        UNION SELECT 5, 'Buzz'
    ) FizzJazzBuzz ON I.id MOD FizzJazzBuzz.n = 0
GROUP BY I.id
ORDER BY I.id;

di mana saya adalah tabel dengan satu kolom (id INT) yang berisi 100 bilangan bulat.

Saya tidak tahu rasa SQL yang dapat menghasilkan tabel saya dengan mudah, atau dapat menggunakan VALUES sebagai subqueries, yang dapat membuatnya jauh lebih baik dan lengkap.


1
Anda dapat menggunakan variabel di mysql. SELECT @i:= (@i + 1) FROM mysql.help_relation, (SELECT @i:=0) v WHERE @i < 100;
slicedtoad

@slicedtoad SELECT DISTINCT help_keyword_id FROM mysql.help_relation WHERE help_keyword_id>0 AND help_keyword_id<=100juga berfungsi. Tetapi jika 100 diubah menjadi 10.000, keduanya akan rusak.
jimmy23013

1
Cukup gabung sendiri jika Anda membutuhkan lebih banyak baris.
slicedtoad

Sejauh yang saya ketahui, MySQL adalah satu-satunya dialek SQL yang tidak memiliki opsi generator baris yang mudah. Sebagian besar hanya dapat menggunakan ekspresi tabel umum rekursif.
Ben

@ Ben Tapi cara rekursif tidak selalu terlihat bagus. Saya tidak akan memperbaiki jawaban saya dengan mengubah dialek karena sudah ada jawaban Oracle SQL.
jimmy23013

3

Rubi

1.upto(100) do |i|

  rules = { 3 => 'Fizz', 4 => 'Jazz', 5 => 'Buzz' }

  print(i) unless rules.select! { |n,s| i.modulo(n) > 0 or print(s) }

  puts

end

3

JavaScript


Mungkin bukan cara yang paling efisien, tapi saya pikir itu sederhana dan cantik <3

(function fizzBuzz(iter){
    var str = '';
    

    if(!(iter % 3)) str += 'Fizz'
    if(!(iter % 4)) str += 'Jazz'
    if(!(iter % 5)) str += 'Buzz'


    console.log(str || iter)


    if(iter >= 100) return

    
    fizzBuzz(++iter)
})(1)


Moar KERING dan buruk rupa: C

(function fizzBuzz(iter){
    var 
        str,
        fijabu = ['Fi','Ja','Bu']
    ;
    

    (function isMod(_str,val){

        if(!(iter % val)) _str += fijabu[val-3] + 'zz'


        if(val >= 5) return str = _str


        isMod(_str,++val)
    })('',3)


    console.log(str || iter)


    if(iter >= 100) return

    
    fizzBuzz(++iter)
})(1)


8
Mengapa spasi ganda?
Anko

Konvensi Pribadi. Saya pikir itu lebih baik untuk dibaca.
soundyogi


Saya melakukannya hanya dalam proyek pribadi dan untuk bersenang-senang. Kebanyakan Tim tidak menyukainya.
soundyogi

2

JavaScript

KERING ...;)

(function FizzJazzBuzz(iter) {
    var output = ["Fi", "Ja", "Bu"];
    var str = "";

    output.map(function(v,i,a) {
        if(!(iter%(i+3))) str += output[i] + "zz";
    });

    console.log(str || iter);

    if(iter < 100) FizzJazzBuzz(++iter);

    return;
})(1);

2

Benar-benar Bodoh C #

Setengah dari briefnya adalah 'JANGAN ULANGI DIRI SENDIRI', jadi saya mengambilnya sesering mungkin dengan C # dan itu tanpa sengaja berkembang menjadi kode golf. Ini golf pertama saya dan saya melakukannya di C #, bodoh saya tahu tapi inilah hasilnya:

Golf ( 240 232 230 karakter):

namespace System{using Diagnostics;using i=Int32;using s=String;class P{static void Main(){s[] z=new s[]{"Fi","Ja","Bu"};for(i a=1;a<100;a++){s l="";for(i b=3;b<6;b++)if(a%b==0)l+=z[b-3]+"zz";Trace.WriteLine((l!="")?l:a+"");}}}}

Tidak Terkumpul:

namespace System
{
   using Diagnostics;
   using i = Int32;
   using s = String;
   class P 
   { 
      static void Main() 
      {
         s[] z = new s[] { "Fi","Ja","Bu" }; 
         for(i a = 1;a < 100;a++) 
         { 
            s l = ""; 
            for(i b = 3;b < 6;b++)
               if(a % b == 0)
                  l += z[b - 3] + "zz"; 
            Trace.WriteLine((l != "") ? l : a+""); 
         } 
      } 
   }
}

Tujuannya adalah untuk mempersingkat segala hal yang harus saya gunakan lebih dari sekali dan secara umum untuk menjaga kode tetap pendek sambil menghasilkan program C # lengkap. Untuk ini, Anda perlu menggunakan VisualStudio dan mengatur objek StartUp ke 'P' Anda juga perlu mencari output di jendela output debugging.

Ada beberapa batasan serius di sini:

  • Kode ini mengasumsikan bahwa semua kata akan diakhiri dengan 'zz'
  • Kode mengasumsikan bahwa modulus akan terjadi secara berurutan (3,4,5,6 ...)
  • Kode masih mendukung kurangnya atau pengulangan dari golf sejati, lebih banyak karakter ditambahkan untuk menghindari beberapa pengulangan

2

Python 2

Saya ingin menulis jawaban untuk ini dalam beberapa Python rapi yang akan memamerkan fitur-fitur bahasa, mematuhi prinsip KERING, dan cukup mudah dibaca.

group = range(100)
rules = [('fizz', group[::3]), ('jazz', group[::4]), ('buzz', group[::5])]
for number in group[1:]:
    labelset = ''
    for label, matches in rules:
        if number in matches:
            labelset += label
    print labelset if labelset else number

Contoh kecil ini menunjukkan slicing, inoperator, dan sintaks ternary yang verbose tetapi dapat dimengerti. Sama sekali tidak menggunakan operator modulo. Itu tidak dirancang untuk efisiensi run-time, tapi itu bukan tujuannya. Ini dirancang agar pendek, dapat dimengerti dan dipelihara.


Mengapa tidak menggunakannya set(group[...])dalam aturan?
gnibbler

Aku lebih memilih keanggunan daripada kecepatan. Menggunakan set () tentu akan lebih cepat dalam aplikasi nyata.
Logic Knight

2

Python 2.7, 111 byte

Ini kontribusi pertama saya. Saya mencoba menerapkan beberapa trik codegolfing Python (string interleaving, akses indeks tuple bukan if). Jika Anda memiliki saran, silakan bagikan!

for i in range(1,101):
 p=""
 for x in 3,4,5:
  if not(i%x):p+="FJBiauzzzzzz"[x-3::3]
 print((p,i)[not len(p)])

Keluaran:

1
2
Fizz
Jazz
Buzz
Fizz
7
Jazz
Fizz
Buzz
11
FizzJazz
13
14
FizzBuzz
Jazz
17
Fizz
19
JazzBuzz
Fizz
22
23
FizzJazz
Buzz
26
Fizz
Jazz
29
FizzBuzz
31
Jazz
Fizz
34
Buzz
FizzJazz
37
38
Fizz
JazzBuzz
41
Fizz
43
Jazz
FizzBuzz
46
47
FizzJazz
49
Buzz
Fizz
Jazz
53
Fizz
Buzz
Jazz
Fizz
58
59
FizzJazzBuzz
61
62
Fizz
Jazz
Buzz
Fizz
67
Jazz
Fizz
Buzz
71
FizzJazz
73
74
FizzBuzz
Jazz
77
Fizz
79
JazzBuzz
Fizz
82
83
FizzJazz
Buzz
86
Fizz
Jazz
89
FizzBuzz
91
Jazz
Fizz
94
Buzz
FizzJazz
97
98
Fizz
JazzBuzz

Saya juga tidak bisa sepenuhnya menerapkan prinsip KERING, karena ada dua forloop. Mungkin ada cara yang lebih cerdas untuk melakukannya!


Saya mungkin juga bisa menggunakan tuple dalam forpernyataan pertama . Akan diperbarui ketika saya bisa!
Nepho

Oke, jadi ia bekerja dengan dua variabel dalam loop yang sama, tapi saya beralih dari 111 byte ke 145: gist.github.com/Neph0/ddc7a5ad04aa083d44af5cab3f90550f
Nepho

1

Pergi

FizzJazzBuzzer bersamaan

package main

import (
    "fmt"
    "sort"
    "sync"
)

var hooks map[int]string = map[int]string{
    3: "Fizz",
    4: "Jazz",
    5: "Buzz"}

type candidate struct {
    num     int
    message string
}

func FizzJazzBuzzer(hooks map[int]string) (chan<- int, *sync.WaitGroup) {
    var wg *sync.WaitGroup = new(sync.WaitGroup)
    final := func(c chan candidate) {
        for i := range c {
            if i.message == "" {
                fmt.Println(i.num)
            } else {
                fmt.Println(i.message)
            }
            wg.Done()
        }
    }
    prev := make(chan candidate)
    go final(prev)
    var keys []int = make([]int, 0)
    for k := range hooks {
        keys = append(keys, k)
    }
    sort.Sort(sort.Reverse(sort.IntSlice(keys)))
    for _, mod := range keys {
        c := make(chan candidate)
        s := hooks[mod]
        go (func(in chan candidate, next chan candidate, mod int, s string) {
            for i := range in {
                if i.num%mod == 0 {
                    i.message += s
                }
                next <- i
            }
        })(c, prev, mod, s)
        prev = c
    }
    in := make(chan int)
    go (func(in <-chan int) {
        for i := range in {
            prev <- candidate{i, ""}
        }
    })(in)
    return in, wg
}

func main() {
    in, wg := FizzJazzBuzzer(hooks)
    for i := 1; i < 20; i++ {
        wg.Add(1)
        in <- i
    }
    wg.Wait()
}

Cobalah di sini: http://play.golang.org/p/lxaZF_oOax

Ini hanya menggunakan satu modulus per nomor yang dicentang dan dapat secara sewenang-wenang diperluas ke sejumlah, baik ... nomor.

Anda hanya perlu membuat perubahan 3 tempat berbeda untuk memperpanjang ini, di hookspeta, FizzJazzBuzzernama fungsi dan, tentu saja, panggilan ke FizzJazzBuzzerfungsi.


1

R

Ini menciptakan fungsi yang memungkinkan pengguna untuk menentukan pasangan kata dan pembagi (dan opsional jumlah maksimum, dengan 100 sebagai default). Fungsi menciptakan vektor dari 1 ke angka maksimum, kemudian mengganti angka apa pun di posisi "fizzbuzz" dengan "", dan akhirnya menempelkan setiap kata pada posisi yang diinginkan. Fungsi memerintahkan daftar dari angka terendah ke tertinggi sehingga angka terendah akan selalu menjadi bagian pertama dari "fizzbuzz". Posisi dihitung menggunakan sequntuk membuat vektor mulai dari angka yang diberikan dan meningkat dalam peningkatan dari angka itu sampai jumlah yang diinginkan tercapai.

fizzbuzzer = function(max.num=100, ...){

input = list(...)
input = input[order(unlist(input))] #reorder input list by number
words = names(input)

#vector containing the result
output = seq_len(max.num)

#remove numbers at positions to contain a "fizzbuzz"
sapply(input, function(x) output[seq(x, max.num, x)] <<- "")

#add words at required points
sapply(seq_len(length(input)), function(i) output[seq(input[[i]], max.num, input[[i]])] <<- paste0(output[seq(input[[i]], max.num, input[[i]])], words[i]))

return(output)
}    

Saya tidak berpikir itu sangat indah, tetapi mudah digunakan kembali dengan parameter yang berbeda.

contoh penggunaan:

fizzbuzzer(fizz=3, buzz=5)
fizzbuzzer(fizz=3, buzz=5, jazz=4)
fizzbuzzer(max.num=10000, golf=10, stack=100, code=1, exchange=1000)

Output dari fizzbuzzer(fizz=3, buzz=5)adalah:

[1] "1"        "2"        "fizz"     "4"        "buzz"     "fizz"    
[7] "7"        "8"        "fizz"     "buzz"     "11"       "fizz"    
[13] "13"       "14"       "fizzbuzz" "16"       "17"       "fizz"    
[19] "19"       "buzz"     "fizz"     "22"       "23"       "fizz"    
[25] "buzz"     "26"       "fizz"     "28"       "29"       "fizzbuzz"
[31] "31"       "32"       "fizz"     "34"       "buzz"     "fizz"    
[37] "37"       "38"       "fizz"     "buzz"     "41"       "fizz"    
[43] "43"       "44"       "fizzbuzz" "46"       "47"       "fizz"    
[49] "49"       "buzz"     "fizz"     "52"       "53"       "fizz"    
[55] "buzz"     "56"       "fizz"     "58"       "59"       "fizzbuzz"
[61] "61"       "62"       "fizz"     "64"       "buzz"     "fizz"    
[67] "67"       "68"       "fizz"     "buzz"     "71"       "fizz"    
[73] "73"       "74"       "fizzbuzz" "76"       "77"       "fizz"    
[79] "79"       "buzz"     "fizz"     "82"       "83"       "fizz"    
[85] "buzz"     "86"       "fizz"     "88"       "89"       "fizzbuzz"
[91] "91"       "92"       "fizz"     "94"       "buzz"     "fizz"    
[97] "97"       "98"       "fizz"     "buzz"    

(angka dalam tanda kurung siku adalah indeks dari vektor output fungsi)


1

Haskell

Tidak ada aritmatika modular yang digunakan, kecuali dalam menghitung multiple paling umum untuk menghindari pengulangan pekerjaan yang tidak perlu. Rangkaian string hanya perlu dilakukan 60 kali, apa pun yang kita tetapkan batas atas.

-- Don't repeat `transpose` from `Data.List`
import Data.List (transpose)

-- The desired problem
lst = [(3, "Fizz"), (4, "Jazz"), (5, "Buzz")]

-- Map a function over both sides of a tuple.
-- We could also get this from importing Bifunctor (bimap), bit it's not in the core libraries
bimap f g (x, y) = (f x, g y)

-- Make infinite lists with the word occuring only once every n items, starting with the first
fizzify = map (cycle . uncurry take . bimap id (:repeat ""))

-- Reorganize the lists so there's a single infinite list, smash the words together, and drop the first set.
fjb = tail . map concat . transpose . fizzify

-- The following two functions avoid repeating work building the lists
-- Computes the least common multiple of a list of numbers
lcms = foldr lcm 1

-- fjbLcm is just a more efficient version of fjb; they can be used interchangably
fjbLcm lst = cycle . take (lcms . map fst $ lst) . fjb $ lst

-- show the number if there aren't any words
result = zipWith (\x y -> if null x then show y else x) (fjbLcm lst) [1..100]

main = print result

Mengganti fjbLcmdengan fjbmelakukan hal yang persis sama, tanpa aritmatika yang digunakan kecuali dalam [1..100]dan take.


Ini pada dasarnya sama dengan solusi Nimi , yang tidak saya perhatikan sebelumnya.
Cirdec

1

Python2

Pembaruan: Versi baru tidak menggunakan operasi mod atau divisi apa pun.

word_dict = {3: 'Fizz', 4: 'Jazz', 5: 'Buzz'}

def fizz_jazz_buzz(n, d):
    counters = {k: k for k in d}
    for i in xrange(1, n + 1):
        u = ''
        for k in d:
            if counters[k] == i:
                u += d[k]
                counters[k] += k
        print u or i

fizz_jazz_buzz(100, word_dict)

Jika Anda ingin menambahkan kata lain ke dalam tes, cukup masukkan pasangan kunci / nilai ke dalam kamus word_dict:

word_dict[7] = 'Razz'
fizz_jazz_buzz(100, word_dict)

Jika Anda ingin menghilangkan sebuah kata, cukup hapus saja (gunakan del) atau aturlah ''.

del word_dict[3]
fizz_jazz_buzz(100, word_dict)

Lihat juga jawaban Python dari Gnibbler dan Jakube , yang diposting sebelum saya.


1

C #

Maintainability: Cukup tambahkan satu baris per elemen
I iterate atas setiap elemen dalam kamus, untuk memeriksa apakah itu pembagi angka saat ini, dan menambahkan ke string jika ya.
Setelah selesai, cetak string, kecuali itu masih nol (menggunakan operator penggabungan nol), dalam hal ini cetak nomor ditambah string kosong untuk menjadikannya string. (Saya bisa menggunakan toString, tapi saya rasa itu pilihan pribadi)

Dictionary<int, string> dict = new Dictionary<int, string>()
{
    {3, "Fizz"},
    {4, "Jazz"},
    {5, "Buzz"}
};
for (int i = 0; i < 100; i++)
{
    string msg = null;
    foreach (var pair in dict)
        if (i % pair.Key == 0)
            msg += pair.Value;
    Console.WriteLine(msg ?? i + "");
}
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.