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.