Einführung
Wie einige von Ihnen vielleicht wissen, enthalten URLs tatsächlich eine Liste von Zeichen, die bestimmte Aufgaben ausführen. Zum Beispiel kann die /
trennt Charakter Teile der URL, und die ?
, &
und =
werden Zeichen verwendet , um Abfrageparameter an den Server übergeben. In der Tat gibt es eine Reihe von Zeichen mit Sonderfunktionen: $&+,/:;=?@
. Wenn Sie diese Zeichen in der URL aus einem anderen Grund als den Sonderfunktionen verwenden müssen, müssen Sie eine sogenannte Prozentcodierung durchführen .
Prozentcodierung ist, wenn Sie den Hexadezimalwert eines Zeichens nehmen und ein %
Zeichen an den Anfang des Zeichens stellen. Beispielsweise ?
würde das Zeichen wie folgt codiert %3F
und das Zeichen &
würde wie folgt codiert %26
. In einer URL können Sie diese Zeichen als Daten über die URL senden, ohne dass Analyseprobleme auftreten. Ihre Herausforderung besteht darin, eine Zeichenfolge zu verwenden und alle Zeichen, die codiert werden müssen, in Prozent zu codieren.
Die Herausforderung
Sie müssen ein Programm oder eine Funktion schreiben, die eine einzelne Zeichenfolge enthält, die aus Zeichen mit den Codepunkten 00-FF (ASCII- und Extended ASCII-Zeichen) besteht. Sie müssen dann bei Bedarf für jedes Zeichen die gleiche Zeichenfolge in Prozent ausgeben oder zurückgeben. Built-Ins, die diese Aufgabe erfüllen, sind nicht zulässig, und es handelt sich auch nicht um Standardlücken. Als Referenz finden Sie hier eine Liste aller Zeichen, die in Prozent codiert werden müssen:
- Steuerzeichen (Codepunkte 00-1F und 7F)
- Erweiterte ASCII-Zeichen (Codepoints 80-FF)
- Reservierte Zeichen (
$&+,/:;=?@
dh Codepunkte 24, 26, 2B, 2C, 2F, 3A, 3B, 3D, 3F, 40) - Unsichere Zeichen (
" <>#%{}|\^~[]`
dh Codepunkte 20, 22, 3C, 3E, 23, 25, 7B, 7D, 7C, 5C, 5E, 7E, 5B, 5D, 60)
Hier ist die gleiche Liste, aber stattdessen als Liste der Dezimalcodepunkte:
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
Dies ist Codegolf, also gewinnt der kürzeste Code in Bytes (oder die genehmigte alternative Bewertungsmethode)!
Testfälle
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
enthält kein Fragezeichen.Antworten:
Pyth,
30 2826 Bytesversuche es online
Erläuterung
CG
ist dieser Trick , der eine riesige Zahl generiert, die alle möglichen Ziffern enthält. Dies ist perfekt, da Duplikate nicht berücksichtigt werden, wenn geprüft wird, ob sich eine Zeichenfolge in einer anderen befindet.quelle
A-Za-z0-9
. Beispielsweise.
sollte beibehalten werden, anstatt übersetzt zu werden%2E
. (cc: @GamrCorps)Vim, 67 Bytes / Tastenanschläge
Beachten Sie, dass dies
<cr>
die Eingabetaste darstellt, z. B.0x0D
ein einzelnes Byte.Dies ist eine ziemlich einfache Lösung. Erläuterung:
Dieser
printf("%02x",char2nr(submatch(0)))
Müll ist schrecklich ungolfisch .quelle
printf("%02x",char2nr(submatch(0)))
Müll ist schrecklich ungolfig" und extrem hackyPerl, 40 Bytes
39 Byte Code +
-p
.Ein bisschen lahm, aber ich denke, es ist die kürzeste Lösung ...
Verwendung
quelle
Julia, 47 Bytes
Probieren Sie es online!
quelle
Python 3, 92 Bytes
5 bytes dank orlp.
1 Byte dank Sp3000.
Ideone es!
quelle
re.match("[!'()*.0-9A-Za-z_-]",c)and c or'%%%02X'%ord(c)
\w
enthält erweiterte ASCII'()*
->'-*
\w
funktioniert mit der256
(re.ASCII
) Option: ideone . Es funktioniert definitiv in Python 3 auf ideone und das auch sollte mitu"..."
Strings in Python 2 funktionieren, aber Ideone scheint irre Dinge mit letzterem zu machen (z. B.print len(u"ÑÉÐÔ®")
gibt 10 auf Ideone , 5 auf repl.it und meinem Computer, obwohl alles 2.7 ist. 10)C 83 Bytes
quelle
Python, 86 Bytes
Port meiner C-Antwort.
quelle
Ruby, 37 + 3 = 40 Bytes
Führen Sie mit
-p
(3 zusätzliche Bytes) wie folgt aus$ ruby -p percent_encode.rb
:quelle
Jelly ,
2827 BytesDies ist eine monadische Verbindung. Probieren Sie es online!
Wie es funktioniert
quelle
Haskell,
201179178127119 BytesUngolfed:
quelle
where
, dasif
in Wachen verwandeln , es partiell machen, das letzte Argument vonshowHex
, Inlinep
, Inlines
, die Signatur verlieren, das neu anordnenelem
und noch mehr Leerzeichen verlieren. In erster Näherung bin ich auf diese Weise auf 118 gekommen.No instance for (Foldable t0) arising from a use of ‘foldr’
. Es besagt, dass der Typ der Funktion nicht eindeutig ist, was zu einer gefolgerten Bindung von führtf :: t0 Char -> [Char]
. Und zweitens konnte ich das leere Zeichenfolgenargument nicht aus showHex entfernen, da es ein ShowS zurückgibt, das ein Typ-Alias ist, umString -> String
die leere Zeichenfolge zu benötigen.ShowS
braucht einen String ... aber du hast einen: den, den du hinzufügst(++)
. So können Sie beide gleichzeitig verlieren. DasShowS
sieht eigentlich so aus. Ich bekomme keinen Tippfehler, also ist es wohl eine Versionssache? Zwei andere Dinge, die mir mittlerweile aufgefallen sind:otherwise
Kann immer durch1<2
(eine Abkürzung fürTrue
) ersetzt werden, aber wenn Sie zu zurückkehren,if
können Siee
alle Namen inline setzen und löschen. Und sogar die Falte in einconcatMap
, dh ein(>>=)
. Spart nicht viel, aber wenigstens ein bisschen. Könnte auch den Tippfehler beheben.Python 2, 78 Bytes
Schöner formatiert:
quelle
SQF ,
199176Verwenden des Formats "Funktion als Datei":
Anrufen als
"STRING" call NAME_OF_COMPILED_FUNCTION
quelle
PowerShell v2 +, 146 Byte
Lange, weil ich einen anderen Ansatz zeigen wollte, als nur die gleiche Regex-Zeichenfolge einzufügen, die alle anderen verwenden.
Statt hier, wir Schleife durch jeden Code Punkt, muss Prozent-codiert sein, und ein wörtliche tun
-replace
auf der Eingabezeichenfolge$n
jede Iteration (re sparend wieder in$n
). Dann müssen wir die zwei Sonderzeichen berücksichtigen, die maskiert werden müssen,\
und^
diese befinden sich-replace
am Ende in separaten Elementen. Da wir den letzten String nicht erneut gespeichert haben, verbleibt er in der Pipeline und das Drucken ist implizit.quelle
16/32-Bit x86-Assembly, 73 Byte
Byte-Code:
Demontage:
Aufruf mit:
- esi = Zeiger auf Puffer, der den Quelltext enthält;
- edi = Zeiger auf den Puffer, der den codierten String empfängt;
- ecx = Länge der Quellzeichenfolge.
quelle