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!
~
Zamiast \x7e
. Czy możemy wrócić \t
zamiast \x09
?
7
wygląda na indeks zerowy i e
jest indeksem opartym na jednym ( e-7=7
ale w twoich wynikach jest 8 kodów szesnastkowych), czy coś przeoczyłem?