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:
- KERING
- 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
sumber
Jawaban:
Versi paling indah, katamu? Lalu, mari kita coba yang ini di ...
Bahasa Pemrograman Shakespeare
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.
sumber
z
dan mengatur ulangnya sebelum setiap loop.> <> (Ikan)
> <> 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
1
dan 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 pindahv
ke bagian bergelombang.:3%?
memeriksa nomor modulo 3. Jika bukan nol, maka kita turunv
satu 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 untukJazz
danBuzz
.Ini berlanjut hingga baris ke-7, yang memeriksa nilai register
&
. Jika bukan nol, maka kita turun saja. Kalau tidak, kami mencetak nomor itu sendirin
sebelum turun.Akhirnya,
ao
(ingat, kita bergerak ke kiri sekarang!) Mencetak baris ASCII dan1+
menambah nomor, sebelum kita naik^
dan melakukan loop>
lagi.(Sekarang kita menunggu jawaban estetika Piet ...)
sumber
LOLCODE
Anggun? Nggak. Efisien? Tentu saja tidak. Indah? Nah, Anda tahu apa yang mereka katakan: kecantikan ada di mata yang melihatnya.
Beberapa penjelasan:
Program LOLCODE dimulai dengan
HAI
dan diakhiri denganKTHXBYE
.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:
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.
VISIBLE
mencetak ke stdout. Secara default, baris baru ditambahkan, tetapi menambahkan akan!
menekan baris baru.Persyaratan ditentukan sebagai berikut:
Kondisi harus berupa ekspresi yang mengevaluasi ke nilai boolean atau boolean. Dalam LOLCODE, tipe boolean dipanggil
TROOF
dan memiliki nilaiWIN
(true) danFAIL
(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.
sumber
Python3
sumber
Efficiency of division/modulus operations
(3, 4, 5)
. Ini digandakan tiga kali. Ini adalah satu-satunya jawaban teratas dengan hanya operator modulus tunggal.DRY
sebagai gantinya. Selanjutnya, jawaban ini disusun oleh OP.Piet
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!
sumber
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:
Dan sekarang program sebenarnya hanyalah
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:
Sekarang yang harus Anda lakukan adalah menambahkan
addFunction
panggilan lain dan menambahkan panggilan baru Anda**zz
ke baris terakhir.sumber
DoThe @@@ Time @@@ Warp @@@ Again /@ Range[100] // TableForm
JMP
ke kiri!Haskell
Kalian tidak menganggap serius KERING. Ada pola yang jelas yang dapat diperhitungkan dalam urutan "Fizz Jazz Buzz".
Kode ini juga mudah diperluas. Untuk mengatasi masalah "Fizz Jazz Buzz Tizz", yang perlu Anda lakukan adalah menambahkan
Ti
setelahBu
dalam string. Ini jauh lebih sedikit daripada apa yang dibutuhkan dalam solusi lain mana pun.sumber
fizzes = zip [3..] $ ((++ replicate 2 'z') <$> words "Fi Ja Bu") ++ ["Sausage"]
, atau kembali sajafizzes = zip [3..] $ words "Fizz Jazz Buzz Sausage"
.replicate 2 z
merentangkannya sedikit. . .Excel VBA
Ini mungkin terdengar bodoh, tapi ini adalah senapan sniper 2D!
sumber
Jawa
Jadi Java tidak benar-benar dianggap "indah" oleh kebanyakan orang, tapi itu subjektif subjektif jadi saya pergi dengan pedoman dalam pertanyaan:
Itu bukan untuk mengatakan bahwa algoritma secara keseluruhan adalah yang paling efisien (bukan), tapi saya pikir itu menyentuh poin yang baik.
sumber
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.
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 .
sumber
Dyalog APL
items
dapat diubah ke daftar angka yang berubah-ubahsumber
⎕ML
dan⎕IO
?1
, yang merupakan default.C #
Periksa mod, build string, cetak nomor jika kosong atau string jika tidak. Tidak ada pengulangan. Hanya perlu menambahkan kondisi & keluaran untuk persyaratan baru.
sumber
i
-%
-sesuatu kali, juga menambahkans
berkali-kali. (Banyak sintaks yang berulang juga, tapi itu mungkin salah C #).Python 2.7
Saya mencoba membuatnya puitis ...
Saya tidak pandai puisi cinta ...
Ini juga akan jauh lebih baik tanpa konstanta awal: P
sumber
TypeError: 'str' object is not callable
.Java dengan kelas
Algoritma:
Kelas-kelas:
sumber
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.
sumber
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 ...for
lingkaran (misalnya saat loop pengulangan)? Apakah Anda orang yang kodenya berhasil dikompilasi setiap kali? Jika Anda, saya punya berita tuhan untuk Anda ...j
nama untuk variabel lokal lingkaran baik-baik saja, tetapii
nama adalah praktek yang sangat buruk dan itu adalah sumber kesalahan Anda. Ini bukan murni tidak sengaja :)Python
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.
sumber
sorted(lst)
, mengapa tidak memasukkannya ke dalam urutan yang Anda butuhkan saat Anda mendefinisikannya?lst.sort()
Rubi
sumber
Haskell
Namun solusi lain tanpa pembagian atau modulus.
fjb
membuat daftar Fizzes, Jazzes, Buzzes dan / atau angka yang tak terbatas.take
berapapun jumlah yang Anda inginkan, seperti yang terlihat diprint100fjb
mana mencetak 100 elemen pertama.sumber
SQL (MySQL)
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.
sumber
SELECT @i:= (@i + 1) FROM mysql.help_relation, (SELECT @i:=0) v WHERE @i < 100;
SELECT DISTINCT help_keyword_id FROM mysql.help_relation WHERE help_keyword_id>0 AND help_keyword_id<=100
juga berfungsi. Tetapi jika 100 diubah menjadi 10.000, keduanya akan rusak.Rubi
sumber
JavaScript
Mungkin bukan cara yang paling efisien, tapi saya pikir itu sederhana dan cantik <3
Moar KERING dan buruk rupa: C
sumber
JavaScript
KERING ...;)
sumber
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 (
240232230 karakter):Tidak Terkumpul:
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:
sumber
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.
Contoh kecil ini menunjukkan slicing,
in
operator, 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.sumber
set(group[...])
dalam aturan?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!Keluaran:
Saya juga tidak bisa sepenuhnya menerapkan prinsip KERING, karena ada dua
for
loop. Mungkin ada cara yang lebih cerdas untuk melakukannya!sumber
for
pernyataan pertama . Akan diperbarui ketika saya bisa!Pergi
FizzJazzBuzzer bersamaan
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
hooks
peta,FizzJazzBuzzer
nama fungsi dan, tentu saja, panggilan keFizzJazzBuzzer
fungsi.sumber
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
seq
untuk membuat vektor mulai dari angka yang diberikan dan meningkat dalam peningkatan dari angka itu sampai jumlah yang diinginkan tercapai.Saya tidak berpikir itu sangat indah, tetapi mudah digunakan kembali dengan parameter yang berbeda.
contoh penggunaan:
Output dari
fizzbuzzer(fizz=3, buzz=5)
adalah:(angka dalam tanda kurung siku adalah indeks dari vektor output fungsi)
sumber
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.
Mengganti
fjbLcm
denganfjb
melakukan hal yang persis sama, tanpa aritmatika yang digunakan kecuali dalam[1..100]
dantake
.sumber
Python2
Pembaruan: Versi baru tidak menggunakan operasi mod atau divisi apa pun.
Jika Anda ingin menambahkan kata lain ke dalam tes, cukup masukkan pasangan kunci / nilai ke dalam kamus word_dict:
Jika Anda ingin menghilangkan sebuah kata, cukup hapus saja (gunakan
del
) atau aturlah''
.Lihat juga jawaban Python dari Gnibbler dan Jakube , yang diposting sebelum saya.
sumber
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)
sumber