Wiadomość Arecibo to międzygwiezdna wiadomość radiowa z 1974 r., Niosąca podstawowe informacje o ludzkości i Ziemi, wysłana do gromady gwiazd M13 w nadziei, że inteligencja pozaziemska może ją odebrać i odszyfrować ... Wiadomość składała się z 1679 cyfr dwójkowych, około 210 bajtów ...
Liczba 1679 została wybrana, ponieważ jest to półpierwsza (iloczyn dwóch liczb pierwszych), która ma być ułożona prostokątnie jako 73 rzędy przez 23 kolumny. Alternatywne ustawienie, 23 wiersze po 73 kolumny, tworzy niezrozumiały zestaw znaków (podobnie jak wszystkie inne formaty X / Y).
To jest wiadomość z dodanym kolorem, aby wyróżnić poszczególne części. Rzeczywista transmisja binarna nie zawierała informacji o kolorze.
Twoim zadaniem jest wyprowadzenie komunikatu Arecibo w dokładnie takim układzie 23x73, jak pokazano na obrazku. Każdy z tych formatów wyjściowych jest dopuszczalny:
- Tekst, używając jednego znaku dla jednych, a drugiego dla zer (przy użyciu zwykłych reguł rozdzielania wierszy)
- Tablica 2D dwóch różnych wartości
- Obraz 23x73 z dwoma wyraźnymi kolorami
- A nieprzerwany strumień 1679 pozycji o dwóch różnych wartościach (tj. Dowolnym z powyższych formatów, ale płaski).
- 1679-bitowa liczba całkowita. Wskaż kolejność bitów i bajtów (endianness) w swoim rozwiązaniu.
Dla Twojej wygody, oto wersja do wklejenia (również przykładowy wynik w formacie tekstowym):
00000010101010000000000
00101000001010000000100
10001000100010010110010
10101010101010100100100
00000000000000000000000
00000000000011000000000
00000000001101000000000
00000000001101000000000
00000000010101000000000
00000000011111000000000
00000000000000000000000
11000011100011000011000
10000000000000110010000
11010001100011000011010
11111011111011111011111
00000000000000000000000
00010000000000000000010
00000000000000000000000
00001000000000000000001
11111000000000000011111
00000000000000000000000
11000011000011100011000
10000000100000000010000
11010000110001110011010
11111011111011111011111
00000000000000000000000
00010000001100000000010
00000000001100000000000
00001000001100000000001
11111000001100000011111
00000000001100000000000
00100000000100000000100
00010000001100000001000
00001100001100000010000
00000011000100001100000
00000000001100110000000
00000011000100001100000
00001100001100000010000
00010000001000000001000
00100000001100000000100
01000000001100000000100
01000000000100000001000
00100000001000000010000
00010000000000001100000
00001100000000110000000
00100011101011000000000
00100000001000000000000
00100000111110000000000
00100001011101001011011
00000010011100100111111
10111000011100000110111
00000000010100000111011
00100000010100000111111
00100000010100000110000
00100000110110000000000
00000000000000000000000
00111000001000000000000
00111010100010101010101
00111000000000101010100
00000000000000101000000
00000000111110000000000
00000011111111100000000
00001110000000111000000
00011000000000001100000
00110100000000010110000
01100110000000110011000
01000101000001010001000
01000100100010010001000
00000100010100010000000
00000100001000010000000
00000100000000010000000
00000001001010000000000
01111001111101001111000
Jeśli z jakiegoś powodu Twój język ma wbudowane narzędzie do wiadomości Arecibo, nie możesz go używać.
Powodzenia!
AKTUALIZACJA: Zaakceptowałem odpowiedź 05AB1E, ponieważ jako pierwsza była krótsza niż oryginalna wiadomość. Nie pozwól, aby zniechęciło Cię to do nowych rozwiązań.
AKTUALIZACJA 2019-09-09: Zaakceptowana odpowiedź została przeniesiona do nowej odpowiedzi 05AB1E, ponieważ zastępuje poprzednią odpowiedź 05AB1E. Ten sam punkt dotyczy poprzedniej aktualizacji; nowe rozwiązania wciąż mile widziane.
źródło
Odpowiedzi:
05AB1E , 182 bajty
Wypróbuj online! (używa
1
dla 0 i0
dla 1, zgodnie z pytaniem).Wypróbuj online! (5 bajtów dłużej,
0
dla 0 i1
dla 1, dodano nowe wiersze dla czytelności).Większość kodu to podstawowa stała N liczby całkowitej 255, reszta to dekoder asymetrycznego systemu liczbowego , wykorzystujący zakodowane prawdopodobieństwo 75% / 25% (rzeczywista częstotliwość 0 wynosi 76,35%, co jest tak bliskie 75%, że to zaoszczędziłoby tylko 1,2 bitu w ładunku, podczas gdy ładne i okrągłe 75% pozwala nam zaoszczędzić kilka bajtów w dekoderze).
Oto koder ANS, który wygenerował stałą: Wypróbuj online!
źródło
05AB1E ,
215210200 bajtówZaoszczędzono 15 bajtów dzięki Magic Octopus Urn
Wypróbuj online! lub z dodatkowym formatowaniem
Base-255 zakodowany ciąg znaków trynowych z wystąpieniami
0000
zastąpionymi przez2
.źródło
0000
się2
o 9 więcej bajtów. - pastebin.com/aZ6tHxjx za 201Java,
688 678 590 379361 bajtówZwraca ciąg.
-10 bajtów, zwracając nieprzetworzony strumień (stara odpowiedź)
-88 bajtów, używając liczb podstawowych 10 (dzięki @ceilingcat!)
-211 bajtów (wiedziałem, że można grać w golfa!), Używając zakodowanego w bazie 36 BigInteger (dzięki @JollyJoker !)
-18 bajtów przy użyciu innej zakodowanej liczby całkowitej (dzięki jeszcze raz @JollyJoker)
Wypróbuj online!
Wyjaśnienie:
źródło
Galaretka , 213 bajtów
Wypróbuj online!
Bawiłem się kodowaniem Huffmana, ale poprawa rozmiaru danych została przeważona przez dodatkowy kod. Jako taka, jest to po prostu zakodowana wersja bazowa 250 pożądanego wyjścia. Dane wyjściowe składają się z liczb całkowitych, które po zdekodowaniu jako bijective base 2 dają listę 1D 1s i 2s. Dzięki @Emigna za zwrócenie uwagi na zmianę zasad.
Wypróbuj online - z dalszym dekodowaniem w celu zademonstrowania wyników!
Jeśli preferowane jest bardziej konwencjonalne kodowanie binarne, tutaj jest takie, które koduje całkowitą reprezentację odwróconej wiadomości binarnej. Najbardziej znaczący bit liczby całkowitej reprezentuje początek wiadomości.
źródło
Brainfuck,
236020081938 bajtówWypróbuj online!
Prawdopodobnie wkrótce zagram w golfa.
źródło
Deadfish ~ ,
111510881084 bajtówWypróbuj online!
Jeśli ktoś ma cierpliwość do gry w golfa dalej, pozdrawiam cię z wyprzedzeniem. : P
-27 bajtów, drukując cyfry 10 i 100 w miejscach, w których ma to zastosowanie.
-4 bajty, drukując trzy 1000 i jeden 1001 w wierszu 3
źródło
Piet , 1763 kodeksów
Wysyła strumień zera i jedynki (bez podziałów linii).
Rozmiar kodu 1:
Rozmiar kodu 4, dla łatwiejszego oglądania:
Wyjaśnienie
Notatki
Program podąża ścieżką spiralną, zgodnie z ruchem wskazówek zegara, od lewego górnego rogu do środka. Rozproszone czarne bloki, które z grubsza podążają po przekątnych, są kontrolą przepływu. Oto ślad z NPiet .
Pracuję nad tym od dnia, w którym wyzwanie się zwiększyło, ale zajęło trochę czasu, aby napisać wiadomość na „obrazku”! Najpierw napisałem ostatnie pętle i wartość wartownika, a następnie zbudowałem wiadomość od środka na zewnątrz. (Ponieważ Piet zawsze zaczyna wykonywanie od lewego górnego rogu, spodziewałem się, że będę musiał tasować i obracać obraz, aby uniknąć nadmiaru białych znaków, ale pasuje idealnie!)
Ciekawostka: kodowanie długości w Piet (samo w sobie) nie oszczędza miejsca. Potrzeba n koderów jednego koloru, aby wypchnąć wartość n na stos, lub n koderów o różnych kolorach, aby wypchnąć tyle jedności na stos. Tak czy inaczej jest to ta sama liczba kodów. Ale większe liczby podane przez RLE oznaczają, że możesz używać sztuczek arytmetycznych (np. Zamiast pushowania 9, możesz pushować 3, powielać i mnożyć), aby zmniejszyć liczbę koderów i bloków o zabawnych kształtach, aby wypełnić dostępne białe znaki.
Nie byłam pewna, jak liczyć punkty za wpisy Piet. Znalazłem niektóre, które wydają się liczyć wszystkie kody, a inne, które jawnie liczą tylko te, które są aktywnie używane. Właśnie policzyłem ich wszystkich; ignorowanie białych kodów (nawet tych, przez które program nigdy się nie porusza) wydaje się podobne do ignorowania białych znaków w bardziej typowym języku programowania.
Aha, i właśnie teraz (dwie godziny po opublikowaniu) zdałem sobie sprawę, że straciłem ostatnią chwilę pracując nad tym. Chciałem przyciąć prawie całkowicie biały ostatni rząd i kolumnę, więc przetasowałem rzeczy ... w tym czarne bloki kontroli przepływu. Ale krawędzie obrazu działają tak samo jak czerń! Gdybym tylko to zapamiętał, nie musiałbym poświęcać tyle czasu na zastanawianie się nad zawiłościami DP i CC ...
źródło
C # (interaktywny kompilator Visual C #) ,
366332329319 bajtówZastąpić wszystkie wystąpienia
␀
z\0
do testu.Wypróbuj online!
C # (interaktywny kompilator Visual C #) , 305 bajtów, 210 znaków
To samo z powyższym, zamień na
␀
z,\0
aby przetestować. Wyjście jakoIEnumerable<string>
.Wypróbuj online! (Dzięki uprzejmości Jo King)
źródło
++
12-i++%2
Perl 6 , 368 bajtów
Wypróbuj online!
Długi ciąg jest komunikatem jako pojedyncza liczba bazowa 36 (z pojedynczym prefiksem 1 bit dla zachowania zer wiodących), który jest następnie konwertowany z powrotem na binarny i drukowany 23 bity na raz.
źródło
>>.say
i&{S/.//}
zapisywać bajty. Czy zamiast tego pomyślałeś o użyciu innej bazy?Wolfram Language (Mathematica) , 383 bajty
Wypróbuj online!
źródło
Node.js , 333 bajty
Zwraca ciąg binarny o długości 1679 znaków.
Wypróbuj online! (ze sformatowanym wyjściem)
JavaScript (ES8), 413 bajtów
Zwraca ciąg binarny o długości 1679 znaków.
Wypróbuj online! (ze sformatowanym wyjściem)
źródło
Bubblegum,
275236 bajtówWypróbuj online!
źródło
narzędzia bash + GNU, 351 bajtów
TIO
źródło
MathGolf ,
223220 bajtówWypróbuj online!
Wyjaśnienie
źródło
L/n
stopkę, więc w rzeczywistości jest to 220 bajtów. Czy można zapisać więcej bajtów, przenosząc odpowiedzi 05AB1E / Java (używając tej skompresowanej liczby całkowitej przekonwertuj ją na base-3 i zastąp wszystkie2
s literą0000
s)?2
się♫░╞
? EDYCJA: Nieważne. Widzę, że nie masz wbudowanej konwersji podstawowej (oprócz binarnej / szesnastkowej) do konwersji na base-3?+
stopkęPerl 5 , 460 bajtów
Wypróbuj online!
źródło
Python 2 , 336 bajtów
Wypróbuj online!
Wyświetla ciąg bajtów
źródło
Java (OpenJDK 8) , 364 bajty
Wypróbuj online!
Objaśnienie: Najpierw musiałem
n->new java.math.BigInteger(str,36).toString(2)
, po prostu przekonwertować liczbę radix 36 na binarną, ale to wymagało dziewięciu dodatkowych znaków dla wiodących zer. Potem wpadłem na pomysł kodowania przez zera niektórych zer jako dwójek. Wydaje się, że długość czterech zer minimalizuje długość promienia 36, więcn->new java.math.BigInteger(str,36).toString(3).replaceAll("2","0000")
Zobacz dyskusję pod tą odpowiedzią, aby znaleźć poprawkę wiodących zer na @ KevinCruijssen
źródło
[Python 2] , 345 bajtów
Zakodowałem długość ciągów 0 jako bajt zaczynający się od chr (31). Następnie zakodowałem pozostałe 10101 jako liczby binarne od chr (70) do chr (126). Ciągi binarne, które nie pasowały, zostały podzielone na mniejsze części.
Edycja: zmniejszono do 326 bajtów. Dzięki Jo King
Edycja: Naprawiono błąd w programie generatora kodu
Edycja: Edycja końcowa
źródło
o
zmiennej.Zsh , 577 bajtów
spróbuj online !!
Zastosowano niestandardową logikę kodowania. Łańcuch
S
ma 421 znaków i może być nieco bardziej skompresowany. Literya-w
reprezentują powtarzające się0
s. Liczby1-9
reprezentują powtarzające się1
s. Literyx y z
reprezentują10 100 1000
odpowiednio.Może powinienem był spróbować kodowania parą bajtów lub Ascii85 .
źródło
Bash ,
702697 bajtówWypróbuj online!
źródło
Rubinowy , 362 bajtów
Liczba całkowita zapisana w bazie 36. Z pewnością istnieje bardziej skuteczny sposób kompresji liczby całkowitej, np. Za pomocą
zlib
lubbase64
.Wypróbuj online!
źródło
[C ++ (VC ++) (ale testowany również z gcc)], 585 bajtów
Wypróbuj online!
wersja bez golfa (brakuje przerwy po 1679-tym elemencie i trwa do 1680-tej):
jako wyjaśnienie: połączyłem 73 wiersze próbki wyjściowej podane do jednej długiej linii. zakodowałem je w systemie szesnastkowym, gdzie kolejność bitów to msbfirst (używając tego programu https://github.com/Marc-Bender/longBinaryStreamToHex/releases/download/addedErrorCode-4/longBinaryStreamToHex.exe ) skróciłem wyjście o około 70 Cyfry szesnastkowe za pomocą liter „G” - „Z” jako znaku powtarzającego ostatnią cyfrę przez określony czas (Z = 2 razy więcej, Y = 3 razy więcej…) reszta powinna być względnie samoobjaśniająca dla golfistów . nadużywanie preprocesora w celu skrócenia pętli, nadużywanie
,
operatora i tym podobnych.Format wyjściowy to nieprzerwany strumień 1679 wartości 1/1.
źródło
Perl 6,348 bajtów
Na podstawie rozwiązania Java Benjamina Urquharta .
Używa prostego strumienia 0 i 1 znaków. Poniższy link zawiera kod do upiększenia wyniku.
Wypróbuj online!
źródło
Tcl , 366 bajtów
Wypróbuj online!
źródło
C ++ (z biblioteką wieloprecyzyjną Gnu), 359 bajtów
To wyprowadza ciąg jako jedną linię. Używa „1” dla 0 i „0” dla 1: /
Po prostu odczytuje osadzony ciąg jako bazę 62 i drukuje go jako bazę 2.
Służy
g++ -g arecibo.cpp -lgmp -lgmpxx
do kompilowania i łączeniaźródło
class_mpz
zmpz_class
Perl 6 , 276 bajtów
Wypróbuj online!
Wyjścia jako seria 1679 0 i 1. Możesz mieć go w różnych liniach, dodając
.comb(23)>>
przedsay
.Wyjaśnienie:
Prawdopodobnie mogę zapisać bajty, używając wyjścia jako liczby całkowitej 1679 bitów lub odwracając reprezentację bitów.
źródło
C ++ (gcc) , 748 bajtów
Wypróbuj online!
Zastępując najczęściej używane podciągi nową postacią, aż nie będzie już tego warta
źródło
Python 3 , 331 bajtów
Wypróbuj online!
źródło