Invia una chiamata cosmica


16

La chiamata cosmica è un messaggio inviato nello spazio nel 1999 e nel 2003. È composto da 23 immagini bitmap monocromatiche 127 * 127px, come dettagliato qui .

La tua missione è quella di scrivere un programma che visualizzi l'intero messaggio 127 * 2921px, sia come testo (fatto di zeri, uno e interruzioni di riga) o come immagine (disegnata sullo schermo o salvata sul disco). Ci saranno due categorie di vincitori: una per l'output del testo e una per l'output dell'immagine.

Sono ammessi tutti i trucchi, tranne le scappatoie comuni.

È consentito stampare separatamente le 23 pagine.

È consentito scrivere fino a 23 programmi (come, uno per ogni pagina) e sommare le loro dimensioni per determinare il tuo punteggio.

È consentito utilizzare fino a 23 file binari insieme ai programmi. Il loro peso è conteggiato nel tuo punteggio.

Vince il codice più breve (in byte).

A 1 bit per pixel, l'immagine contiene 127 * 127 * 23/8 = 46370 byte + 7 bit di dati. (avviso: non è consentito generare uno zero aggiuntivo se si memorizzano i valori dei pixel in 46371 byte)

La nuova riga / spazio finale è consentita per l'output del testo.

L'output visivo non può contenere pixel neri oltre ai pixel neri della chiamata cosmica. Può essere disegnato in una colonna (ordinato correttamente) o diviso in 23 immagini o animato (come una gif), anch'esso ordinato correttamente.

Allegato: l'output del testo e l'output dell'immagine da riprodurre:

chiamata cosmica


19
"È consentito scrivere molti programmi (come, uno per ogni pagina) e sommare le loro dimensioni per determinare il tuo punteggio." Questo è pericoloso: il programma Jelly vuoto stampa 0, il programma Snails vuoto stampa 1e il programma GolfScript vuoto stampa una nuova riga . Qualcuno potrebbe inviare una risposta da 0 byte, 373888 programma :)
Lynn,

Haha, okay, quindi limiterò il numero di programmi a 23.
xem

Sono consentite nuove linee / spazi finali?
Loovjo,

si . . . . .
xem,

Possiamo usare un altro file o dobbiamo lavorare esclusivamente sul file sorgente? Per esempio. posso usare IO per memorizzare una versione compressa e poi decomprimerla o fa tutto il necessario per essere letterale nel codice.
Speriamo utile

Risposte:


18

GIF, 27386 byte

Ecco le pagine della trasmissione originale suddivise in singoli frame GIF, si è rivelato non essere piccolo come 1 PNG di tutti :(

GIF animata chiamata cosmica


7
Ciao e benvenuto in PPCG! Anche se questo non vincerà , è comunque un buon post.
NoOneIsHere

Hai dithering? Potrebbe essere in grado di salvare circa 300 byte se si utilizzano lucidi additivi sulle transizioni.
Magic Octopus Urn

7

HTML, 16012b

Ho compresso l'immagine in PNG8, l'ho aperta in un editor di testo, ho aggiunto

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

alla fine, e voilà:

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


NB: l'aggiunta <img src=#>funziona anche ma rende visibili molti rifiuti, quindi preferisco non farlo.


PS: per divertimento, ho anche messo l'intero messaggio in un singolo tweet eseguibile (puoi copiarlo e incollarlo in una console del browser e appare l'immagine):

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


1
risposta più breve + 1
Erik the Outgolfer,

non ho ancora detto la mia ultima parola!
xem,

Sono certo di non capire cosa intendevi dire qui.
Erik the Outgolfer,

scusate, volevo dire che sto cercando di rendere qualcosa di ancora più piccolo
xem,

6

Python 2.7 - 10971 8077 byte

