Wprowadzenie
Jak niektórzy z was mogą wiedzieć, adresy URL faktycznie zawierają listę znaków, które robią specjalne rzeczy. Na przykład, /
postać oddziela części adresu URL, a ?
, &
i =
znaki są używane do przekazywania parametrów zapytania do serwera. W rzeczywistości nie jest kilka znaków z funkcji specjalnych: $&+,/:;=?@
. Kiedy musisz użyć tych znaków w adresie URL z jakiegokolwiek innego powodu oprócz funkcji specjalnych, musisz zrobić coś, co nazywa się kodowaniem procentowym .
Kodowanie procentowe polega na pobraniu wartości szesnastkowej znaku i wstawieniu %
znaku na początek. Na przykład znak ?
będzie zakodowany jako %3F
, a znak &
będzie zakodowany jako %26
. W szczególności w adresie URL pozwala to wysyłać te znaki jako dane za pośrednictwem adresu URL bez powodowania problemów z analizą. Twoim wyzwaniem będzie pobranie ciągu znaków i kodowanie procentowe wszystkich znaków, które muszą zostać zakodowane.
Wyzwanie
Napisz program lub funkcję, która pobiera pojedynczy ciąg znaków składający się ze znaków ze znakami 00-FF (ASCII i rozszerzone znaki ASCII). W razie potrzeby będziesz musiał wyprowadzać lub zwracać ten sam ciąg znaków z kodowaniem procentowym każdego znaku. Wbudowane, które wykonują to zadanie, nie są dozwolone, podobnie jak standardowe luki. Dla porównania, oto lista wszystkich znaków, które muszą być zakodowane procentowo:
- Znaki kontrolne (Codepoints 00-1F i 7F)
- Rozszerzone znaki ASCII (Codepoints 80-FF)
- Znaki zastrzeżone (
$&+,/:;=?@
tj. Punkty kodowe 24, 26, 2B, 2C, 2F, 3A, 3B, 3D, 3F, 40) - Niebezpieczne znaki (
" <>#%{}|\^~[]`
tj. Współrzędne kodu 20, 22, 3C, 3E, 23, 25, 7B, 7D, 7C, 5C, 5E, 7E, 5B, 5D, 60)
Oto ta sama lista, ale zamiast niej jako dziesiętne punkty kodowe:
0-31, 32, 34, 35, 36, 37, 38, 43, 44, 47, 58, 59, 60, 62, 61, 63, 64, 91, 92, 93, 94, 96, 123, 124, 125, 126, 127, 128-255
To jest kod golfowy, więc wygrywa najkrótszy kod w bajtach (lub zatwierdzona alternatywna metoda punktacji)!
Przypadki testowe
http://codegolf.stackexchange.com/ => http%3A%2F%2Fcodegolf.stackexchange.com%2F
[@=>]{#} => %5B%40%3D%3E%5D%7B%23%7D
Test String => Test%20String
ÑÉÐÔ® => %D1%C9%D0%D4%AE
=> %0F%16%7F (Control characters 0F, 16, and 7F)
¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ => %80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF (Extended ASCII characters 80-FF)
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ => %20!%22%23%24%25%26'()*%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E
EF
nie zawiera znaku zapytania.Odpowiedzi:
Pyth,
30 2826 bajtówspróbuj online
Wyjaśnienie
CG
Jest to trik , który generuje ogromną liczbę, która zawiera wszystkie możliwe cyfry. Jest to idealne, ponieważ nie dbamy o duplikaty podczas sprawdzania, czy łańcuch jest w innym.źródło
A-Za-z0-9
. Na przykład.
powinien zostać zachowany, a nie przetłumaczony na%2E
. (cc: @GamrCorps)Vim, 67 bajtów / naciśnięć klawiszy
Zauważ, że
<cr>
reprezentuje klawisz Enter, np.0x0D
Który jest pojedynczym bajtem.To dość proste rozwiązanie. Wyjaśnienie:
Te
printf("%02x",char2nr(submatch(0)))
śmieci są strasznie niemiłe .źródło
printf("%02x",char2nr(submatch(0)))
śmieci są strasznie niemiłe” i wyjątkowo zuchwałePerl, 40 bajtów
39 bajtów kodu +
-p
.Trochę kiepski, ale myślę, że to najkrótsze rozwiązanie ...
Stosowanie
źródło
Julia, 47 bajtów
Wypróbuj online!
źródło
Python 3, 92 bajty
5 bajtów dzięki orlp.
1 bajt dzięki Sp3000.
Ideone to!
źródło
re.match("[!'()*.0-9A-Za-z_-]",c)and c or'%%%02X'%ord(c)
\w
zawiera rozszerzony ASCII'()*
->'-*
\w
działa z opcją256
(re.ASCII
): ideone . Zdecydowanie działa w Pythonie 3 na ideone i powinien działać zu"..."
ciągami znaków w Pythonie 2, ale wydaje się, że ideone robi z tym funky fajne rzeczy (np.print len(u"ÑÉÐÔ®")
Daje 10 na ideone, ale 5 na repl.it i moim komputerze, mimo że wszystkie są w wersji 2.7. 10)C, 83 bajty
źródło
Python, 86 bajtów
Port mojej odpowiedzi C.
źródło
Rubinowy, 37 + 3 = 40 bajtów
Uruchom z
-p
(3 dodatkowymi bajtami), np .$ ruby -p percent_encode.rb
:źródło
Galaretka ,
2827 bajtówTo jest link monadyczny. Wypróbuj online!
Jak to działa
źródło
Haskell,
201179178127119 bajtówNie golfowany:
źródło
where
, zmienićif
w strażników, uczynić e stronnym, stracić ostatni argumentshowHex
, wstawićp
, wstawićs
, stracić podpis, zmienić kolejnośćelem
i stracić jeszcze więcej białych znaków. Jako pierwsze przybliżenie doszedłem w ten sposób do 118.No instance for (Foldable t0) arising from a use of ‘foldr’
. Mówi, że typ funkcji jest niejednoznaczny, co powoduje wywnioskowane wiązanief :: t0 Char -> [Char]
. Po drugie, nie mogłem usunąć argumentu showHex z pustego ciągu, ponieważ zwraca on ShowS, który jest aliasem typuString -> String
wymagającym pustego ciągu.ShowS
bierze String ... ale masz jeden: ten, który dodajesz(++)
. Możesz więc stracić oba jednocześnie. Właśnie tak toShowS
wygląda. Nie pojawia się błąd typu, więc myślę, że to kwestia wersji? Dwie inne rzeczy, które do tej pory zauważyłem:otherwise
zawsze można je zastąpić1<2
(skrótTrue
), ale jeśli wrócisz do nichif
, możesz wstawiće
i usunąć wszystkie nazwiska. I nawet zamień krotnie w aconcatMap
, tj(>>=)
. Nie oszczędza dużo, ale przynajmniej trochę. Może również rozwiązać błąd typu.Python 2, 78 bajtów
Bardziej ładnie sformatowane:
źródło
SQF ,
199176Używając formatu pliku jako funkcji:
Zadzwoń jako
"STRING" call NAME_OF_COMPILED_FUNCTION
źródło
PowerShell v2 +, 146 bajtów
Długo, ponieważ chciałem pokazać inne podejście, niż tylko kopiowanie i wklejanie tego samego łańcucha wyrażeń regularnych, którego używa każdy inny.
Zamiast tego przeglądamy każdy punkt kodu, który musi być zakodowany procentowo, i wykonujemy literał
-replace
na łańcuchu wejściowym przy$n
każdej iteracji (ponowne zapisywanie z powrotem do$n
). Następnie musimy wziąć pod uwagę dwa znaki specjalne, które wymagają ucieczki,\
a^
więc są one w osobnych-replace
elementach na końcu. Ponieważ nie zapisaliśmy ponownie tego ostatniego ciągu, pozostaje on w potoku, a drukowanie jest niejawne.źródło
16/32-bitowy zestaw x86, 73 bajty
Kod bajtowy:
Demontaż:
Wywołaj za pomocą:
- esi = wskaźnik do bufora zawierającego ciąg źródłowy;
- edi = wskaźnik do bufora, który odbiera zakodowany ciąg;
- ecx = długość ciągu źródłowego.
źródło