pengantar
Saya tidak terlalu tahu dari mana tren desis desis itu berasal. Mungkin hanya meme atau sesuatu, tetapi agak populer.
Tantangan
Tugas Anda hari ini adalah mengubah Fizz Buzz menjadi biner (0, 1), dan mengonversi biner itu menjadi teks. Barang yang cukup standar.
Bagaimana cara kerjanya?
FizzBuzzBuzzFizzBuzzFizzFizzFizz FizzBuzzBuzzFizzBuzzFizzFizzBuzz akan diterjemahkan menjadi 01101000 01101001 maka itu akan diterjemahkan menjadi "hai"
Kendala
- Input adalah Fizz Buzz dalam sudut pandang biner (lihat contoh di bawah.)
- Keluaran harus berupa teks.
- Anda dapat menganggap input FizzBuzz benar.
- Ini adalah kode-golf , byte terpendek menang.
Memasukkan
FizzBuzzBuzzFizzBuzzFizzFizz FizzBuzzBuzzFizzBuzzFizzFizzBuzz FizzFizzBuzzFizzFizzFizzFizzFizzBuzz
Keluaran
"Hai!"
Jawaban:
C, 59 byte
Angka ajaib, angka ajaib di mana-mana!
(Juga, C lebih pendek dari Python, JS, PHP, dan Ruby? Belum pernah terjadi!)
Ini adalah fungsi yang mengambil string sebagai input dan output ke STDOUT.
Panduan
Struktur dasarnya adalah:
Di sini, "barang-barang di dalam" adalah sekelompok kode diikuti oleh
,*s++
, di mana koma operater hanya mengembalikan nilai argumen kedua. Oleh karena itu, ini akan dijalankan melalui string dan diatur*s
ke setiap karakter, termasuk byte NUL yang tertinggal (karena postfix++
mengembalikan nilai sebelumnya), sebelum keluar.Mari kita lihat sisanya:
Mengupas bagian luar dan hubungan arus pendek
||
, ini dapat diperluasDari mana angka-angka ajaib ini berasal? Berikut adalah representasi biner dari semua karakter yang terlibat:
Pertama, kita perlu memisahkan ruang dan NUL dari karakter lainnya. Cara algoritme ini bekerja, ia menyimpan akumulator dari angka "saat ini", dan mencetaknya setiap kali mencapai ruang atau akhir string (yaitu
'\0'
). Dengan memperhatikan itu' '
dan'\0'
merupakan satu-satunya karakter yang tidak memiliki salah satu dari dua bit paling tidak signifikan yang ditetapkan, kita dapat bitwise DAN karakter dengan0b11
untuk mendapatkan nol jika karakter tersebut adalah spasi atau NUL dan bukan nol sebaliknya.Menggali lebih dalam, di cabang "jika" pertama, kita sekarang memiliki karakter yang salah satunya
FBizu
. Saya hanya memilih untuk memperbarui akumulator padaF
s danB
s, jadi saya perlu beberapa cara untuk menyaringizu
s. Secara mudah,F
danB
keduanya hanya memiliki set bit paling signifikan kedua, ketiga, atau ketujuh yang ditetapkan, dan semua angka lainnya memiliki setidaknya satu set bit lainnya. Faktanya, mereka semua memiliki bit pertama atau keempat yang paling tidak signifikan. Oleh karena itu, kita dapat bitwise AND dengan0b00001001
, yaitu 9, yang akan menghasilkan 0 untukF
danB
dan bukan nol sebaliknya.Setelah kita menentukan bahwa kita memiliki
F
atauB
, kita dapat memetakannya ke0
dan1
masing - masing dengan mengambil modulus 5 mereka, karenaF
ada70
danB
sedang66
. Lalu potongannyahanyalah cara pepatah golf
yang juga dapat dinyatakan sebagai
yang memasukkan bit baru pada posisi paling tidak signifikan dan menggeser yang lainnya lebih dari 1.
"Tapi tunggu!" Anda mungkin protes. "Setelah Anda mencetak
i
, kapan itu akan kembali ke 0?" Nah,putchar
melemparkan argumennya ke sebuahunsigned char
, yang kebetulan berukuran 8 bit. Itu berarti semuanya melewati bit ke-8 yang paling signifikan (yaitu sampah dari iterasi sebelumnya) dibuang, dan kita tidak perlu khawatir tentang hal itu.Terima kasih kepada @ETHproductions karena menyarankan untuk mengganti
57
dengan9
, menghemat satu byte!sumber
Jelly , 9 byte
Cobalah online!
sumber
Bash + coreutils,
6150 byte(-11 byte terima kasih kepada Doorknob !)
Cobalah online!
sumber
sed
dengantr FB 01|tr -d izu
untuk menghemat 11 byte.Python 3 ,
16910193918581 byteCobalah online!
Penjelasan:
sumber
lambda
fungsiJavaScript (ES6),
8079 bytesumber
.replace(/..zz/g,
,'0b'+
, dlln
memungkinkan untuk mencapai 79. Sayangnya, ini membutuhkan ruang tambahan untuk ditambahkan ke input. Karena itu agak mahal`${s} `
.Japt ,
26241917 bytesCobalah online!
Disimpan 2 byte berkat @Shaggy & 2 byte berkat @ETHproduksi
Penjelasan
sumber
})
denganÃ
. Pasti ada lebih banyak yang bisa diselamatkan dari itu, tetapi saya tidak bisa membuatnya berfungsi di ponsel saya.ò4...q n2
denganë4...n2
(ë4
melakukan hal yang sama sepertiò4
, kecuali mengembalikan hanya item pertama; anehnya, itu sepertinya tidak didokumentasikan)Ruby,
656360 byteIni adalah proc anonim yang mengambil input dan memberikan output sebagai string.
sumber
JavaScript (ES6),
95888581 byteCobalah
sumber
+
lebih pendek dariparseInt
+(m[0]<"F")
bisa disingkat menjadim<"F"|0
Perl 5, 33 Bytes
Mengganti 'F' dan 'B' di input dengan masing-masing 0 dan 1, dan menghapus karakter lainnya. Ini kemudian menggunakan
pack
fungsi perl untuk mengubah string bit ini menjadi karakter ASCII.sumber
-p0
opsi baris perintah (yang akan menghemat<>=~r
input Anda, dan memungkinkan Anda untuk menggunakan$_=
daripadaprint()
). Bergantung pada bagaimana Anda ingin menangani baris baru, Anda bahkan mungkin tidak memerlukannya0
. (Bahkan jika Anda ingin menghindari hukuman opsi baris perintah,say
lebih pendek dariprint
.)$_=pack'B*',y/FB -z/01/dr
untuk program Anda menurunkan skor Anda menjadi 26 byte.Python 2 ,
90838281 byte-1 byte terima kasih kepada benar-benar manusia
-1 byte terima kasih kepada Martmists
-1 byte terima kasih kepada Jonathan Frech
Cobalah online!
sumber
*1 for
menjadi*1for
*1
untuk mengkonversi dari boolean ke integer, Anda dapat menyimpan byte dengan menggunakan+
:(l<'D')*1for
can+(l<'D')for
.Ruang putih, 123 byte
Representasi yang terlihat:
Program tanpa gangguan:
Tidak ada yang aneh tentang implementasinya, satu-satunya golf sesungguhnya adalah penggunaan kembali temporari yang aneh dan juga tidak peduli dengan pertumbuhan stack yang tidak terbatas untuk membaca beberapa byte lagi.
sumber
Oktaf ,
595753 byteIni tidak berfungsi pada TIO, karena kotak alat komunikasi tidak diterapkan. Ini berfungsi dengan baik jika Anda menyalin-menempelkannya ke Octave-online . Itu bahkan tidak dekat dengan kode yang berfungsi di MATLAB.
Berhasil menyimpan dua byte dengan mentransposasi matriks setelah membaliknya, bukan sebaliknya.
Penjelasan:
Mari kita mulai di tengah
<code>
:Mari kita sebut vektor boolean (biner) yang dihasilkan untuk
t
.sumber
Perl 5, 28 byte + 4 byte untuk flags = 32 byte
Jalankan dengan bendera
-040pE
-040
mengatur pemisah rekaman ke spasi sehingga perl melihat setiap grup FizzBuzzes sebagai baris terpisah, lalu lompati garis-garis itu, mengubah F ke 0, B ke 1, menghapus semua yang lain, kemudian mengonversi ke biner dan dari sana ke ascii.sumber
Jelly , 9 byte
Cobalah online!
-3 byte terima kasih kepada Erik the Outgolfer
sumber
PHP, 67 Bytes
Terbatas hingga 8 huruf
Cobalah online!
PHP, 77 Bytes
Cobalah online!
sumber
Brain-Flak , 107 byte
Cobalah online!
+3 byte untuk
-c
bendera.Penjelasan
sumber
q / kdb +,
41403733 byteLarutan:
Contoh:
Penjelasan:
Pisahkan string input pada
" "
untuk memberikan daftarFizzBuzz...
, indeks yang berbeda ke masing-masing daftar ini pada karakter pertama (yaitu0 4 8 ... 28
). Kembalikan daftar boolean ditentukan oleh apakah masing-masing karakter"B"
(ASCII66
). Konversikan daftar ini ke basis 10, dan kemudian hasilkan menjadi string.sumber
Haskell, 72 byte
Cobalah online!
Bagaimana itu bekerja
sumber
JavaScript ES6 - 98 byte
terlalu banyak byte, tetapi setidaknya dapat dibaca
Didefinisikan sebagai fungsinya adalah 98 byte
uji:
Penjelasan:
Cocok dengan huruf F dan B dan apa pun sebagai Grup
adalah Fungsi yang menangkap grup, mengembalikan 0 untuk F dan 1 untuk B, atau ''
c adalah karakter yang cocok dengan
F dan B sekarang menjadi Parameter!
yang ke-3 . grup dinonaktifkan sebagai parameter
F dan B adalah
undefined
ketika kelompok ke-3 dicocokkanB adalah
undefined
ketika kelompok F cocok0100 yang dihasilkan .. string dll
dipotong dalam irisan 8 byte
dan diproses sebagai string biner 0b
sumber
s=>s.replace( ...
. Harap sertakan juga jumlah byte dalam Tajuk jawaban Anda.let
, fungsi anonim dapat diterima.shortC , 35 byte
Konversi dalam program ini:
A
-int main(int argc, char **argv){
W
-while(
@
-argv
P
-putchar(
);}
Didasarkan dari pada jawaban Doorknob.
sumber
APL (Dyalog Classic) , 17 byte
Penjelasan
Cobalah online!
sumber
05AB1E , 15 byte
Cobalah online!
sumber
Google Sheets, 94 byte
Saya tidak terbiasa dengan biner FizzBuzz tetapi tampaknya mereka digambarkan oleh spasi sehingga rumus ini bergantung pada itu. Logikanya cukup sederhana:
Fizz
dengan0
danBuzz
dengan1
sumber
Java 8,
117115 byteSaya ragu Anda dapat melakukan banyak penggantian regex mewah di Jawa seperti kebanyakan jawaban lainnya, terutama karena Anda tidak dapat melakukan apa pun dengan kelompok tangkapan yang ditangkap di Jawa-regex .. (Yaitu
"$1".charAt(...)
atau"$1".replace(...)
tidak mungkin misalnya.)Penjelasan:
Coba di sini.
sumber
J , 20 byte
Cobalah online!
sumber