aggiornare:

  • LZMA in realtà per qualche motivo non funziona per me, quindi sono tornato a Deflate.

  • Ho trovato uno strumento online per comprimere ulteriormente il PNG (dicono che usano la compressione con perdita, ma l'array rimane invariato)

  • Ho giocato __main__.pyun po 'di più sulla sceneggiatura ...
  • Ho scoperto che stavo omettendo un passaggio (estrazione dei file di dati dall'archivio zip)
  • Aggiunto link DL (vedi in basso)

La maggior parte degli algoritmi di compressione considera i dati come un array monodimensionale e quindi non è in grado di catturare i caratteri bidimensionali ripetuti visualizzati nella chiamata cosmica (l'IMO rende anche più difficile la comprensione degli alieni: P).

Innanzitutto, ho selezionato ogni personaggio come un array 7 * 5 e ho creato un elenco di tutti i personaggi unici (101 se ricordo). Quindi ho ripetuto l'immagine e, quando è stato trovato un personaggio, sono stati registrati la posizione e l'indice di quel personaggio (nell'elenco dei personaggi).

Tali posizioni potrebbero essere rappresentate con un singolo int, tuttavia con più di 2K caratteri trovati e posizioni che vanno da 0-370966 (modulo divmod) richiedono fino a 3 byte ciascuno. Tuttavia, ho raccolto le posizioni dei caratteri in ordine, quindi ho convertito la posizione assoluta in posizione offset, rendendo la maggior parte dei numeri inferiore a 1 byte. Ho codificato questo elenco in utf-8 per tenere conto dei pochi numeri che erano maggiori di 1 byte

Dopo aver registrato e rimosso tutti i caratteri corrispondenti, ho salvato il png con la massima compressione. Ho quindi impacchettato lo script di ricostruzione di Python (invertire lo stesso processo), il png, il modello di chatacter e l'elenco delle posizioni dei personaggi in un file zip per sfruttare il fatto che python può prendere una cartella o un file zip come argomento, e inizierà l'esecuzione in qualsiasi file di livello superiore denominato __main__.py. Ho giocato un po 'con 7z per ottenere la migliore compressione, che si è rivelata LZMA con un dict 1M e parole a 32 bit.

ecco lo script del decodificatore (golf ma con commenti ancora)

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()
link per il download per il file zip ...


Sono :) (e complimenti per questo punteggio!)
xem

@xem ... poco dopo la pubblicazione, ho continuato a rovinarlo, ed è rotto rn (python mi dà una sorta di errore zlib al caricamento) anche sul mio computer di lavoro. Lo metterò lunedì anche se posso riportarlo a uno stato funzionante. : P
Aaron,

Sento che potrebbe essere possibile ottimizzare un equilibrio tra la compressione png e quali caratteri codifico (quelli meno usati) per salvare qualche byte in più ..
Aaron,

1
@xem Ho aggiunto un link dl ...
Aaron,

Adoro l'idea di compressione 2D ... E la compressione 3D? (Stacking the images)
NonlinearFruit

3

Gzip bzip2 nella shell, 20914 18965 byte

Crea il file di dati di output con l'output di testo fornito nella domanda bzip2e rinominalo in s. Questo quindi consente:

bzcat s

fare il lavoro. Quindi aggiunge fino a 18958 byte di dati e un comando di 7 byte.


1
Penso che puoi salvare un paio di k usando invece 'bzip2'!
Dom Hastings,

@DomHastings: finalmente ho seguito il tuo consiglio.
Julie Pelletier,

Per ulteriori ricerche: Bubblegum e zopfli .
Trauma digitale

2

Pyth, 46381 byte

Per ovvi motivi non può essere pubblicato qui.

jc.BC"<too long>"127

Campione.

Pastebin di hexdump del programma.


hai codificato i bit 7 per 7 in caratteri latini-1, giusto? Semplice e carino! :) Certo, sto cercando una compressione molto migliore: p
xem,

1
Sì, sto facendo una compressione migliore. A proposito, li ho codificati 8 per 8.
Leaky Nun,

A proposito, mi chiedo come hai ottenuto questo punteggio: 127 * 127 * 23/8 = circa 46371 byte. Dove sono andati gli altri 355 byte?
xem,

Grazie, ora corrisponde esattamente. Puoi effettivamente vedere i 10 byte extra nel codice sopra ( jc.BC""127").
Leaky Nun,

Come gestisci il bit in più? (l'intero messaggio richiede 46370 byte + 7 bit. L'ultimo byte può produrre uno zero aggiuntivo, che non è un output valido)
xem

2

Bash + WebP binario, 11 + 15330 = 15341 byte

Come stabilito dalle regole:

La tua missione è quella di scrivere un programma che visualizzi l'intero messaggio 127 * 2921px ... o come immagine (disegnata sullo schermo o salvata sul disco ).

È consentito utilizzare fino a 23 file binari insieme ai programmi. Il loro peso è conteggiato nel tuo punteggio.

e

Sono ammessi tutti i trucchi, tranne le scappatoie comuni.

... Non ho resistito a pubblicare qualcosa di stupidamente semplice.

Il programma è in bash e genera l'immagine salvandola su disco.
Utilizza 1 file binario, che è anche file di immagine (sì, WebP è un formato di immagine), quindi il programma può fare fino a ... fare una copia di quel file.

Quindi, il codice (11 byte):

cp b a.webp

Supponendo che il binario associato sia denominato "b", il codice scrive il file immagine sul disco con l'estensione corretta ("a.webp").

Vedo poche ragioni per caricare il binario, perché è banalmente creato eseguendo

cwebp -z 9 <downloaded input file> b

produce il file con 15330 byte. Se qualcuno lo desidera, posso caricarlo da qualche parte.

NB: l' -zopzione in cwebpattiva la modalità di compressione lossless. 9è la resistenza alla compressione (max).


Piace all'autore di OP
xem,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.