Podczas gry w golfa będziesz potrzebować zrzutu heksadecymalnego kodu, zwykle dlatego, że używałeś znaków niedrukowalnych. Dlaczego więc nie stworzyć programu, który sam Hex Zrzuca?
Wyzwanie
Wyzwanie polega na tym, aby bez danych wejściowych wyprowadzić zrzut heksadecymalny kodu źródłowego w następującym formacie:
0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
Lub, na przykład, jeśli twój program był print("SomeString"):rep(123)
0000: 70 72 69 6e 74 28 5c 22 53 6f 6d 65 53 74 72 69 print("SomeStrin
0010: 6e 67 5c 22 29 3a 72 65 70 28 31 32 33 29 g"):rep(123)
Specyfika
Zrzut heksadecymalny jest podzielony na wiersze po trzy części, z których każdy reprezentuje 16 bajtów kodu źródłowego.
Pierwsza część to adres pamięci. Określa, gdzie zaczyna się bieżący wiersz w kodzie. Zapisany jako 2-bajtowa liczba szesnastkowa, po której następuje :
spacja.
Drugi to sam Hex Dump. Jest to 16 bajtów kodu źródłowego, zapisanych w formie szesnastkowej, oddzielonych spacjami. Powinna to być dokładna reprezentacja bajtów z wykorzystaniem kodowania twojego kodu.
Wreszcie, po dwóch odstępach, sam kod. Jest to po prostu 16 znaków kodu, a znaki niedrukowalne zapisane jako.
Notatki
- To jest Quine wyzwanie, więc standardowe Zasady Quine zastosowania.
- Jest to również wyzwanie dla golfa , dlatego obowiązują standardowe luki .
- Jak pokazano w drugim przykładzie, nie zapisuj bajtów po EOF, zamiast tego użyj białych znaków.
- Końcowe białe znaki są w porządku.
- Wbudowane w zrzut heksowy, jeśli zdarzy się, że masz taki w tym konkretnym formacie, nie są zbanowane, ale są rozczarowane.
- Znaki niedrukowalne odnoszą się do każdego znaku, który reprezentowany jako pojedynczy bajt, nie może być reprezentowany jako pojedynczy glif z odstępami. UTF-8, oznacza
0-31
,128-255
. W przypadku strony kodowej Jelly , ponieważ wszystkie znaki mogą być reprezentowane jako pojedynczy glif, odstępy między znakami nie występują.
xxd
to?Odpowiedzi:
V , 39 bajtów
Wypróbuj online!
Zauważ, że normalnie V używa kodowania Latin1, gdzie jest to 36 bajtów (tak mówi TIO), ale to przesłanie używa UTF-8, gdzie jest 39 bajtów.
To właściwie modyfikacja szablonu V-quine , o którym pisałem.
źródło
0a
należy usunąć nowego wiersza na końcu danych wyjściowych?Perl, 81 bajtów
Licząc shebang jako jeden. Mając długość kodu będącą wielokrotnością 16, oszczędza się sporo na formatowaniu. Używanie
eval
do zmiany przypisania$_
do siebie zapożyczone z ais523 .Wynik:
Wypróbuj online!
źródło
Perl + xxd + cięcie, 61 bajtów
Wypróbuj online!
Jest to uniwersalny konstruktor quine w Perlu + wywołanie
xxd
icut
wykonanie zrzutu heksadecymalnego. Żaden z omawianych programów nie ma wbudowanego narzędzia do wykonania zrzutu heksadecymalnego w formacie podanym w pytaniu; jest jednakxxd -g1
bardzo blisko i dlatego można go używaćcut
do przycięcia wyjścia do właściwego kształtu.Jest to uniwersalny konstruktor quine
$_=q("\$_=q($_);eval");eval
, który tworzy kopię własnego kodu źródłowego w pamięci i może być modyfikowany w celu wykonywania na nim dowolnych operacji. W tym przypadku używamopen "|"
iprint
xxd
przesyłam dane wejściowe do zewnętrznych programów, które wykonują większość operacji heksdumpingowych icut
zmieniają je w wymagany format.źródło
JavaScript (ES6)
229219162 bajtówDzięki @Neil za zaoszczędzenie wielu bajtów
Uwaga
Sporo osób uważa, że dostęp do kodu źródłowego funkcji w ten sposób, w jaki to robię, jest oszustwem, ale według @Dennis jest w porządku. Dlatego zostawię tutaj swoją odpowiedź.
Kod
Stosowanie
Wystarczy wywołać funkcję bez argumentów.
Wynik
źródło
f=_=>([...c=`f=`+f].map(c=>c.charCodeAt().toString(16)).join` `+` `.repeat(46)).match(/.{48}/g).map((s,i)=>`00`+i.toString(16)+`0 `+s+c.substr(i*16,16)).join`\n`
..toString
na[t=toString]
i drugi,[t]
aby zapisać 3 bajty. Zmień na,<backtick>\n<backtick>
aby<backtick><newline><backtick>
zapisać kolejny.a
linię, spowoduje to zrzut heksadecymalny, który wymaga wcześniejszego 0, a dodanie tej kontroli zwiększy tylko liczbę bajtów.Rubin,
128112 bajtówBez końcowego znaku nowej linii.
Dzięki primo za pomysł wyrównania do granicy 16 bajtów.
Wynik
źródło