Envie uma ligação cósmica


16

A chamada cósmica é uma mensagem enviada ao espaço em 1999 e 2003. É composta por 23 imagens bitmap monocromáticas de 127 * 127px, conforme detalhado aqui .

Sua missão é escrever um programa que exiba toda a mensagem 127 * 2921px, como um texto (feito de zeros, uns e quebras de linha) ou como uma imagem (desenhada na tela ou salva no disco). Haverá duas categorias de vencedores: uma para saída de texto e outra para saída de imagem.

Todos os truques são permitidos, exceto brechas comuns.

É permitido imprimir as 23 páginas separadamente.

É permitido escrever até 23 programas (como um para cada página) e somar seu tamanho para determinar sua pontuação.

É permitido usar até 23 arquivos binários junto com o (s) seu (s) programa (s). O peso deles é contado na sua pontuação.

O código mais curto (em bytes) vence.

Em 1 bit por pixel, a imagem contém 127 * 127 * 23/8 = 46370 bytes + 7 bits de dados. (aviso: não é permitido gerar um zero extra se você armazenar valores de pixel em 46371 bytes)

Nova linha / espaço à direita é permitida para a saída de texto.

A saída visual não pode conter nenhum pixel preto além dos pixels pretos da chamada cósmica. Ele pode ser desenhado em uma coluna (ordenada corretamente) ou dividido em 23 imagens, ou animado (como um gif), também ordenado corretamente.

Anexo: a saída de texto e a saída da imagem para reproduzir:

chamada cósmica


19
“É permitido escrever muitos programas (como um para cada página) e somar seu tamanho para determinar sua pontuação.” Isso é perigoso: o programa Jelly vazio é impresso 0, o programa Snails vazio é impresso 1e o programa GolfScript vazio imprime uma nova linha . Alguém pode encaminhar uma resposta, 0-byte, 373.888-programa :)
Lynn

Haha, ok, então eu vou limitar o número de programas para 23.
xem

Novas linhas / espaços à direita são permitidos?
Loovjo 13/06

Sim . . . . . .
xem

Podemos usar outro arquivo ou precisamos trabalhar apenas no arquivo de origem? Por exemplo. posso usar o IO para armazenar uma versão compactada e descompactá-la ou tudo precisa ser literal no código.
que você

Respostas:


18

GIF, 27386 bytes

Aqui estão as páginas da transmissão original divididas em quadros GIF individuais, que acabaram não sendo tão pequenos quanto 1 PNG de todos eles :(

GIF animado de chamada cósmica


7
Olá, e bem-vindo ao PPCG! Enquanto isso não vai ganhar , ainda é um bom post.
NoOneIsHere

Você hesitou? Pode economizar cerca de 300 bytes se você usar transparências adicionais nas transições.
Magic Octopus Urn

7

HTML, 16012b

Eu comprimi a imagem no PNG8, abri-a em um editor de texto, anexei

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

no final, e voilà:

Demonstração: http://xem.github.io/miniCosmicCall/


NB: anexar <img src=#>também funciona, mas deixa muito lixo visível, então prefiro não.


PS: por diversão, também coloquei a mensagem inteira em um único tweet executável (você pode copiá-lo e colá-lo em um console do navegador e a imagem aparece):

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


1
resposta mais curta + 1
Erik the Outgolfer

ainda não disse minha última palavra!
xem

Estou certo de que não consigo entender o que você pretendia dizer aqui.
Erik the Outgolfer

desculpe, eu queria dizer que eu estou tentando fazer algo ainda menor
xem

6

Python 2.7 - 10971 8077 bytes

atualizar:

  • LZMA, na verdade, por algum motivo, não funciona para mim, então voltei para Deflate.

  • Encontrei uma ferramenta on - line para compactar ainda mais o PNG (eles dizem que usam compressão com perda, mas a matriz permanece inalterada)

  • Joguei o __main__.pyroteiro um pouco mais ...
  • Descobri que estava omitindo uma etapa (extraindo os arquivos de dados do arquivo zip)
  • Link DL adicionado (veja abaixo)

A maioria dos algoritmos de compactação considera os dados como uma matriz unidimensional e, portanto, não pode capturar os caracteres bidimensionais repetidos exibidos na chamada cósmica (o IMO também dificulta a compreensão dos alienígenas: P).

Primeiro, selecionei cada caractere como uma matriz 7 * 5 e fiz uma lista de todos os caracteres únicos (101 se bem me lembro). Então eu iterava sobre a imagem e, quando um caractere era encontrado, a posição e o índice desse caractere (na lista de caracteres) eram registrados.

Essas posições podem ser representadas com um único int, no entanto, com mais de 2 K caracteres encontrados, e as posições que variam de 0-370966 (formato divmod) requerem até 3 bytes cada. No entanto, coletei as posições dos caracteres em ordem, então converti a posição absoluta em posição de deslocamento, tornando a maioria dos números menor que 1 byte. Codifiquei esta lista no utf-8 para explicar os poucos números maiores que 1 byte

Após gravar e remover todos os caracteres correspondentes, salvei o png com a compactação máxima. Em seguida, empacotei o script de reconstrução python (reverter o mesmo processo), o png, o modelo do chatacter e a lista de posições dos caracteres em um arquivo zip para aproveitar o fato de que o python pode usar uma pasta ou arquivo zip como argumento e começará a execução em qualquer arquivo no nível superior nomeado __main__.py. Eu brinquei um pouco com 7z para obter a melhor compactação, que acabou sendo LZMA com um ditado de 1M e palavras de 32 bits.

aqui está o script do decodificador (golfe, mas com comentários ainda)

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 para fazer o download do arquivo zip ...


Estou :) (e parabéns para esta pontuação!)
xem

