Отправить космический звонок

16

Космический вызов является сообщение , отправленное в космос в 1999 и 2003 годах он сделан из 23 127 * 127px монохромные растровые изображения, как подробно здесь .

Ваша миссия - написать программу, которая отображает все сообщение размером 127 * 2921 пикселей в виде текста (из нулей, единиц и разрывов строк) или в виде изображения (нарисованного на экране или сохраненного на диске). Будут две категории победителей: одна для вывода текста и одна для вывода изображения.

Разрешены все хитрости, кроме обычных лазеек.

Разрешается выводить 23 страницы отдельно.

Разрешается писать до 23 программ (например, по одной на каждую страницу) и суммировать их размер, чтобы определить свой счет.

Разрешено использовать до 23 двоичных файлов вместе с вашей программой (программами). Их вес засчитывается в ваш счет.

Самый короткий код (в байтах) выигрывает.

При 1 бите на пиксель изображение содержит 127 * 127 * 23/8 = 46370 байт + 7 бит данных. (предупреждение: не допускается вывод дополнительного нуля, если вы сохраняете значения пикселей в 46371 байт)

Конечный символ новой строки / пробела разрешен для вывода текста.

Визуальный вывод не может содержать черный пиксель, кроме черных пикселей космического вызова. Он может быть нарисован в одном столбце (упорядочен правильно), разбит на 23 изображения или анимирован (как в формате gif), также упорядочен правильно.

Вложение: вывод текста и вывод изображения для воспроизведения:

космический зов

XEM
источник
19
«Это разрешено писать много программ (как, один для каждой страницы) и просуммировать их размер , чтобы определить ваш счет.» Это очень опасно: пустые Желе программы печатает 0, пустые Улитки программа печатает 1, и пустая GolfScript программа печатает строку , Кто-то может отправить 0-байтный ответ из 373888 программ :)
Линн
Хаха, хорошо, поэтому я ограничу количество программ до 23.
xem
Разрешены ли завершающие переводы строки / пробелы?
Loovjo
Ага . , , , , ,
xem
Можем ли мы использовать другой файл или мы должны работать исключительно с исходным файлом? Например. Могу ли я использовать IO для хранения сжатой версии, а затем распаковать ее или все должно быть буквально в коде.
Надеюсь,

Ответы:

18

GIF, 27386 байт

Вот страницы оригинальной передачи, разделенные на отдельные GIF-кадры, оказалось, что они не такие маленькие, как 1 PNG из них :(

космический звонок анимированный GIF

инноваци
источник
7
Здравствуйте и добро пожаловать в PPCG! Хотя это не победит , это все же хороший пост.
NoOneIsHere
Вы колебались? Может быть в состоянии сэкономить 300 байтов или около того, если вы используете аддитивные прозрачные пленки на переходах.
Волшебная Урна Осьминога
7

HTML, 16012b

Я сжал изображение в PNG8, открыл его в текстовом редакторе, добавил

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

в конце и вуаля:

Демо: http://xem.github.io/miniCosmicCall/


NB: добавление <img src=#>тоже работает, но оно позволяет увидеть много мусора, поэтому я предпочитаю этого не делать.


PS: для удовольствия я также поместил все сообщение в один исполняемый твит (вы можете скопировать и вставить его в консоль браузера, и изображение появится):

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

XEM
источник
1
кратчайший ответ + 1
Эрик Outgolfer
еще не сказал мое последнее слово!
xem
Я уверен, что не могу понять, что вы хотели сказать здесь.
Эрик Outgolfer
извините, я имел в виду, что я пытаюсь сделать что-то еще меньше
xem
6

Python 2.7 - 10971 8077 байт

Обновить:

  • LZMA на самом деле почему-то не работает для меня, поэтому я вернулся к Deflate.

  • Я нашел онлайн-инструмент для сжатия PNG еще больше (говорят, что они используют сжатие с потерями, но массив остается неизменным)

  • Я сыграл в гольф __main__.pyсценарий немного больше ...
  • Я обнаружил, что пропускаю шаг (извлечение файлов данных из zip-архива)
  • Добавлена ​​ссылка DL (см. Внизу)

Большинство алгоритмов сжатия рассматривают данные как одномерный массив и поэтому не могут захватывать повторяющиеся двумерные символы, отображаемые в космическом вызове (IMO также затрудняет понимание инопланетянами: P).

Сначала я выбрал каждый символ в виде массива 7 * 5 и составил список всех уникальных символов (101, если я помню). Затем я перебрал изображение, и когда символ был найден, положение и индекс этого символа (в списке символов) были записаны.

Эти позиции могут быть представлены одним int, однако с более чем 2K найденными символами, а позиции в диапазоне от 0-370966 (форма divmod) требуют до 3 байтов каждая. Однако я собрал позиции символов по порядку, поэтому вместо этого преобразовал абсолютную позицию в позицию смещения, сделав большинство чисел менее 1 байта. Я закодировал этот список в utf-8, чтобы учесть несколько чисел, которые были больше 1 байта

После записи и удаления всех совпавших символов я сохранил png с максимальным сжатием. Затем я упаковал скрипт реконструкции Python (обратный процесс), png, шаблон chatacter и список позиций персонажей в zip-файл, чтобы воспользоваться тем фактом, что python может использовать папку или zip-файл в качестве аргумента, и он начнет выполнение в любом файле верхнего уровня с именем __main__.py. Я немного поиграл с 7z, чтобы получить лучшее сжатие, которое оказалось LZMA с 1M dict и 32-битными словами.

вот сценарий декодера (игра в гольф, но с комментариями до сих пор)

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()
ссылка на скачивание для zip-файла ...

Аарон
источник
Я :) (и поздравляю с этим!)
xem
@xem ... вскоре после публикации я продолжал возиться с ним, и он сломался. (Python дает мне какую-то ошибку zlib при загрузке), и это на моем рабочем компьютере. Я подниму это в понедельник, если смогу вернуть его в рабочее состояние. : P
Аарон
Я чувствую, что можно было бы оптимизировать баланс между сжатием PNG и тем, какие символы я кодирую (менее используемые), чтобы сэкономить еще несколько байтов ..
Аарон
1
@ XEM Я добавил ссылку для DL ...
Аарон
Люблю идею 2D-сжатия ... А как насчет 3D-сжатия? (Укладка изображений)
Нелинейный
3

