Wyślij kosmiczne połączenie


16

Kosmiczne wezwanie to wiadomość wysłana w kosmos w 1999 i 2003. Jest wykonana z 23 127 * 127px monochromatycznych obrazów bitmapowych, jak opisano tutaj .

Twoim zadaniem jest napisanie programu, który wyświetla całą wiadomość 127 * 2921px, albo w postaci tekstu (złożonego z zer, jedynek i znaków podziału linii) lub jako obraz (narysowany na ekranie lub zapisany na dysku). Będą dwie kategorie zwycięzców: jedna dla wyników tekstowych i jedna dla wyników graficznych.

Wszystkie triki są dozwolone, z wyjątkiem typowych luk.

Dozwolone jest wydrukowanie 23 stron osobno.

Dozwolone jest pisanie do 23 programów (np. Jeden dla każdej strony) i sumowanie ich rozmiaru w celu ustalenia wyniku.

Dozwolone jest użycie do 23 plików binarnych obok twojego programu (programów). Ich waga jest liczona w twoim wyniku.

Najkrótszy kod (w bajtach) wygrywa.

Przy 1 bicie na piksel obraz zawiera 127 * 127 * 23/8 = 46370 bajtów + 7 bitów danych. (ostrzeżenie: nie można wypisać dodatkowego zera, jeśli wartości pikseli są przechowywane w 46371 bajtach)

Końcowy znak nowej linii / spacja jest dozwolony dla tekstu wyjściowego.

Wyjście wizualne nie może zawierać żadnego czarnego piksela oprócz czarnych pikseli kosmicznego wezwania. Można go narysować w jednej kolumnie (poprawnie uporządkowanej) lub podzielić na 23 obrazy lub animować (jak gif), a także poprawnie uporządkować.

Załącznik: wyjście tekstu i wyjście obrazu do odtworzenia:

kosmiczne wezwanie


19
„Dozwolone jest pisanie wielu programów (takich jak jeden dla każdej strony) i sumowanie ich rozmiaru w celu ustalenia wyniku.” Jest to niebezpieczne: pusty program Jelly drukuje 0, pusty program Snails drukuje 1, a pusty program GolfScript drukuje nowy wiersz . Ktoś może przesłać 0-bajtową, 373888-programową odpowiedź :)
Lynn,

Haha, dobra, więc ograniczę liczbę programów do 23.
xem.

Czy końcowe znaki nowej linii / spacje są dozwolone?
Loovjo,

tak . . . . . .
xem

Czy możemy użyć innego pliku, czy musimy pracować wyłącznie nad plikiem źródłowym? Na przykład. czy mogę użyć We / Wy do przechowywania skompresowanej wersji, a następnie rozpakować ją lub czy wszystko musi być dosłowne w kodzie?
Mam nadzieję, że będzie

Odpowiedzi:


18

GIF, 27386 bajtów

Oto strony oryginalnej transmisji pokrojone na pojedyncze ramki GIF, okazało się, że nie są tak małe jak 1 PNG wszystkich :(

kosmiczne połączenie animowany GIF


7
Witaj i witaj w PPCG! Chociaż to nie wygra , nadal jest to dobry post.
NoOneIsHere

Ditheringowałeś? Może być w stanie zaoszczędzić około 300 bajtów, jeśli użyjesz przezroczystych folii na przejściach.
Magic Octopus Urn

7

HTML, 16012b

Skompresowałem obraz w PNG8, otworzyłem go w edytorze tekstu, dołączyłem

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

na końcu i voilà:

Demo: http://xem.github.io/miniCosmicCall/


Uwaga: dołączanie <img src=#>również działa, ale pozwala na wyświetlenie dużej ilości śmieci, więc wolę tego nie robić.


PS: dla zabawy umieściłem również całą wiadomość w jednym, wykonywalnym tweecie (możesz skopiować i wkleić ją w konsoli przeglądarki, a pojawi się obraz):

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


1
najkrótsza odpowiedź + 1
Erik the Outgolfer

nie powiedziałem jeszcze mojego ostatniego słowa!
xem

Jestem pewien, że nie rozumiem, co chciałeś tutaj powiedzieć.
Erik the Outgolfer,

przepraszam, miałem na myśli, że staram się zrobić coś jeszcze mniejszego
xem

6

Python 2.7 - 10971 8077 bajtów

aktualizacja:

  • LZMA faktycznie z jakiegoś powodu nie działa dla mnie, więc wróciłem do Deflate.

  • Znalazłem narzędzie online do jeszcze bardziej kompresowania PNG (mówią, że używają kompresji stratnej, ale tablica pozostaje niezmieniona)

  • Grałem __main__.pytrochę w golfa ...
  • Odkryłem, że pomijam krok (rozpakowywanie plików danych z archiwum zip)
  • Dodano łącze DL (patrz poniżej)

Większość algorytmów kompresji patrzy na dane jako tablicę jednowymiarową, a zatem nie może uchwycić powtarzających się dwuwymiarowych znaków wyświetlanych w wywołaniu kosmicznym (IMO utrudnia także obcym zrozumienie: P).

Najpierw wybrałem każdy znak jako tablicę 7 * 5 i sporządziłem listę wszystkich unikalnych znaków (101, jeśli pamiętam). Następnie iterowałem obraz, a gdy znaleziono znak, zapisywano jego pozycję i indeks (na liście znaków).

Pozycje te mogą być reprezentowane pojedynczą liczbą całkowitą, jednak z znalezionymi ponad 2K znakami, a pozycje w zakresie od 0-370966 (forma divmod) wymagają do 3 bajtów każda. Zebrałem jednak pozycje znaków w kolejności, więc zamiast tego przekonwertowałem pozycję bezwzględną na pozycję przesunięcia, dzięki czemu większość liczb jest mniejsza niż 1 bajt. Zakodowałem tę listę w utf-8, aby uwzględnić kilka liczb, które były większe niż 1 bajt

Po nagraniu i usunięciu wszystkich dopasowanych znaków zapisałem png z maksymalną kompresją. Następnie spakowałem skrypt rekonstrukcji Pythona (odwróć ten sam proces), png, szablon chatacter i listę pozycji znaków - wszystko w pliku zip, aby skorzystać z faktu, że python może wziąć folder lub plik zip jako argument, i rozpocznie wykonywanie od dowolnego pliku na najwyższym poziomie o nazwie __main__.py. Bawiłem się trochę z 7z, aby uzyskać najlepszą kompresję, która okazała się być LZMA z dykta 1M i 32-bitowymi słowami.

oto skrypt dekodera (grał w golfa, ale wciąż ma komentarze)

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 do pobrania pliku zip ...


Jestem :) (i gratuluję tego wyniku!)
xem 10.09.16