@xem ... logo após postar, continuei mexendo com ele, e ele está quebrado rn (python me dando algum tipo de erro zlib ao carregar) também está no meu computador de trabalho. Vou colocar na segunda-feira se puder reverter para um estado de funcionamento. : P
Aaron

Eu sinto que poderia ser possível otimizar um equilíbrio entre a compactação png e quais caracteres eu codifiquei (menos usados) para economizar mais alguns bytes. #
Aaron Aaron

1
@xem eu adicionei um link dl ...
Aaron

Adoro a ideia de compressão 2D ... E a compressão 3D? (O empilhamento das imagens)
NonlinearFruit

3

Gzip bzip2 no shell, 20914 18965 bytes

Crie o arquivo de dados de saída com a saída de texto fornecida na pergunta bzip2e renomeie o arquivo para s. Isso permite:

bzcat s

para fazer o trabalho. Portanto, ele adiciona até 18958 bytes de dados e um comando de 7 bytes.


1
Eu acho que você pode salvar um par de k usando 'bzip2'!
Dom Hastings

@ DomHastings: Eu finalmente segui o seu conselho.
Julie Pelletier

Para mais pesquisas: Bubblegum e zopfli .
Digital Trauma

2

Pitão, 46381 bytes

Por razões óbvias, não pode ser publicado aqui.

jc.BC"<too long>"127

Amostra.

Colar pasta do hexdump do programa.


você codifica os bits 7 por 7 em caracteres latin-1, certo? Simples e agradável! :) Claro, estou procurando uma compressão muito melhor: p
xem

1
Sim, estou fazendo uma compressão melhor. Eu os codifiquei 8 por 8, a propósito.
Leaky Nun

A propósito, gostaria de saber como você conseguiu essa pontuação: 127 * 127 * 23/8 = cerca de 46371 bytes. Para onde foram os outros 355 bytes?
xem

Obrigado, corresponde exatamente agora. Você pode ver os 10 bytes extras no código acima ( jc.BC""127").
Leaky Nun

Como você lida com a parte extra? (toda a mensagem leva 46370 bytes + 7 bits Seu último byte pode produzir um zero a mais, o que não é uma saída válida.)
xem

2

Bash + binário WebP, 11 + 15330 = 15341 bytes

Como as regras afirmam isso:

Sua missão é escrever um programa que exiba a mensagem 127 * 2921px inteira ... ou como uma imagem (desenhada na tela ou salva em disco ).

É permitido usar até 23 arquivos binários junto com o (s) seu (s) programa (s). O peso deles é contado na sua pontuação.

e

Todos os truques são permitidos, exceto brechas comuns.

… Não pude resistir a postar algo estupidamente simples.

O programa está no bash e gera a imagem salvando-a no disco.
Ele usa 1 arquivo binário, que também é um arquivo de imagem (sim, WebP é um formato de imagem); portanto, o programa pode fazer apenas ... fazer uma cópia desse arquivo.

Então, o código (11 bytes):

cp b a.webp

Supondo que o binário complementar seja nomeado "b", o código grava o arquivo de imagem no disco com a extensão correta ("a.webp").

Vejo poucas razões para carregar o binário, porque ele é criado trivialmente executando

cwebp -z 9 <downloaded input file> b

produz o arquivo com 15330 bytes. Se alguém quiser, posso carregá-lo em algum lugar.

NB: -zopção em cwebpativa o modo de compactação sem perdas. 9é a força de compressão (máx).


Autor OP gosta disto
xem

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.