Envía una llamada cósmica


16

La llamada cósmica es un mensaje enviado al espacio en 1999 y 2003. Está compuesto por 23 imágenes de mapa de bits monocromas de 127 * 127px, como se detalla aquí .

Su misión es escribir un programa que muestre el mensaje completo de 127 * 2921px, ya sea como texto (hecho de ceros, unos y saltos de línea) o como una imagen (dibujada en la pantalla o guardada en el disco). Habrá dos categorías de ganadores: una para salida de texto y otra para salida de imagen.

Todos los trucos están permitidos, excepto las lagunas comunes.

Se permite imprimir las 23 páginas por separado.

Está permitido escribir hasta 23 programas (como uno para cada página) y sumar su tamaño para determinar su puntaje.

Está permitido usar hasta 23 archivos binarios junto con su (s) programa (s). Su peso se cuenta en su puntaje.

El código más corto (en byte) gana.

A 1 bit por píxel, la imagen contiene 127 * 127 * 23/8 = 46370 bytes + 7 bits de datos. (advertencia: no está permitido generar un cero adicional si almacena valores de píxeles en 46371 bytes)

Se permite una nueva línea / espacio final para la salida de texto.

La salida visual no puede contener ningún píxel negro además de los píxeles negros de la llamada cósmica. Se puede dibujar en una columna (ordenada correctamente), o dividirse en 23 imágenes, o animada (como un gif), también ordenada correctamente.

Adjunto: la salida de texto y la salida de imagen para reproducir:

llamada cósmica


19
"Está permitido escribir muchos programas (como uno para cada página) y sumar su tamaño para determinar su puntaje". Esto es peligroso: se imprime el programa Jelly vacío , se imprime 0el programa Snails vacío 1y el programa GolfScript vacío imprime una nueva línea . Alguien podría enviar una respuesta de 0 bytes y 373888 programas :)
Lynn

Jaja, está bien, así que
limitaré

¿Se permiten nuevas líneas / espacios al final?
Loovjo

sip . . . . .
xem

¿Podemos usar otro archivo o tenemos que trabajar únicamente en el archivo fuente? P.ej. ¿Puedo usar IO para almacenar una versión comprimida y luego descomprimirla o todo debe ser literal en el código?
HopefulHelpful

Respuestas:


18

GIF, 27386 bytes

Aquí están las páginas de la transmisión original divididas en marcos GIF individuales, resultó que no era tan pequeño como 1 PNG de todas ellas :(

llamada cósmica GIF animado


77
Hola y bienvenidos a PPCG! Si bien esto no va a ganar , sigue siendo una buena publicación.
NoOneIsHere

¿Te dudaste? Puede ahorrar aproximadamente 300bytes si usa transparencias aditivas en las transiciones.
Magic Octopus Urn

7

HTML, 16012b

Comprimí la imagen en PNG8, la abrí en un editor de texto, agregué

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

al final, y voilà:

Demostración: http://xem.github.io/miniCosmicCall/


NB: agregar <img src=#>también funciona, pero deja visible mucha basura, así que prefiero no hacerlo.


PD: por diversión, también puse el mensaje completo en un solo tweet ejecutable (puede copiarlo y pegarlo en la consola del navegador y aparece la imagen):

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


1
respuesta más corta + 1
Erik the Outgolfer

No dije mi última palabra todavía!
xem

Estoy seguro de que no puedo entender lo que pretendías decir aquí.
Erik the Outgolfer

lo siento, quise decir que estoy tratando de hacer algo aún más pequeño
xem

6

Python 2.7 - 10971 8077 bytes

actualizar:

  • LZMA en realidad por alguna razón no funciona para mí, así que volví a Deflate.

  • Encontré una herramienta en línea para comprimir el PNG aún más (dicen que usan compresión con pérdida, pero la matriz permanece sin cambios)

  • Golfé el __main__.pyguión un poco más ...
  • Descubrí que estaba omitiendo un paso (extraer los archivos de datos del archivo zip)
  • Enlace DL agregado (ver abajo)

La mayoría de los algoritmos de compresión consideran los datos como una matriz unidimensional y, por lo tanto, no pueden capturar los caracteres bidimensionales repetidos que se muestran en la llamada cósmica (la OMI también dificulta que los extraterrestres entiendan también: P).

Primero, seleccioné cada personaje como una matriz de 7 * 5 e hice una lista de todos los personajes únicos (101 si recuerdo). Luego iteré sobre la imagen, y cuando se encontró un personaje, se registraron la posición y el índice de ese personaje (en la lista de personajes).

Esas posiciones podrían representarse con un solo int, sin embargo, con más de 2K caracteres encontrados, y las posiciones que van desde 0-370966 (forma divmod) requieren hasta 3 bytes cada una. Sin embargo, recolecté las posiciones de los caracteres en orden, por lo que convertí la posición absoluta en posición de desplazamiento, haciendo que la mayoría de los números sean menos de 1 byte. Codifiqué esta lista en utf-8 para tener en cuenta los pocos números que eran mayores que 1 byte

Después de grabar y eliminar todos los caracteres coincidentes, guardé el png con la máxima compresión. Luego empaqueté el script de reconstrucción de Python (revertir el mismo proceso), png, la plantilla de caracteres y la lista de posición de caracteres en un archivo zip para aprovechar el hecho de que Python puede tomar una carpeta o archivo zip como argumento, y comenzará la ejecución en cualquier archivo en el nivel superior nombrado __main__.py. Jugué un poco con 7z para obtener la mejor compresión, que resultó ser LZMA con palabras de 1M y 32 bits.

Aquí está la secuencia de comandos del decodificador (golfed pero con comentarios todavía)

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()
enlace para descargar el archivo zip ...


Estoy :) (¡y felicidades por este puntaje!)
xem

