Kirim panggilan kosmik

16

The panggilan kosmik adalah pesan yang dikirim ke ruang angkasa pada tahun 1999 dan 2003. Ini terbuat dari 23 127 * 127px gambar monokrom bitmap, seperti yang dijelaskan di sini .

Misi Anda adalah menulis sebuah program yang menampilkan seluruh pesan 127 * 2921px, baik sebagai teks (terbuat dari nol, satu, dan jeda baris) atau sebagai gambar (digambar di layar atau disimpan di disk). Akan ada dua kategori pemenang: satu untuk output teks dan satu untuk output gambar.

Semua trik diizinkan, kecuali celah umum.

Diperbolehkan untuk mengeluarkan 23 halaman secara terpisah.

Anda diperbolehkan menulis hingga 23 program (seperti, satu untuk setiap halaman) dan menjumlahkan ukurannya untuk menentukan skor Anda.

Diperbolehkan untuk menggunakan hingga 23 file biner di samping program Anda. Berat badan mereka dihitung dalam skor Anda.

Kode terpendek (dalam byte) menang.

Pada 1 bit per pixel, gambar berisi 127 * 127 * 23/8 = 46370 byte + 7 bit data. (peringatan: itu tidak diizinkan untuk menghasilkan nol tambahan jika Anda menyimpan nilai piksel ke 46371 byte)

Mengejar baris baru / ruang diizinkan untuk output teks.

Output visual tidak dapat mengandung piksel hitam selain piksel hitam dari panggilan kosmik. Itu dapat digambar dalam satu kolom (dipesan dengan benar), atau dibagi dalam 23 gambar, atau animasi (seperti gif), juga dipesan dengan benar.

Lampiran: output teks , dan output gambar untuk mereproduksi:

panggilan kosmik

xem
sumber
19
“Anda diperbolehkan menulis banyak program (seperti, satu untuk setiap halaman) dan menjumlahkan ukurannya untuk menentukan skor Anda.” Ini berbahaya: cetakan program Jelly0 yang kosong , cetakan program Siput yang kosong 1, dan program GolfScript yang kosong mencetak baris baru . Seseorang mungkin mengirimkan 0 byte, 373888 jawaban program :)
Lynn
Haha, oke, jadi saya akan membatasi jumlah program menjadi 23.
xem
Apakah membuntuti baris baru / spasi diizinkan?
Loovjo
ya . . . . .
xem
Bisakah kita menggunakan file lain atau kita harus bekerja hanya pada file sumber? Misalnya. dapatkah saya menggunakan IO untuk menyimpan versi terkompresi dan kemudian mendekompresnya atau apakah semuanya perlu literal dalam kode.
Semoga bermanfaat

Jawaban:

18

GIF, 27386 byte

