Надішліть космічний дзвінок


16

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

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

Дозволені всі хитрощі, крім звичайних лазів.

Дозволяється виводити 23 сторінки окремо.

Дозволяється писати до 23 програм (наприклад, по одній для кожної сторінки) та підсумовувати їх розмір, щоб визначити ваш рахунок.

Дозволяється використовувати до 23 двійкових файлів поряд із вашими програмами. Їх вага враховується у вашому балі.

Виграє найкоротший код (у байтах).

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

Для виводу тексту дозволено проходження нового рядка / пробілу.

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

Додаток: виведення тексту та вихід зображення для відтворення:

космічний дзвінок


19
«Дозволяється писати багато програм (наприклад, по одній для кожної сторінки) та підсумовувати їх розмір, щоб визначити ваш рахунок». Це небезпечно: пуста програма друкує програму « Jelly » 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=#>'">

в кінці і voilà:

Демонстрація: http://xem.github.io/miniCosmicCall/


Примітка: додавання просто <img src=#>працює теж, але воно дозволяє бачити багато сміття, тому я вважаю за краще не робити.


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

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


1
найкоротша відповідь + 1
Ерік Аутгольфер

ще не сказав мого останнього слова!
xem

Я впевнений, що не можу зрозуміти, що ви тут мали намір сказати.
Ерік Аутгольфер

вибачте, я мав на увазі, що я намагаюся зробити щось ще менше
xem

6

Python 2.7 - 10971 8077 байт

оновлення:

  • LZMA чомусь не працює для мене, тому я повернувся до Дефляту.

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

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

Більшість алгоритмів стиснення розглядають дані як 1-мірний масив, і тому не можуть зафіксувати повторювані двовимірні символи, відображені в космічному виклику (IMO також ускладнює розуміння прибульців також: P).

По-перше, я обрав кожного символу як масив 7 * 5 і склав список всіх унікальних символів (якщо я пам'ятаю 101). Потім я переглянув зображення, і коли знайдено символу, було записано положення та індекс цього символу (у списку символів).

Ці позиції можуть бути представлені однією цілою, однак із знайденими понад 2 К символів, а позиції, що знаходяться в межах від 0-370966 (форма dividmod), потребують до 3 байт. Однак я зібрав позиції символів для того, щоб замість цього перетворити абсолютну позицію на зміщення, зробивши більшість цифр менше 1 байта. Я зашифрував цей список у utf-8 для врахування кількох чисел, що перевищували 1 байт

Після запису та видалення всіх відповідних символів я зберег png з максимальним стисненням. Потім я запакував сценарій відновлення python (зворотній той самий процес), png, шаблон chatacter та список позицій символів, все в zip-файл, щоб скористатися тим фактом, що python може приймати папку або zip-файл як аргумент, і він почне виконання у будь-якому файлі найвищого імені __main__.py. Я трохи розігрувався з 7z, щоб отримати найкращу компресію, яка виявилася LZMA з диктатом 1 М та 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 ... незабаром після публікації я продовжував возитися з цим, і це зламаний rn (python, що дає мені якусь помилку zlib при навантаженні), і він знаходиться на моєму робочому комп'ютері. Я поставлю його в понеділок, якщо зможу повернути його до робочого стану. : P
Аарон

Я відчуваю, що можна було б оптимізувати баланс між стисненням png та тими символами, які я кодую (менш вживаними), щоб зберегти ще кілька байтів ..
Аарон,

1
@xem Я додав dl-посилання ...
Аарон

Любіть ідею стиснення 2D ... Що з 3D-компресією? (Складання зображень)
нелінійний

3

Gzip bzip2 в оболонці, 20914 18965 байт

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

bzcat s

виконати роботу. Таким чином, він додає до 18958 байт даних і 7-байтну команду.


1
Я думаю, ви можете зберегти пару к, використовуючи замість 'bzip2'!
Дом Гастінгс

@DomHastings: я нарешті дотримувався вашої поради.
Джулі Пелтьє,

Для подальших досліджень: Bubblegum і zopfli .
Цифрова травма

2

Pyth, 46381 байт

Зі зрозумілих причин це не може бути розміщено тут.

jc.BC"<too long>"127

Зразок.

Пастебін hexdump програми.


ви кодуєте біти 7 на 7 в символах латин-1, правда? Просто і приємно! :) Звичайно, я шукаю набагато кращого стиснення: p
xem

1
Так, я роблю кращу компресію. Я кодував їх 8 на 8, до речі.
Leaky Nun

До речі, мені цікаво, як ви отримали цю оцінку: 127 * 127 * 23/8 = приблизно 46371 байт. Куди пішли 355 інших байтів?
xem

Дякую, це точно відповідає йому зараз. Насправді ви можете побачити зайві 10 байт у коді вище ( jc.BC""127").
Лина монашка

Як ви маєте справу з зайвим бітом? (все повідомлення займає 46370 байт + 7 біт. Ваш останній байт може створити додатковий нуль, що не є дійсним результатом)
xem

2

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

Як зазначено в правилах:

Ваша місія полягає в тому, щоб написати програму, яка відображає все повідомлення 127 * 2921px ... або як зображення (намальоване на екрані або збережене на диску ).

Дозволяється використовувати до 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


import lzma,base64,os
Ерік Аутгольфер

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Дякую!
TuxCrafting

1
@Mego Я не думаю, що це потрібно, враховуючи, що це смішно довго. Нехай голосування коментарів вирішать.
Rɪᴋᴇʀ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.