@xem ... krótko po opublikowaniu, nadal z tym bałaganem, i jest zepsuty rn (python daje mi jakiś błąd zlib przy ładowaniu) również jest na moim komputerze roboczym. Odłożę to w poniedziałek, jeśli mogę przywrócić go do stanu roboczego. : P
Aaron,

Wydaje mi się, że można zoptymalizować równowagę między kompresją png a kodowaniem znaków (rzadziej używanych), aby zaoszczędzić jeszcze kilka bajtów ..
Aaron

1
@xem Dodałem link dl ...
Aaron

Podoba Ci się pomysł na kompresję 2D ... A co z kompresją 3D? (Układanie obrazów w stos)
NonlinearFruit

3

Gzip bzip2 w powłoce, 20914 18965 bajtów

Utwórz plik danych wyjściowych z danymi wyjściowymi podanymi w pytaniu bzip2i zmień nazwę pliku na s. To pozwala następnie:

bzcat s

wykonać pracę. Daje to w sumie 18958 bajtów danych i 7-bajtowe polecenie.


1
Myślę, że zamiast tego możesz zaoszczędzić kilka kilogramów za pomocą „bzip2”!
Dom Hastings,

@DomHastings: W końcu zastosowałem się do twojej rady.
Julie Pelletier,

Do dalszych badań: Bubblegum i zopfli .
Digital Trauma

2

Pyth, 46381 bajtów

Z oczywistych powodów nie można go tutaj opublikować.

jc.BC"<too long>"127

Próba.

Pastebin zrzutu heksadecymalnego programu.


kodujesz bity 7 na 7 znakami Latin-1, prawda? Proste i miłe! :) Oczywiście szukam znacznie lepszej kompresji: p
xem.

1
Tak, robię lepszą kompresję. Nawiasem mówiąc, zakodowałem je 8 na 8.
Leaky Nun

Nawiasem mówiąc, zastanawiam się, skąd masz ten wynik: 127 * 127 * 23/8 = około 46371 bajtów. Gdzie poszło 355 innych bajtów?
xem

Dzięki, teraz dokładnie pasuje. Możesz zobaczyć dodatkowe 10 bajtów w powyższym kodzie ( jc.BC""127").
Leaky Nun

Jak sobie radzisz z dodatkowym bitem? (cała wiadomość zajmuje 46370 bajtów + 7 bitów. Twój ostatni bajt może wygenerować dodatkowe zero, co nie jest prawidłowym wyjściem)
xem

2

Bash + WebP binarny, 11 + 15330 = 15341 bajtów

Zgodnie z zasadami:

Twoim zadaniem jest napisanie programu, który wyświetla całą wiadomość 127 * 2921px… lub jako obraz (narysowany na ekranie lub zapisany na dysku ).

Dozwolone jest użycie do 23 plików binarnych obok twojego programu (programów). Ich waga jest liczona w twoim wyniku.

i

Wszystkie triki są dozwolone, z wyjątkiem typowych luk.

… Nie mogłem się oprzeć opublikowaniu czegoś głupio prostego.

Program działa w trybie bash i wyświetla obraz, zapisując go na dysku.
Używa 1 pliku binarnego, który również jest plikiem obrazu (tak, WebP jest formatem obrazu), dlatego program może zrobić tak niewiele, jak… wykonać kopię tego pliku.

Zatem kod (11 bajtów):

cp b a.webp

Zakładając, że plik binarny towarzyszący ma nazwę „b”, kod zapisuje plik obrazu na dysk z poprawnym rozszerzeniem („a.webp”).

Nie widzę powodu, aby przesyłać plik binarny, ponieważ jest on trywialnie stworzony przez uruchomienie

cwebp -z 9 <downloaded input file> b

tworzy plik z 15330 bajtami. Jeśli ktoś chce, mogę go gdzieś przesłać.

Uwaga: -zopcja w cwebpaktywuje tryb bezstratnej kompresji. 9to wytrzymałość na ściskanie (maksymalna).


OP autor lubi to
xem

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.