Envoyez un appel cosmique

16

L' appel cosmique est un message envoyé dans l'espace en 1999 et 2003. Il est composé de 23 images bitmap monochromes 127 * 127px, comme détaillé ici .

Votre mission est d'écrire un programme qui affiche l'intégralité du message 127 * 2921px, soit sous forme de texte (composé de zéros, de uns et de sauts de ligne) ou sous forme d'image (dessinée à l'écran ou enregistrée sur disque). Il y aura deux catégories de gagnants: un pour la sortie texte et l'autre pour la sortie image.

Toutes les astuces sont autorisées, à l'exception des failles communes.

Il est permis de produire les 23 pages séparément.

Il est permis d'écrire jusqu'à 23 programmes (comme, un pour chaque page) et de additionner leur taille pour déterminer votre score.

Il est autorisé d'utiliser jusqu'à 23 fichiers binaires aux côtés de vos programmes. Leur poids est compté dans votre score.

Le code le plus court (en octets) gagne.

À 1 bit par pixel, l'image contient 127 * 127 * 23/8 = 46370 octets + 7 bits de données. (avertissement: il n'est pas autorisé de générer un zéro supplémentaire si vous stockez des valeurs de pixels dans 46371 octets)

Un retour à la ligne / espace est autorisé pour la sortie de texte.

La sortie visuelle ne peut contenir aucun pixel noir en plus des pixels noirs de l'appel cosmique. Il peut être dessiné dans une colonne (ordonnée correctement), ou divisé en 23 images, ou animé (comme un gif), également ordonné correctement.

Pièce jointe: la sortie texte et la sortie image à reproduire:

appel cosmique

xem
la source
19
«Il est permis d'écrire de nombreux programmes (comme, un pour chaque page) et de additionner leur taille pour déterminer votre score.» C'est dangereux: le programme Jelly vide s'imprime 0, le programme Snails vide imprime 1et le programme GolfScript vide imprime une nouvelle ligne . Quelqu'un peut soumettre une réponse de 0 octet, programme 373888 :)
Lynn
Haha, d'accord, je vais donc limiter le nombre de programmes à 23.
xem
Les sauts de ligne / espaces sont-ils autorisés?
Loovjo
oui. . . . . .
xem
Pouvons-nous utiliser un autre fichier ou devons-nous travailler uniquement sur le fichier source? Par exemple. puis-je utiliser IO pour stocker une version compressée puis la décompresser ou tout doit être un littéral dans le code.
Espérons que le

Réponses:

18

GIF, 27386 octets

Voici les pages de la transmission d'origine découpées en images GIF individuelles, il s'est avéré qu'elles n'étaient pas aussi petites que 1 PNG de toutes :(

cosmic call animated GIF

innovati
la source
7
Bonjour et bienvenue chez PPCG! Bien que cela ne va pas gagner , c'est toujours un bon post.
NoOneIsHere
Avez-vous hésité? Peut être en mesure d'économiser environ 300 octets si vous utilisez des transparents additifs sur les transitions.
Magic Octopus Urn
7

HTML, 16012b

J'ai compressé l'image en PNG8, l'ai ouverte dans un éditeur de texte, ajoutée

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

à la fin, et voilà:

Démo: http://xem.github.io/miniCosmicCall/


NB: l'ajout <img src=#>fonctionne aussi mais il laisse beaucoup de déchets visibles, donc je préfère ne pas le faire.


PS: pour le plaisir, j'ai également mis l'intégralité du message dans un seul tweet exécutable (vous pouvez le copier-coller dans une console de navigateur et l'image apparaît):

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

xem
la source
1
réponse la plus courte + 1
Erik the Outgolfer
n'a pas encore dit mon dernier mot!
xem
Je suis certain que je ne comprends pas ce que vous aviez l'intention de dire ici.
Erik the Outgolfer
désolé, je voulais dire que j'essaye de faire quelque chose d'encore plus petit
xem
6

Python 2.7 - 10971 8077 octets

mise à jour:

  • LZMA en fait pour une raison quelconque ne fonctionne pas pour moi, donc je suis retourné à Deflate.

  • J'ai trouvé un outil en ligne pour compresser encore plus le PNG (ils disent qu'ils utilisent la compression avec perte, mais le tableau reste inchangé)

  • J'ai joué au __main__.pyscript un peu plus ...
  • J'ai trouvé que j'omettais une étape (extraire les fichiers de données de l'archive zip)
  • Lien DL ajouté (voir en bas)

La plupart des algorithmes de compression considèrent les données comme un tableau unidimensionnel et ne peuvent donc pas capturer les caractères répétitifs bidimensionnels affichés dans l'appel cosmique (IMO rend également plus difficile la compréhension des extraterrestres: P).

Tout d'abord, j'ai sélectionné chaque caractère comme un tableau 7 * 5 et fait une liste de tous les caractères uniques (101 si je me souviens). Ensuite, j'ai parcouru l'image, et lorsqu'un caractère a été trouvé, la position et l'index de ce caractère (dans la liste des caractères) ont été enregistrés.

Ces positions pourraient être représentées avec un seul int, mais avec plus de 2K caractères trouvés, et les positions allant de 0 à 370966 (forme divmod) nécessitent jusqu'à 3 octets chacune. Cependant, j'ai collecté les positions des caractères dans l'ordre, donc j'ai plutôt converti la position absolue en position décalée, ce qui rend la plupart des nombres inférieurs à 1 octet. J'ai encodé cette liste en utf-8 pour tenir compte des quelques nombres supérieurs à 1 octet

Après avoir enregistré et supprimé tous les caractères correspondants, j'ai enregistré le png avec une compression maximale. J'ai ensuite empaqueté le script de reconstruction python (inverser le même processus), le png, le modèle chatacter et la liste de position des caractères dans un fichier zip pour profiter du fait que python peut prendre un dossier ou un fichier zip comme argument, et il commencera son exécution dans n'importe quel fichier du niveau supérieur nommé__main__.py . J'ai joué un peu avec 7z pour obtenir la meilleure compression, qui s'est avérée être LZMA avec un dict 1M et des mots 32 bits.

voici le script du décodeur (joué au golf mais avec des commentaires quand même)

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()
lien à télécharger pour le fichier zip ...

Aaron
la source
Je suis :) (et bravo pour cette partition!)
xem
@xem ... peu de temps après la publication, j'ai continué à jouer avec, et il est cassé rn (python me donnant une sorte d'erreur zlib à la charge) et il est également sur mon ordinateur de travail. Je le mettrai en place lundi si je peux le remettre en état de fonctionnement. : P
Aaron
J'ai l'impression qu'il pourrait être possible d'optimiser l'équilibre entre la compression png et les caractères que j'encode (ceux moins utilisés) pour économiser quelques octets de plus ..
Aaron
1
@xem J'ai ajouté un lien dl ...
Aaron
J'adore l'idée de la compression 2D ... Et la compression 3D? (Empilement des images)
NonlinearFruit
3

