Ręczne pobieranie danych wyjściowych z xxd i przekształcanie ich w użyteczny kod powłoki nie jest przyjemnością, więc Twoim zadaniem jest zautomatyzowanie tego procesu.
Zasady
Twoje zgłoszenie może być funkcją, lambda, skryptem lub jakimkolwiek rozsądnym odpowiednikiem. Możesz wydrukować wynik lub jeśli przesłana funkcja jest funkcją / lambda, możesz ją również zwrócić.
Ci program musi wziąć trzy argumenty, z których pierwszym jest łańcuch zawierający wyjście xxd, prowadził bez argumentów innych niż nazwy pliku, na przykład: xxd some_file
. Oto przykład, jak będzie wyglądał pierwszy argument:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
Musisz wziąć środkową sekcję zawierającą bajty (pierwsze 8 kolumn po :
) i przekształcić ją w kod powłoki, usuwając wszelkie białe znaki, a następnie umieszczając \x
przed każdym bajtem.
Oto, jakie powinny być dane wyjściowe dla powyższego wejścia (ignorując inne argumenty):
\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e\x58\x58\x58\x58\x59\x59\x59\x59
Możesz założyć, że pierwszy argument zawsze będzie prawidłowym wyjściem xxd, uruchamianym bez argumentów innych niż nazwa pliku.
Twój wynik powinien być również ciągiem, w którym odwrotne ukośniki są dosłowne, a nie jako znaki specjalne. Kiedy mówię „\ x65”, nie mówię o bajcie 0x65, ani nawet o literze „A”. W kodzie będzie to ciąg „\ x65”.
Drugi argument określa, gdzie na wyjściu xxd powinien się rozpocząć kod powłoki, a trzeci określa, gdzie powinien się kończyć. Jeśli trzeci argument to -1
, zakończy się na końcu wyjścia xxd. Drugi i trzeci argument również zawsze będą nieujemne, z wyjątkiem sytuacji, gdy trzeci jest-1
Oto kilka przypadków testowych:
Argument 1:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
Argument 2 7
:, Argument 3: e
(oba są łańcuchami reprezentującymi liczby szesnastkowe)
Wynik: \xc9\xcd\x80\xeb\x16\x5b\x31\xc0
Argument 1:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
Argument 2 0
:, Argument 3:2e
Wynik: \x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e
Argument 1:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
Argument 2 a
:, Argument 3:-1
Wynik: \xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e\x58\x58\x58\x58\x59\x59\x59\x59
Wygrywa kod z najmniejszą liczbą bajtów. Zwycięzca zostanie ogłoszony za siedem dni, 15 sierpnia 2016 r. (Ale późniejsze zgłoszenia są nadal mile widziane).
Aktualizacja
Gratulacje dla @Adnan za zwycięstwo!
źródło
~
Zamiast\x7e
. Czy możemy wrócić\t
zamiast\x09
?7
wygląda na indeks zerowy ie
jest indeksem opartym na jednym (e-7=7
ale w twoich wynikach jest 8 kodów szesnastkowych), czy coś przeoczyłem?Odpowiedzi:
05AB1E ,
3938 bajtówDane wejściowe w formularzu:
Kod:
Wyjaśnienie:
Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .
źródło
Bash + coreutils + xxd,
737169 bajtówOczekuje zrzutu heksowego na STDIN i start / end jako argumenty wiersza poleceń.
Spowoduje to wydrukowanie niektórych ostrzeżeń do STDERR, co jest domyślnie dozwolone.
źródło
xxd
z ich rozwiązania!16#
z0x
?xxd
coś, ale wydaje się, że działa wszędzie.0xn
stylów szesnastkowych i0m
ósemkowych: gnu.org/software/bash/manual/bash.html#Shell-Arithmetic .echo $[0x2a] $[052]
.JavaScript, 84 bajty
Objaśnienie: Usuwa wszystkie niechciane części zrzutu, dołącza
\x
do każdej pary heksów, a następnie wyodrębnia pożądaną część wyniku.||u
służy do konwersji zera uzyskanego przez zwiększenie-1
parametru, naundefined
który jest magiczna wartość, która powodujeslice
wycięcie do końca łańcucha. 101 bajtów, jeślif
it
są ciągami cyfr szesnastkowych:źródło
(s,f,t,u)=>
możesz zrobićs=>f=>t=>u=>
, aby zaoszczędzić kilka bajtów.u
musi to być dodatkowy parametr i nie można go curry.Rubinowy:
9089877963 bajtów-2 bajty dzięki @addison
-8 bajtów dzięki @PiersMainwaring
Zobacz testy na repl.it: https://repl.it/Cknc/5
źródło
.join
ze*""
aby zaoszczędzić 2 bajtów..map{|h|h.to_i(16)}
z.map(&:hex)
zaoszczędzić 8 więcej bajtów!.hex
argumentów!Galaretka ,
4844 bajtówOczekuje to, że zrzut heksadecymalny jest jedynym argumentem wiersza poleceń, a punkty końcowe i początkowe na STDIN, w tej kolejności, oddzielone linią.
Wypróbuj online!
źródło
PowerShell v2 +,
175157142133129 bajtówStaje wejściowego
$a
,$b
,$c
z$a
albo jako znak nowego oddzielone łańcucha, lub PowerShell`n
postaci oddzielającej linii. Ustawiamy ciąg pomocnika$z
jako mocno przetworzony$a
w następujący sposób -Najpierw
-split
na nowych liniach, następnie dla każdej linii|%{...}
przecinamy środkową sekcję[10..48]
, używamy-ne32
do usuwania spacji,-join
to z powrotem w jeden długi ciąg,-split
to na co dwa znaki (zachowując dwa znaki), i-ne''
do usuwania pustych elementów. Powoduje to tablicę dwuelementowych ciągów, takich jak('31','c0','b0'...)
.Następnie kroimy na tę tablicę na podstawie
$b
rzutowania za pomocą operatora szesnastkowego do wartości$c
. Musimy tutaj użyć pseudo-trójki, która wyjaśnia, czy$c
jest,-1
czy nie. Jeśli tak, wybieramy.count
(tzn. Element końcowy) z$z
. W przeciwnym razie po prostu dodamy0x
operator szesnastkowy za$c
pomocą łańcucha. Zauważ, że jest to indeksowane zero.W tym wycinku tablicy elementy są
-join
edytowane razem z literałem,\x
tworząc jeden ciąg. Jest to poprzedzone kolejnym dosłownym tekstem,\x
a wynik pozostaje w przygotowaniu. Drukowanie jest niejawne.Przykład
źródło
Galaretka ,
393837 bajtówWypróbuj online!
Teraz bije 05AB1E! (pomimo braku wbudowanego „konwertuj z szesnastkowego”)
Taki sam format wejściowy jak rozwiązanie Dennisa .
Użyj
Ɱ
, która jest nową funkcją (skrót odЀ
). Bez niego zajęłoby to 38 bajtów.źródło
Perl, 114 bajtów
Argumenty podane w wierszu poleceń jako cytowany ciąg, po którym następują dwie liczby. Liczby są pobierane w systemie dziesiętnym (wiem, że w przykładach użyto hexa, ale nie podano go w poście)
Technicznie działa tylko na danych wejściowych o wielkości do 2 ^ 21 bajtów, ponieważ metoda podłańcuchowa perla jest głupia
źródło
7
doe
powinno skutkować ciąg o długości 32Python, 140 bajtów
https://repl.it/ClB3
Dzieli oryginalny ciąg i zrzuca elementy, jeśli mają mniej niż pięć znaków, poprzedza
\x
i kroi według drugiego i trzeciego argumentu.Wersja 162-bajtowa, jeśli musimy obsługiwać inne typy danych wyjściowych nieokreślone przez pytanie:
źródło
00000030: 5858 58 XXX
ponieważ wyciągnie ostatnią porcję i otrzymasz coś takiego\x58\x58\x58\xXX\xX
.xxd
zamiast tego można użyć innego wyjścia. „Oto przykład, jak będzie wyglądał pierwszy argument:”Python 2 i 3 -
164 162 150 146 134150 bajtówTeraz akceptuje ciągi szesnastkowe dla drugiego i trzeciego argumentu.
źródło
Python 3.5, 125 bajtów
Nie golfowany:
źródło