Berikut adalah halaman-halaman dari transmisi asli yang diiris menjadi frame GIF individu, ternyata tidak sekecil 1 PNG dari semuanya :(

panggilan kosmik animasi GIF

innovati
sumber
7
Halo, dan selamat datang di PPCG! Meskipun ini tidak akan menang , itu masih posting yang bagus.
NoOneIsHere
Apakah Anda gentar? Mungkin dapat menyimpan 300bytes atau lebih jika Anda menggunakan transparansi aditif pada transisi.
Magic Octopus Urn
7

HTML, 16012b

Saya mengompres gambar di PNG8, membukanya di editor teks, ditambahkan

<svg onload="document.body.innerHTML='<img src=#>'">

di akhir, dan voila:

Demo: http://xem.github.io/miniCosmicCall/


NB: menambahkan saja <img src=#> berfungsi juga tetapi memungkinkan banyak sampah terlihat, jadi saya lebih suka tidak melakukannya.


PS: untuk bersenang-senang, saya juga memasukkan seluruh pesan dalam satu tweet yang dapat dieksekusi (Anda dapat menyalin-menempelnya di konsol browser dan gambar muncul):

https://twitter.com/MaximeEuziere/status/742440423994580992

xem
sumber
1
jawaban terpendek +1
Erik the Outgolfer
belum mengatakan kata terakhir saya!
xem
Saya yakin saya tidak mengerti apa yang ingin Anda katakan di sini.
Erik the Outgolfer
maaf, maksudku aku mencoba membuat sesuatu yang lebih kecil
xem
6

Python 2.7 - 10971 8077 byte

memperbarui:

  • LZMA sebenarnya karena suatu alasan tidak bekerja untuk saya, jadi saya kembali ke Deflate.

  • Saya menemukan alat online untuk mengompresi PNG lebih jauh (mereka mengatakan mereka menggunakan kompresi lossy, tetapi array tetap tidak berubah)

  • Saya memainkan __main__.pyskrip sedikit lebih ...
  • Saya menemukan saya sedang menghilangkan langkah (mengekstraksi file data dari arsip zip)
  • Menambahkan tautan DL (lihat bawah)

Sebagian besar algoritma kompresi melihat data sebagai array 1 dimensi, dan karenanya tidak dapat menangkap karakter 2 dimensi berulang yang ditampilkan dalam panggilan kosmik (IMO juga membuat lebih sulit bagi alien untuk memahami juga: P).

Pertama, saya memilih setiap karakter sebagai array 7 * 5 dan membuat daftar semua karakter unik (101 jika saya ingat). Kemudian saya mengulangi gambar, dan ketika sebuah karakter ditemukan, posisi dan indeks karakter itu (dalam daftar karakter) direkam.

Posisi-posisi itu dapat diwakili dengan satu int, namun dengan lebih dari 2K karakter ditemukan, dan posisi mulai dari 0-370966 (bentuk divmod) masing-masing memerlukan hingga 3 byte. Saya mengumpulkan posisi karakter secara berurutan, jadi saya malah mengubah posisi absolut menjadi posisi offset, membuat sebagian besar angka kurang dari 1 byte. Saya menyandikan daftar ini dalam utf-8 untuk menjelaskan beberapa angka yang lebih besar dari 1 byte

Setelah merekam dan menghapus semua karakter yang cocok, saya menyimpan png dengan kompresi maksimum. Saya kemudian mengemas skrip rekonstruksi python (membalikkan proses yang sama), png, template chatacter, dan daftar posisi karakter semuanya ke dalam file zip untuk mengambil keuntungan dari fakta bahwa python dapat mengambil folder atau file zip sebagai argumen, dan itu akan memulai eksekusi pada file apa pun di tingkat atas bernama__main__.py . Saya bermain-main dengan 7z sedikit untuk mendapatkan kompresi terbaik, yang ternyata menjadi LZMA dengan dict 1M dan kata-kata 32bit.

inilah skrip dekoder (golf tetapi dengan komentar masih)

import sys,zipfile as z
z.ZipFile(sys.argv[0]).extractall() #extract data files from zip to cwd
from numpy import*
o=open  #next line overwrites open, which I need
from PIL.Image import*
from scipy.ndimage import*
a=imread('p')[:,:,0]/255 #read image file
a[:2414,0]=0 #draw vertical borders
a[2541:,0]=0
a[2412:,-1]=0
a[:2287,-1]=0
for x in range(0,2921,127):a[[x,x+126],:]=0 #draw horizontal borders
with o('c','rb') as f:t=f.read();C=[int(i)for c in t for i in'{0:08b}'.format(ord(c))] #read character template file and convert to list of bytes
C=array(C[:-1]).reshape([101,7,5]) #re-slice (extra 0 appended to make even number of bytes) and re-shape
with o('l','rb') as f:L=array([ord(x)for x in f.read().decode('utf_8')]).reshape([2158,2]) #read decode and reshape positional list
p=0 #relative position accumulator
for e in L:p+=e[0];x,y=p%127,p/127;a[y:y+7,x:x+5]=C[e[1]] #divmod for x,y position and paste character template onto array at position
i=fromarray(a*255)
i.show()
tautan untuk mengunduh file zip ...

Harun
sumber
Saya :) (dan selamat untuk skor ini!)
xem
@ xem ... tak lama setelah memposting, saya terus mengacaukannya, dan itu rusak rn (python memberi saya semacam kesalahan zlib saat memuat) juga ada di komputer kerja saya. Saya akan memasangnya Senin jika saya bisa mengembalikannya ke kondisi kerja. : P
Aaron
Saya merasa seperti itu bisa dimungkinkan untuk mengoptimalkan keseimbangan antara kompresi png dan karakter yang saya encode (yang digunakan lebih sedikit) untuk menyimpan beberapa byte lagi ..
Aaron
1
@ xem Saya menambahkan tautan dl ...
Aaron
Suka ide kompresi 2D ... Bagaimana dengan kompresi 3D? (Menyusun gambar)
NonlinearFruit
3

