XKCD # 99 , zatytułowany „Serce binarne”, pokazuje prosty obraz jedynek i zer, z niektórymi cyframi w kolorze czerwonym.
Czerwone serce jest widoczne gołym okiem, ale komunikat ukryty w sekwencji binarnej nie jest. Jeśli usuniesz wszystkie spacje i znaki nowej linii i zinterpretujesz sekwencję binarną jako 8-bitowy kod ASCII, otrzymasz komunikat:
iloveyOuilOveyouiloveyOuilOveyOuiloveyouilOveyouilOveyOuilOv
Urocze, prawda?
Pssst ... Ciąg nie jest czystym powtórzeniem ciągu.
Wyzwanie polega na utworzeniu tego obrazu binarnego z 21 cyframi i 23 cyframi w dół. Powinna być dokładnie jedna spacja między każdą cyfrą w każdym rzędzie i jedna nowa linia dla każdego nowego wiersza. Zauważ, że ostatnie bity to tylko początek litery e
, ponieważ 21*23
nie można go podzielić przez 8. Te bity również są poprawne.
Funkcja lub program nie powinny pobierać żadnych danych wejściowych. Wiodące i końcowe spacje oraz znaki nowej linii są akceptowane.
Wynik twojego kodu powinien wyglądać następująco:
0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1 1 0 1
1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1 0 1 0 1
1 1 1 0 0 1 0 1 0 0 1 1 1 1 0 1 1 1 0 1 0
1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1 0 0
1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1 0 1 0
1 1 1 1 0 0 1 0 1 1 0 1 1 1 1 0 1 1 1 0 1
0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1 1
0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1 0 1
0 1 1 1 1 0 0 1 0 1 0 0 1 1 1 1 0 1 1 1 0
1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1
0 0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1 0
1 0 1 1 1 1 0 0 1 0 1 0 0 1 1 1 1 0 1 1 1
0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0
1 1 0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1
0 1 0 1 1 1 1 0 0 1 0 1 1 0 1 1 1 1 0 1 1
1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0
0 1 0 0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0
1 0 1 0 1 1 1 1 0 0 1 0 1 1 0 1 1 1 1 0 1
1 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0
0 0 1 0 0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0
0 1 0 1 0 1 1 1 1 0 0 1 0 1 0 0 1 1 1 1 0
1 1 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1
0 0 0 1 0 0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1
To jest kod golfowy, więc wygrywa najkrótsza odpowiedź (w bajtach).
Tabela liderów
źródło
O
z ciągu wyjściowego ASCII!Odpowiedzi:
Galaretka ,
363332 bajtówDzięki @JonathanAllan za grę w golfa z 3 bajtów!
Wypróbuj online!
Jak to działa
Główny link
jest wykonywany niladycznie (tzn. bez żadnych argumentów) podczas uruchamiania programu. Jego wartość zwrotna zostanie wydrukowana niejawnie.
znajdź indeksy cytowanych znaków na stronie kodowej Jelly i zinterpretuj je jako cyfry dwuskładnikowej liczby podstawowej 250. Daje to liczbę całkowitą 13021639057551959994 .
konwertuje wygenerowaną liczbę całkowitą na binarną. Daje to tablicę bitów 1011010010110110001001111011101100110010101111001010011110111010, która odpowiada kodowaniu UTF-8 ciągu ilOveyOu , przesuniętego o jeden bit w lewo.
Przesunięcie jest konieczne, ponieważ
B
nie może zwrócić tablicy bitów z wiodącym 0 . Inne opcje obejmują negowanie cyfr binarnych lub obliczanie kwadratu w odwrotnej kolejności, ale takie podejście oszczędza jeden bajt.formuje wygenerowaną tablicę w zakresie od 1 do 484 , tj. powtarza zawartość tablicy tyle razy, ile jest to konieczne do osiągnięcia długości 484 .
To jeszcze jeden bit, niż potrzebujemy, aby uwzględnić zmianę. Możemy teraz usunąć pierwszy bit, ale później to oznacza, że wszystkie bity, które muszą zostać zamienione, leżą na równych indeksach, co pozwala nam zachować wspomniany bajt.
pobiera punkty kodowe znaków pomiędzy
“
i‘
( [10, 58, 74, 138, 154, 186] ), a następnie „unhalves” je, tj. pomnaża je przez 2 ( [20, 116, 148, 276, 308, 372 ] ).warunkowo neguje bity przy tych indeksach. Odpowiada to zmianom we / wy w oryginalnym wzorze.
Wreszcie,
usuwa kolejkę z tablicy bitów (usuwając pierwszy bit), dzieli pozostałą tablicę na rzędy 21 elementów i drukuje wynikową macierz jako siatkę.
źródło
O
jako domyślnych, myślę, że to robi:“ỊḂr×C)ḃȯ’B¬ṁ483¬“Œ` ° @‘+\¤¦s21G
Galaretka ,
41 40 3533 bajtówDzięki @Dennis za zakończenie
ṖṖCG
! (uzupełnienieC
=1-x
zamiast logicznego braku¬
)TryItOnline
W jaki sposób?
Wersja „kolorowa”, 77 bajtów
TryItOnline
Galaretka nie ma kolorów, ale i tak jest mi znacznie łatwiej to zobaczyć (jestem ślepy na kolory) ...
W jaki sposób?
źródło
¬
, cztery ostatnie bajty mogą się staćṖṖCG
. :)complement
?Właściwie 58 bajtów
Wypróbuj online!
Wyjaśnienie
Są tutaj trzy główne części, więc odpowiednio je podzielę.
Część 1: Konstruowanie ciągu base-256
Zamierzamy skonstruować odwrócony ciąg binarny, aby skorzystać ze struktury opartej na stosie (LIFO) i uniknąć komplikacji związanych z zerami wiodącymi w ciągu binarnym. Zatem docelowym łańcuchem binarnym jest
110011011101111001000110110100101101010111011110010100111101010011001101110111100100011011010010110101011101111011010011110101001100110111011110010001101101001011010101110111101101001111010100110011011101111011000110110100101101010111011110010100111101010011001101110111100100011011010010110101011101111001010011110101001100110111011110110001101101001011010101110111101101001111010100110011011101111001000110110100101101010111011110010100111101010011001101110111101100011011010010110
, co jest równoważne z20083405242288679348048842451418880256193335738939042905519679590571514414673488599852759703515507690399267425671627412178904636115120346432419478
dziesiętną. W bazie-256 (przy użyciu tabeli znaków CP437 do konwersji) odpowiednim ciągiem jest♠n≥6û«≥₧ªn≥6û«÷₧ªn≥6û«÷₧ªn÷6û«≥₧ªn≥6û«≥₧ªn÷6û«÷₧ªn≥6û«≥₧ªn÷6û
. Aby skonstruować oryginalny ciąg binarny, konstruujemy ciąg base-256 (wykorzystując wzorzec w nim) i wykonujemy konwersje bazowe na dziesiętne i binarne.Ciąg base-256 ma następujący format (spacje i znaki nowej linii zostały dodane dla zachowania przejrzystości):
Tak więc, każda z 7 środkowych sekcji może być utworzona przy użyciu rusztowania
«%s₧ªn%s6û
i zastąpienia%s
części jednym≥
lub÷
.Konkretna sekwencja
≥
si÷
jest nam potrzebna≥≥÷≥÷÷≥≥≥÷÷≥≥÷
. Ponieważ potrzebujemy tego jako listy ciągów o długości-1, naiwnym sposobem przedstawiania tego byłoby"≥≥÷≥÷÷≥≥≥÷÷≥≥÷"#
(popchnij ciąg, ułóż go na liście). Możemy jednak zrobić trochę lepiej. Interpretując ten ciąg jako liczbę binarną (gdzie≥
reprezentuje1
i÷
reprezentuje0
), otrzymujemy13542
dziesiętnie. Konwertując to z powrotem na binarne (używając tradycyjnych1
s i0
s) i indeksując w łańcuch długości 2, możemy uzyskać listę używając jednego mniej bajtu niż naiwna metoda.Część 2: Konwersja na binarną
Ta część jest znacznie prostsza. Gdyby rzeczywiście miał możliwość bezpośredniej konwersji base-256 na binarną, skorzystalibyśmy z tego. Niestety tak nie jest, więc będziemy musieli użyć dziesiętnego jako formatu pośredniego.
,
Poniższy kod reprezentuje kod z części 1 - do celów informacyjnych, jakie otrzymuje kod Część 1 z,
czytać wyjście z części 1 ze standardowego wejścia. Nie jest częścią rzeczywistego kodu końcowego.Część 3: Formatowanie
Gdyby wyzwanie polegało jedynie na wyprowadzeniu łańcucha binarnego w niezmienionej postaci, bylibyśmy gotowi. Jednak nadal mamy trochę do sformatowania, aby uzyskać ciąg binarny w prostokąt 21 x 23.
Podobnie jak w części 2,
,
reprezentuje dane wyjściowe z poprzedniej części i nie jest częścią rzeczywistego kodu.Dla tych, którzy śledzą w domu, jest to równoważny kod Python 3 (481 bajtów):
źródło
JavaScript (ES6),
169...136135 bajtówZapisano 2 bajty dzięki Andrakis
Zapisano 4 bajty dzięki Hedi
Zapisano
35 bajtów dzięki NeilWersja kolorowa, 249 bajtów (237 bajtów JS + 12 bajtów CSS)
Kod JS generuje grafikę ASCII pogrubionymi znacznikami serca. 12 bajtów CSS jest wymaganych do pokolorowania na czerwono. (Czy liczba bajtów jest uczciwa?)
źródło
s=>s.replace(/./g,'$& ')
. Pracowałem nad prawie identycznym rozwiązaniem.s.replace(/./g,'$& ')
można zastąpićs.split``.join` `
?[...s].join` `
replace(/./g,(c,i)=>c+=++i%21?' ':'\n')
(oczywiście używając dosłownego nowego wiersza) zapisuje kolejny bajt. Może istnieć jeszcze lepszy sposób na wyrażenie tego pomysłu.05AB1E ,
775453444341 bajtówWykorzystuje kodowanie CP-1252 .
Wyjaśnienie
Wypróbuj online!
źródło
Sðý42ô»
celuS21ô»
, ponieważ»
łączy list wewnętrzne spacjami niejawnie (i•1žä¿*•
powinno być teraz•Å¾$6•
, ponieważ całkowite są kodowane w base-255, teraz zamiast bazy-214).CJam , 48 bajtów
Współpraca z @MartinEnder, który ściągnął trudne 3 bajty za pomocą
"uilvey"3/
łańcucha. Tłumacz online .źródło
JavaScript ES6 REPL ,
124121119113 bajtówZaoszczędź 6 bajtów dzięki @ETHproductions
Jest to pełny program, który można wkleić w REPL / konsoli, aby uzyskać poprawny wynik.
Pokaż fragment kodu
Więcej pełnych słów
Kolorowe serce tylko JavaScript, 281 bajtów
Działa to poprzez przełączanie kolorów co n bitów i korzysta z funkcji console.log do rejestrowania kolorów
Kolorowe serce CSS, 229 + 12 bajtów
Jeśli dozwolone jest używanie css, kolorowe serce można jeszcze bardziej zmniejszyć do 229 bajtów kodu JavaScript i 12 bajtów CSS
Pokaż fragment kodu
źródło
a
i po prostu użyćnum>>i/64&1
w obu miejscach, oszczędzając 1 bajt. Ponadto++i%21==0?newline:space
jest taki sam jak++i%21?space:newline
.i=0,r=''
nai=r=''
;''
jest automatycznie wymuszane na 0.MATL,
5655 bajtówWypróbuj online
Wyjaśnienie
źródło
PowerShell v2 +, (UTF-16) 300 bajtów
Poprawiono błędną liczbę bajtów dzięki @Mego
Nie najkrótsze, ale inne podejście. Ręcznie wziąłem każdą linię i pokroiłem na pary, każda (z grubsza) o długości 9-11 znaczących bitów. Przekształciłem każdą z tych wartości binarnych na
char
(Uwaga: PowerShell domyślnie używa UTF-16, a nie UTF-8) i zamienił to w ciąg. To jest'...'
początek.Następnie
-split
dzielimy to na łańcuchy o długości 2 i zapętlamy każdą parę. Te pary są dzielone nachar
-array przez$_[0,1]
, a każda z nich jest rzutowana jako int+$_
i edytowana[convert]
na binarną (,2
)String
. To jest-join
połączone razem w jeden ciąg, a następniePadLeft
d, aby uzyskać odpowiednią długość, a następnie każdy element jest-replace
d ze sobą i spacją'$1 '
.Wszystkie te ciągi są pozostawione w potoku, a dane wyjściowe są niejawne, przy domyślnym
Write-Output
przyklejaniu nowego wiersza między elementami.źródło
len("'ږƍƕ๓ƺ֥˄ϝӊ༭ǝ֥ţϝɥޔǮƱϝIJ˲ӷʴ˘ͻ֙ץŻŬɻˌʼֽ͖ҶɻŦʼʞݖɛĽƳ'-split'(..)'-ne''|%{(-join($_[0,1]|%{[convert]::ToString(+$_,2)})).PadLeft(21,'0')-replace'(.)','$1 '}".encode('utf-16be'))
/// , 237 bajtów
Wypróbuj online!
źródło
Python 3,
147144 bajtówPrzetestuj to w ideone
Inicjuje
i
do0
w deklaracji funkcji, a następnie powtarza to 23 razy:tworzy cały ciąg binarny bez spacji (patrz poniżej);
wycina rząd od wewnątrz za pomocą
[i:i+21]
;wstawia spacje za pomocą
' '.join(...)
;odciski; i
przyrosty
i
o 21 zi+=21
Aby utworzyć cały ciąg binarny:
powtarza się
"ilOveyOu"
osiem razy;zastępuje
O
wo
razie potrzeby (w indeksach[2,14,18,34,38,46]
);- - - osiąga się
chr(j+30)in' ,0@DL'
to poprzez zapisanie 3 bajtówkonwertuje każdy znak na jego porządek;
rzutuje każdą liczbę porządkową na ciąg binarny (
'0bxxxxxxx'
);usuwa wiodące
'0b'
z każdego użycia[2:]
;dodaje każdy z
'0'
; iłączy się z tym wszystkim
''.join(...)
źródło
i=0\nexec(...)
lubi=0;exec(...)
dla 137 bajtów.exec("...")
sięexec"..."
iprint(...)
doprint...
PHP + HTML + CSS, 173 bajtów Kolorowe 367 bajtów
CLI tylko PHP 173 bajtów
zgodne z typem nagrody bounty text / html
b{all:unset;color:red}
zamiastb{all:unset;color:#911;background:red}
w pierwszej wersjiPHP + HTML + CSS, 392 bajtów
serce czerwone + czarne, które wygląda ładniej
Może zadzwoń pod numer koloru w części CSS
dodaj to, zanim będzie ładniej
Pierwsza wersja wyjściowa to najbrzydszy kod HTML w moim życiu
czerwono-czarne serce
375 bajtów do bezpośredniego utworzenia strony HTML za pomocą PHP
źródło
color:#911;background:red
zcolor:red;
sprawia, że odpowiadają specyfikacji nagród, a także oszczędność kilka bajtów.PowerShell, 110 bajtów
Wyjaśnienie:
Pierwszy wiersz skryptu pobiera podciągi i wstawia
O
między nimi literę . Wynikiem jest ciąguiloveyOuilOveyouiloveyOuilOveyOuiloveyouilOveyouilOveyOuilOvey
. Pamiętaj, że pierwsze i ostatnie znaki są zbędne.Pętla wyprowadza wszystkie niezbędne
(8..490)
bity ze znaków ciągu, a także spację lub linię.Zagadka odbiorcy listu walentynkowego
Można zauważyć, że
O
same małe i duże symbole składają się na kodowanie bitów. Istnieje 15 symboli (bitów). Jest tylko jedna partycja na bitach, aby uzyskać znaki ASCII:oOOooOOO
+ooOoOOO[o]
. Musieliśmy dodać małeo
zamiast0
na końcu. Te symbole ASCII to:g.
Kto jest taki tajemniczy
g.
?źródło
PHP, 121 bajtów
awaria
źródło
q / kdb +,
10793855553 bajtówRozwiązanie:
Przykład:
Wyjaśnienie:
Uwagi:
źródło
Python 3, 199 bajtów:
źródło
Python 3, 170 bajtów
wykonuje powtórzenie ciągu „Il% svey% su”, powtarza go wymaganą liczbę razy, a następnie używa krotki do podciągania wszystkich znaków „o”. Następnie konwertuje je na binarne, używa modułu zawijania tekstu, konwertuje każdy nowy element lista do listy, łączy się ze spacją, a następnie dodaje 0 1 1, ponieważ wydaje się, że to skrót lub coś takiego
źródło
Mathematica, 123 bajty (275 z kolorem)
Nie jestem pewien, czy użycie
Grid
zamiast wyprowadzania łańcucha jest w porządku (jeśli nie, to jest to pozycja niekonkurująca).Czarno-biały
Kolor
źródło
grid
zwykłym tekstem i wkleić go do notatnika? Jak to wygląda? Spacja oddzielona (pojedyncza spacja) nowymi liniami, jak pokazano na rysunku?Ruby 142 bajty
(Nieco więcej) czytelnie:
Nie znalazłem jeszcze sposobu na zagęszczenie oryginalnego tekstu w bardziej zwięzłą formę w Ruby - ma kilka świetnych funkcji manipulacji ciągami, ale na wszystkie sposoby próbowałem używać więcej znaków niż samego ciągu. Doceniam wszystkie wskazówki, to mój pierwszy Code Golf na StackOverflow!
źródło
a
), A następniea+a+a
... Jeszcze lepiej, jeśli Ruby obsługuje mnożenie struna*count
!a+a+a
tak było)o
na wielkąO
!Rdza, 195 bajtów
Nie golfowany:
źródło
C (gcc) , 102 bajty
Zniszczony
Wypróbuj online!
źródło
K (oK) ,
5048 bajtówRozwiązanie:
Wypróbuj online!
Wyjaśnienie:
Port mojego rozwiązania Q / KDB + .
Uwagi:
źródło
2 14 18 34 38 46
->0x020e1222262e
Pyth, 47 bajtów
Wypróbuj online tutaj .
źródło
/// , 220 bajtów
Wypróbuj online!
źródło
C ++ 11, niekonkurencyjny,
726687636 bajtów (* wymagany NIX lub W10 próg 2)Wiem, że można lepiej grać w golfa. Chcę zobaczyć krótką odpowiedź c ++ cholera!
Prawdopodobnie popełniłem też kilka błędów podczas kodowania sekcji serca.
Wyjście (kolory ustalone):
źródło
Python, 473 bajty
Kolorowy!
źródło
str.translate
może być lepszym wyboremFEU , 360 bajtów
Po prostu głupia kompresja
źródło