Gzip bzip2 в оболочке, 20914 18965 байт

Создайте файл выходных данных с текстом, предоставленным в вопросе, bzip2переименуйте файл в s. Это тогда позволяет:

bzcat s

сделать работу. Таким образом, он добавляет до 18958 байт данных и 7-байтовую команду.

Джули Пеллетье
источник
1
Я думаю, что вы можете сэкономить пару k, используя вместо этого 'bzip2'!
Дом Гастингс
@DomHastings: я наконец последовал твоему совету.
Джули Пеллетье
Для дальнейших исследований: Bubblegum и zopfli .
Цифровая травма
2

Pyth, 46381 байт

По понятным причинам это не может быть отправлено здесь.

jc.BC"<too long>"127

Образец.

Вставьте в hexdump программы.

Пропитанная монахиня
источник
Вы кодируете биты 7 на 7 в латинско-1 символах, верно? Просто и приятно! :) Конечно, я ищу гораздо лучшее сжатие: p
xem
1
Да, я делаю лучшее сжатие. Кстати, я их кодировал 8 на 8.
Утренняя монахиня
Кстати, мне интересно, как вы получили этот счет: 127 * 127 * 23/8 = около 46371 байт. Куда ушли 355 других байтов?
xem
Спасибо, это точно соответствует этому сейчас. На самом деле вы можете увидеть дополнительные 10 байтов в коде выше ( jc.BC""127").
Утренняя монахиня
Как вы справляетесь с лишним битом? (все сообщение занимает 46370 байт + 7 бит. Ваш последний байт может выдать дополнительный ноль, что не является допустимым выводом)
xem
2

Bash + WebP бинарный, 11 + 15330 = 15341 байт

Как говорится в правилах:

Ваша миссия - написать программу, которая отображает все сообщение размером 127 * 2921 пикселей… или в виде изображения (нарисованного на экране или сохраненного на диске ).

Разрешено использовать до 23 двоичных файлов вместе с вашей программой (программами). Их вес засчитывается в ваш счет.

и

Разрешены все хитрости, кроме обычных лазеек.

… Я не удержался, чтобы опубликовать что-то тупо простое.

Программа находится в bash и выводит изображение, сохраняя его на диске.
Он использует 1 двоичный файл, который также является файлом изображения (да, WebP - это формат изображения), поэтому программа может сделать всего лишь ... сделать копию этого файла.

Итак, код (11 байт):

cp b a.webp

Предполагая, что сопутствующий двоичный файл называется «b», код записывает файл образа на диск с правильным расширением («a.webp»).

Я не вижу особых причин загружать бинарный файл, потому что он тривиально создается

cwebp -z 9 <downloaded input file> b

это производит файл с 15330 байтами. Если кто-то хочет, я могу загрузить его куда-нибудь.

Примечание: -zопция cwebpактивирует режим сжатия без потерь. 9максимальная прочность на сжатие.

Показать имя
источник
ОП автору это нравится
xem
1

Python 3, 64513 байт

Используйте только ASCII!

http://pastebin.com/PMLb4Xti

Старая версия, 64529 байт: http://pastebin.com/nteYkUtM

TuxCrafting
источник
import lzma,base64,os
Эрик Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Спасибо!
TuxCrafting
1
@ Мего, я не думаю, что это необходимо, учитывая, что это смехотворно долго. Пусть голосование за комментарий решит.
Rɪᴋᴇʀ