Gzip bzip2 di shell, 20914 18965 byte

Buat file data output dengan output teks yang disediakan dalam pertanyaan, bzip2dan ganti nama file s. Ini kemudian memungkinkan:

bzcat s

untuk melakukan pekerjaan itu. Jadi itu menambahkan hingga 18.958 byte data dan perintah 7 byte.

Julie Pelletier
sumber
1
Saya pikir Anda dapat menyimpan beberapa k menggunakan 'bzip2' sebagai gantinya!
Dom Hastings
@HomHastings: Saya akhirnya mengikuti saran Anda.
Julie Pelletier
Untuk penelitian lebih lanjut: Bubblegum dan zopfli .
Digital Trauma
2

Pyth, 46381 byte

Untuk alasan yang jelas itu tidak dapat diposting di sini.

jc.BC"<too long>"127

Sampel.

Pastebin dari hexdump program.

bocor Nun
sumber
Anda menyandikan bit 7 dengan 7 dalam karakter latin-1, bukan? Sederhana dan menyenangkan! :) Tentu saja, saya mencari kompresi yang lebih baik: p
xem
1
Ya, saya melakukan kompresi yang lebih baik. Saya menyandikan mereka 8 oleh 8, omong-omong.
Leaky Nun
Omong-omong, saya bertanya-tanya bagaimana Anda mendapat skor ini: 127 * 127 * 23/8 = sekitar 46371 byte. Kemana 355 byte lainnya pergi?
xem
Terima kasih, persis sama dengan sekarang. Anda benar-benar dapat melihat 10 byte tambahan dalam kode di atas ( jc.BC""127").
Leaky Nun
Bagaimana Anda menangani bit ekstra? (seluruh pesan membutuhkan 46370 byte + 7 bit. Byte terakhir Anda dapat menghasilkan nol tambahan, yang bukan merupakan output yang valid)
xem
2

Bash + WebP binary, 11 + 15330 = 15341 byte

Seperti aturan nyatakan ini:

Misi Anda adalah menulis program yang menampilkan seluruh pesan 127 * 2921px ... atau sebagai gambar (digambar di layar atau disimpan di disk ).

Diperbolehkan untuk menggunakan hingga 23 file biner di samping program Anda. Berat badan mereka dihitung dalam skor Anda.

dan

Semua trik diizinkan, kecuali celah umum.

… Saya tidak bisa menahan diri untuk memposting sesuatu yang bodoh sederhana.

Program ini dalam bash dan menghasilkan gambar dengan menyimpannya di disk.
Ini menggunakan 1 file biner, yang juga merupakan file gambar (ya WebP adalah format gambar), oleh karena itu program ini dapat melakukan sesedikit ... membuat salinan file itu.

Jadi, kodenya (11 byte):

cp b a.webp

Dengan asumsi biner pengiring bernama "b", kode menulis file gambar ke disk dengan ekstensi yang benar ("a.webp").

Saya melihat sedikit alasan untuk mengunggah biner, karena itu dibuat sepele dengan menjalankan

cwebp -z 9 <downloaded input file> b

ini menghasilkan file dengan 15330 byte. Jika ada yang mau, saya bisa mengunggahnya di suatu tempat.

NB: -zopsi dalam cwebpmengaktifkan mode kompresi lossless. 9adalah kekuatan kompresi (maks).

Nama tampilan
sumber
Penulis OP menyukai ini
xem
1

Python 3, 64513 byte

Gunakan hanya ASCII!

http://pastebin.com/PMLb4Xti

Versi lama, 64529 byte: http://pastebin.com/nteYkUtM

TuxCrafting
sumber
import lzma,base64,os
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Terima kasih!
TuxCrafting
1
@Mego, saya pikir itu tidak perlu, mengingat itu terlalu panjang. Biarkan orang yang memberikan komentar memutuskan.
Rɪᴋᴇʀ