Pesan Arecibo adalah pesan radio antarbintang 1974 yang membawa informasi dasar tentang kemanusiaan dan Bumi yang dikirim ke gugus bintang globular M13 dengan harapan bahwa intelijen ekstraterestrial dapat menerima dan menguraikannya ... Pesan itu terdiri dari 1.679 digit biner, sekitar 210 byte ...
Nomor 1.679 dipilih karena merupakan semiprime (produk dari dua bilangan prima), yang disusun empat persegi panjang menjadi 73 baris dengan 23 kolom. Pengaturan alternatif, 23 baris dengan 73 kolom, menghasilkan serangkaian karakter yang tidak dapat dipahami (seperti halnya semua format X / Y lainnya).
Ini adalah pesan dengan warna yang ditambahkan untuk menyorot bagian-bagian yang terpisah. Transmisi biner yang sebenarnya tidak membawa informasi warna.
Tugas Anda adalah menampilkan Pesan Arecibo dalam pengaturan 23x73 persis seperti yang ditunjukkan pada gambar. Format output ini dapat diterima:
- Teks, menggunakan satu karakter untuk satu dan lainnya untuk nol (menggunakan aturan biasa untuk pemisahan baris)
- Array 2D dari dua nilai yang berbeda
- Gambar 23x73 dengan dua warna berbeda
- Aan aliran terputus dari 1679 item dari dua nilai yang berbeda (yaitu salah satu format di atas, tetapi datar.)
- Bilangan bulat 1679-bit. Tunjukkan urutan bit dan byte (endianness) dalam solusi Anda.
Untuk kenyamanan Anda, berikut adalah versi yang dapat disalin dari copy (juga merupakan contoh output dalam format teks):
00000010101010000000000
00101000001010000000100
10001000100010010110010
10101010101010100100100
00000000000000000000000
00000000000011000000000
00000000001101000000000
00000000001101000000000
00000000010101000000000
00000000011111000000000
00000000000000000000000
11000011100011000011000
10000000000000110010000
11010001100011000011010
11111011111011111011111
00000000000000000000000
00010000000000000000010
00000000000000000000000
00001000000000000000001
11111000000000000011111
00000000000000000000000
11000011000011100011000
10000000100000000010000
11010000110001110011010
11111011111011111011111
00000000000000000000000
00010000001100000000010
00000000001100000000000
00001000001100000000001
11111000001100000011111
00000000001100000000000
00100000000100000000100
00010000001100000001000
00001100001100000010000
00000011000100001100000
00000000001100110000000
00000011000100001100000
00001100001100000010000
00010000001000000001000
00100000001100000000100
01000000001100000000100
01000000000100000001000
00100000001000000010000
00010000000000001100000
00001100000000110000000
00100011101011000000000
00100000001000000000000
00100000111110000000000
00100001011101001011011
00000010011100100111111
10111000011100000110111
00000000010100000111011
00100000010100000111111
00100000010100000110000
00100000110110000000000
00000000000000000000000
00111000001000000000000
00111010100010101010101
00111000000000101010100
00000000000000101000000
00000000111110000000000
00000011111111100000000
00001110000000111000000
00011000000000001100000
00110100000000010110000
01100110000000110011000
01000101000001010001000
01000100100010010001000
00000100010100010000000
00000100001000010000000
00000100000000010000000
00000001001010000000000
01111001111101001111000
Jika bahasa Anda, karena alasan tertentu, memiliki builtin untuk Pesan Arecibo, Anda tidak boleh menggunakan builtin itu.
Semoga berhasil!
UPDATE: Saya menerima jawaban 05AB1E karena itu adalah yang pertama lebih pendek dari pesan aslinya. Jangan biarkan itu menghalangi Anda dari solusi baru.
UPDATE 2019-09-09: Jawaban yang diterima dipindahkan ke jawaban 05AB1E yang baru, karena jawaban itu menggantikan jawaban 05AB1E sebelumnya. Poin yang sama berlaku sebagai pembaruan sebelumnya; solusi baru masih diterima.
sumber
Jawaban:
05AB1E , 182 byte
Cobalah online! (kegunaan
1
untuk 0 dan0
untuk 1, sebagaimana diizinkan oleh pertanyaan).Cobalah online! (5 byte lebih lama,
0
untuk 0 dan1
untuk 1, menambahkan baris baru untuk dibaca).Sebagian besar kode adalah konstanta integer basis-255 N, sisanya adalah dekoder Sistem Angka Asimetris , menggunakan probabilitas hardcoded sebesar 75% / 25% (frekuensi aktual 0 adalah 76,35%, yang sangat dekat dengan 75% sehingga hanya akan menghemat 1,2 bit dalam payload, sedangkan 75% yang bagus dan bulat memungkinkan kita menghemat beberapa byte dalam decoder).
Inilah encoder ANS yang menghasilkan konstanta: Coba online!
sumber
05AB1E ,
215210200 byteDisimpan 15 byte berkat Magic Octopus Guci
Cobalah online! atau dengan pemformatan tambahan
String trotoar base-255 yang dikodekan dengan kemunculan
0000
diganti oleh2
.sumber
0000
dengan2
9 byte lebih. - pastebin.com/aZ6tHxjx untuk 201Java,
688 678 590 379361 byteMengembalikan string.
-10 byte dengan mengembalikan aliran mentah (jawaban lama)
-88 byte dengan menggunakan basis 10 angka (terima kasih @ceilingcat!)
-211 byte (saya tahu itu bisa golf!) Dengan menggunakan basis-36 yang dikodekan BigInteger (terima kasih @JollyJoker !)
-18 byte dengan menggunakan integer yang dienkode yang berbeda (terima kasih lagi @JollyJoker)
Cobalah secara online!
Penjelasan:
sumber
Jelly , 213 byte
Cobalah online!
Saya bermain-main dengan pengkodean Huffman, tetapi peningkatan dalam ukuran data lebih besar daripada kode tambahan. Dengan demikian, ini hanyalah versi disandikan basis-250 dari output yang diinginkan. Keluaran terdiri dari bilangan bulat yang bila diterjemahkan sebagai basis bijektif 2 akan menghasilkan daftar 1D dari 1s dan 2s. Terima kasih @Emigna karena menunjukkan perubahan aturan.
Cobalah online - dengan decoding lebih lanjut untuk menunjukkan keluaran!
Jika pengkodean biner yang lebih konvensional lebih disukai, di sini adalah salah satu yang mengkodekan representasi integer dari pesan biner terbalik. Bit integer yang paling signifikan mewakili awal pesan.
sumber
Brainfuck,
236020081938 byteCobalah online!
Saya mungkin akan golf ini lebih jauh segera.
sumber
Deadfish ~ ,
111510881084 bytesCobalah online!
Jika seseorang memiliki kesabaran untuk bermain golf lebih jauh, saya salut sebelumnya. : P
-27 byte dengan mencetak 10 dan 100 di tempat-tempat yang berlaku.
-4 byte dengan mencetak tiga 1000s dan satu 1001 pada baris 3
sumber
Piet , 1763 codels
Menghasilkan aliran 0s dan 1s (tanpa jeda baris).
Ukuran codel 1:
Ukuran codel 4, untuk lebih mudah dilihat:
Penjelasan
Catatan
Program mengikuti jalur spiral, searah jarum jam dari kiri atas ke tengah. Blok hitam yang tersebar yang secara kasar mengikuti diagonal adalah kontrol aliran. Inilah jejak dari NPiet .
Saya sudah mengerjakan ini sejak hari tantangan ini naik, tetapi butuh sedikit waktu untuk memasukkan pesan "tertulis" ke dalam gambar! Saya menulis loop terakhir dan nilai sentinel pertama, dan kemudian membangun pesan dari pusat ke luar. (Karena Piet selalu memulai eksekusi dari kiri atas, saya berharap harus mengocok dan memutar gambar untuk menghindari ruang kosong yang berlebih, tapi itu pas sekali!)
Fakta menyenangkan: Pengkodean run-length di Piet tidak (dengan sendirinya) menghemat ruang. Dibutuhkan n kode dari satu warna untuk mendorong nilai n ke tumpukan, atau n kode dari berbagai warna untuk mendorong banyak 1 ke tumpukan. Jadi itu adalah jumlah kode yang sama. Tetapi angka yang lebih besar dari RLE memberi Anda berarti Anda dapat menggunakan trik aritmatika (misalnya alih-alih mendorong 9, Anda dapat menekan 3, menggandakan, dan mengalikan) untuk mengurangi jumlah codel, dan blok berbentuk lucu untuk mengisi ruang kosong yang tersedia.
Saya tidak yakin tentang bagaimana cara menghitung skor untuk entri Piet. Saya menemukan beberapa yang tampaknya menghitung semua kode, dan yang lain secara eksplisit hanya menghitung yang digunakan secara aktif. Saya hanya menghitung mereka semua; mengabaikan kode putih (bahkan yang tidak pernah diprogram oleh program) tampaknya sama dengan mengabaikan spasi putih dalam bahasa pemrograman yang lebih umum.
Oh, dan saya baru saja (dua jam setelah posting) menyadari bahwa saya membuang-buang waktu terakhir untuk mengerjakan ini. Saya ingin memotong baris dan kolom terakhir yang hampir sepenuhnya putih, jadi saya mengaduk-aduk banyak hal ... termasuk blok kontrol aliran hitam. Tetapi tepi gambar berfungsi sama dengan hitam! Jika saya hanya ingat itu, saya tidak perlu menghabiskan begitu banyak waktu untuk memikirkan seluk-beluk DP dan CC ...
sumber
C # (Visual C # Interactive Compiler) ,
366332329319 byteGanti semua contoh
␀
dengan\0
untuk menguji.Cobalah online!
C # (Visual C # Interactive Compiler) , 305 byte, 210 karakter
Sama dengan di atas, ganti dengan
␀
dengan\0
untuk menguji. Output sebagaiIEnumerable<string>
.Cobalah online! (Atas perkenan Jo King)
sumber
++
dalam12-i++%2
adalah nop (setidaknya, itu bekerja untuk saya ketika saya dihapus)Perl 6 , 368 byte
Cobalah online!
String panjang adalah pesan sebagai nomor basis-36 tunggal (dengan awalan 1 bit untuk mempertahankan nol terkemuka) yang kemudian dikonversi kembali ke biner dan dicetak 23 bit sekaligus.
sumber
>>.say
dan&{S/.//}
menyimpan byte. Sudahkah Anda berpikir tentang menggunakan basis yang berbeda?Bahasa Wolfram (Mathematica) , 383 byte
Cobalah online!
sumber
Node.js , 333 byte
Mengembalikan string biner sebanyak 1.679 karakter.
Cobalah online! (dengan output yang diformat)
JavaScript (ES8), 413 byte
Mengembalikan string biner sebanyak 1.679 karakter.
Cobalah online! (dengan output yang diformat)
sumber
Bubblegum,
275236 byteCobalah online!
sumber
bash + alat GNU, 351 byte
TIO
sumber
MathGolf ,
223220 byteCobalah online!
Penjelasan
sumber
L/n
ke footer, jadi sebenarnya 220 byte. Bisakah lebih banyak byte disimpan dengan mem-porting jawaban 05AB1E / Java (menggunakan bilangan bulat terkompresi ini , mengonversinya menjadi basis-3, dan mengganti semua2
s dengan0000
s)?2
ke peta mana♫░╞
? EDIT: Sudahlah. Saya melihat Anda tidak memiliki basis Konversi Basis (kecuali untuk biner / heksadesimal) untuk dikonversi ke basis-3?+
ke footer jugaPerl 5 , 460 byte
Cobalah online!
sumber
Python 2 , 336 byte
Cobalah online!
Mencetak serangkaian byte
sumber
Java (OpenJDK 8) , 364 byte
Cobalah online!
Penjelasan: Pertama kali
n->new java.math.BigInteger(str,36).toString(2)
, hanya mengubah angka radix 36 menjadi biner, tetapi itu membutuhkan sembilan karakter tambahan untuk memimpin nol. Kemudian, saya mendapat gagasan untuk melakukan enkode run-length beberapa nol sebagai dua. Panjang empat nol tampaknya meminimalkan panjang radix 36, jadin->new java.math.BigInteger(str,36).toString(3).replaceAll("2","0000")
Lihat diskusi di bawah jawaban ini untuk perbaikan nol nol terkemuka oleh @KevinCruijssen
sumber
[Python 2] , 345 byte
Saya menyandikan panjang string 0s sebagai byte mulai dari chr (31). Kemudian saya menyandikan 10101 yang tersisa sebagai angka biner mulai dari chr (70) hingga chr (126). String biner yang tidak cocok dipecah menjadi beberapa bagian yang lebih kecil.
Sunting: Dikurangi menjadi 326 byte. Terima kasih, Jo King
Sunting: Memperbaiki bug dalam program pembuat kode
Edit: Edit Terakhir
sumber
o
ke variabel.Zsh , 577 byte
coba online !!
Digunakan logika penyandian khusus. String
S
adalah 421 karakter, mungkin bisa dikompresi lebih banyak. Hurufa-w
mewakili berulang0
s. Angka1-9
mewakili pengulangan1
s. Suratx y z
mewakili10 100 1000
masing-masing.Mungkin saya harus mencoba byte-pair encoding atau Ascii85 .
sumber
Bash ,
702697 byteCobalah online!
sumber
Ruby , 362 byte
Bilangan bulat ditulis pada basis 36. Pasti ada cara yang lebih efisien untuk mengompresi bilangan bulat, misalnya dengan
zlib
ataubase64
.Cobalah online!
sumber
[C ++ (VC ++) (tetapi diuji dengan gcc juga)], 585 byte
Cobalah online!
Versi ungolfed (tidak memiliki jeda setelah elemen 1679 dan berjalan hingga 1680):
sebagai Penjelasan: saya menggabungkan 73 garis output sampel yang diberikan kepada satu garis panjang. saya menyandikannya dalam heksadesimal di mana urutan bit adalah msbfirst (menggunakan program ini https://github.com/Marc-Bender/longBinaryStreamToHex/releases/download/addedErrorCode-4/longBinaryStreamToHex.exe ) saya mempersingkat Output dari sekitar 70 Digit heksadesimal dengan menggunakan huruf 'G' - 'Z' sebagai tanda untuk mengulang Digit terakhir untuk jumlah waktu tertentu (Z = 2 kali lebih banyak, Y = 3 kali lebih banyak ...) sisanya harus cukup jelas untuk Kode-Pegolf . menyalahgunakan preprocessor untuk mempersingkat loop, menyalahgunakan
,
Operator dan sejenisnya.Format Output adalah aliran tanpa gangguan dari nilai 1679 0/1
sumber
Perl 6 , 348 byte
Berdasarkan solusi Java Benjamin Urquhart .
Menggunakan aliran langsung 0 dan 1 karakter. Tautan di bawah ini memiliki beberapa kode untuk mencetak output.
Cobalah online!
sumber
Tcl , 366 byte
Cobalah online!
sumber
C ++ (dengan pustaka multi-presisi Gnu), 359 byte
Ini menghasilkan string sebagai satu baris. Ini menggunakan '1' untuk 0, dan '0' untuk 1: /
Ini hanya membaca string yang tertanam sebagai basis 62, dan mencetaknya sebagai basis 2.
Gunakan
g++ -g arecibo.cpp -lgmp -lgmpxx
untuk mengkompilasi dan menautkansumber
class_mpz
mpz_class
Perl 6 , 276 byte
Cobalah online!
Output sebagai rangkaian 1679 0s dan 1s. Anda dapat memilikinya di baris yang berbeda dengan menambahkan
.comb(23)>>
sebelumsay
.Penjelasan:
Saya mungkin dapat menyimpan byte dengan menggunakan output sebagai integer 1679 bit sebagai gantinya, atau membalikkan representasi bit.
sumber
C ++ (gcc) , 748 byte
Cobalah online!
Dengan mengganti substring yang paling sering digunakan dengan karakter baru hingga tidak layak lagi
sumber
Python 3 , 331 byte
Cobalah online!
sumber