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.