@xem ... poco después de publicar, seguí jugando con él, y está roto rn (python me da algún tipo de error zlib al cargar) también está en mi computadora de trabajo. Lo pondré el lunes aunque pueda volverlo a un estado de funcionamiento. : P
Aaron

Siento que podría ser posible optimizar el equilibrio entre la compresión png y los caracteres que codifico (los menos utilizados) para ahorrar unos pocos bytes más ...
Aaron

1
@xem Agregué un enlace dl ...
Aaron

Me encanta la idea de la compresión 2D ... ¿Qué pasa con la compresión 3D? (Apilando las imágenes)
NonlinearFruit

3

Gzip bzip2 en el shell, 20914 18965 bytes

Haga el archivo de datos de salida con la salida de texto proporcionada en la pregunta, bzip2y cambie el nombre del archivo a s. Esto luego permite:

bzcat s

para hacer el trabajo. Por lo tanto, agrega hasta 18958 bytes de datos y un comando de 7 bytes.


1
¡Creo que puedes ahorrar un par de k usando 'bzip2' en su lugar!
Dom Hastings

@DomHastings: Finalmente seguí tu consejo.
Julie Pelletier

Para futuras investigaciones: Bubblegum y zopfli .
Trauma digital

2

Pyth, 46381 bytes

Por razones obvias no se puede publicar aquí.

jc.BC"<too long>"127

Muestra.

Pastebin de hexdump del programa.


codificas los bits 7 por 7 en caracteres latin-1, ¿verdad? Simple y agradable! :) Por supuesto, estoy buscando una compresión mucho mejor: p
xem

1
Sí, estoy haciendo una mejor compresión. Los codifiqué 8 por 8, por cierto.
Leaky Nun

Por cierto, me pregunto cómo obtuviste este puntaje: 127 * 127 * 23/8 = aproximadamente 46371 bytes. ¿A dónde fueron los otros 355 bytes?
xem

Gracias, coincide exactamente ahora. De hecho, puede ver los 10 bytes adicionales en el código anterior ( jc.BC""127").
Leaky Nun

¿Cómo manejas el bit extra? (el mensaje completo toma 46370 bytes + 7 bits. Su último byte puede producir un cero adicional, que no es una salida válida)
xem

2

Bash + binario WebP, 11 + 15330 = 15341 bytes

Como las reglas establecen esto:

Su misión es escribir un programa que muestre el mensaje completo de 127 * 2921px ... o como una imagen (dibujada en la pantalla o guardada en el disco ).

Está permitido usar hasta 23 archivos binarios junto con sus programas. Su peso se cuenta en su puntaje.

y

Todos los trucos están permitidos, excepto las lagunas comunes.

... No pude resistirme a publicar algo estúpidamente simple.

El programa está en bash y genera la imagen guardándola en el disco.
Utiliza 1 archivo binario, que también es un archivo de imagen (sí, WebP es un formato de imagen), por lo tanto, el programa puede hacer tan poco como ... hacer una copia de ese archivo.

Entonces, el código (11 bytes):

cp b a.webp

Suponiendo que el binario complementario se llama "b", el código escribe el archivo de imagen en el disco con la extensión correcta ("a.webp").

Veo pocas razones para cargar el binario, porque se crea trivialmente ejecutando

cwebp -z 9 <downloaded input file> b

produce el archivo con 15330 bytes. Si alguien quiere, puedo subirlo a alguna parte.

Nota: la -zopción cwebpactiva el modo de compresión sin pérdida. 9es la resistencia a la compresión (max).


Al autor de OP le gusta esto
xem

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.