Gzip bzip2 dans le shell, 20914 18965 octets

Faites le fichier de données de sortie avec la sortie de texte fournie dans la question, bzip2et renommez le fichier en s. Cela permet alors:

bzcat s

pour faire le travail. Il ajoute donc jusqu'à 18958 octets de données et une commande de 7 octets.

Julie Pelletier
la source
1
Je pense que vous pouvez enregistrer quelques k en utilisant «bzip2» à la place!
Dom Hastings
@DomHastings: J'ai finalement suivi vos conseils.
Julie Pelletier
Pour de plus amples recherches: Bubblegum et zopfli .
Digital Trauma
2

Pyth, 46381 octets

Pour des raisons évidentes, il ne peut pas être affiché ici.

jc.BC"<too long>"127

Échantillon.

Pastebin de hexdump du programme.

Leaky Nun
la source
vous encodez les bits 7 par 7 en caractères latin-1, non? Simple et sympa! :) Bien sûr, je recherche une bien meilleure compression: p
xem
1
Oui, je fais une meilleure compression. Je les ai encodés 8 par 8, soit dit en passant.
Leaky Nun
Au fait, je me demande comment vous avez obtenu ce score: 127 * 127 * 23/8 = environ 46371 octets. Où sont passés les 355 autres octets?
xem
Merci, cela correspond exactement maintenant. Vous pouvez réellement voir les 10 octets supplémentaires dans le code ci-dessus ( jc.BC""127").
Leaky Nun
Comment gérez-vous le bit supplémentaire? (le message entier prend 46370 octets + 7 bits. Votre dernier octet peut produire un zéro supplémentaire, ce qui n'est pas une sortie valide)
xem
2

Bash + WebP binaire, 11 + 15330 = 15341 octets

Comme le stipulent les règles:

Votre mission est d'écrire un programme qui affiche l'intégralité du message 127 * 2921px… ou sous forme d'image (dessinée à l'écran ou enregistrée sur disque ).

Il est autorisé d'utiliser jusqu'à 23 fichiers binaires aux côtés de vos programmes. Leur poids est compté dans votre score.

et

Toutes les astuces sont autorisées, à l'exception des failles communes.

… Je n'ai pas pu résister à poster quelque chose de bêtement simple.

Le programme est en bash et il sort l'image en l'enregistrant sur le disque.
Il utilise 1 fichier binaire, qui se trouve également être un fichier image (ouais WebP est un format d'image), donc le programme peut faire aussi peu que… faire une copie de ce fichier.

Donc, le code (11 octets):

cp b a.webp

En supposant que le binaire compagnon est nommé "b", le code écrit le fichier image sur le disque avec l'extension correcte ("a.webp").

Je vois peu de raisons de télécharger le binaire, car il est créé de manière triviale en exécutant

cwebp -z 9 <downloaded input file> b

il produit le fichier avec 15330 octets. Si quelqu'un le veut, je peux le télécharger quelque part.

NB: l' -zoption en cwebpactive le mode de compression sans perte. 9est la résistance à la compression (max).

Afficher un nom
la source
L'auteur de l'OP aime ça
xem
1

Python 3, 64513 octets

Utilisez uniquement ASCII!

http://pastebin.com/PMLb4Xti

Ancienne version, 64529 octets: http://pastebin.com/nteYkUtM

TuxCrafting
la source
import lzma,base64,os
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Merci!
TuxCrafting
1
@Mego, je ne pense pas que ce soit nécessaire, étant donné que c'est ridiculement long. Laissez le vote des commentaires décider.
Rɪᴋᴇʀ