introduction
Comme certains d'entre vous le savent peut-être, les URL ont en fait une liste de caractères qui font des choses spéciales. Par exemple, le /
caractère sépare les parties de l'URL, et ?
, &
et les =
caractères sont utilisés pour passer des paramètres de requête au serveur. En fait, il y a un tas de personnages avec des fonctions spéciales: $&+,/:;=?@
. Lorsque vous devez utiliser ces caractères dans l'URL pour toute autre raison que les fonctions spéciales, vous devez faire quelque chose appelé encodage en pourcentage .
L'encodage en pourcentage consiste à prendre la valeur hexadécimale d'un %
caractère et à ajouter un caractère au début de celui-ci. Par exemple, le caractère ?
serait codé comme %3F
et le caractère &
serait codé comme %26
. Dans une URL en particulier, cela vous permet d'envoyer ces caractères sous forme de données via l'URL sans provoquer de problèmes d'analyse. Votre défi sera de prendre une chaîne et de coder en pourcentage tous les caractères qui doivent être codés.
Le défi
Vous devez écrire un programme ou une fonction qui accepte une seule chaîne composée de caractères avec des points de code 00-FF (caractères ASCII et ASCII étendus). Vous devrez ensuite générer ou renvoyer la même chaîne avec chaque caractère codé en pourcentage si nécessaire. Les fonctions intégrées qui accomplissent cette tâche ne sont pas autorisées, pas plus que les failles standard. Pour référence, voici une liste de chaque caractère qui doit être encodé en pourcentage:
- Caractères de contrôle (Codepoints 00-1F et 7F)
- Caractères ASCII étendus (Codepoints 80-FF)
- Caractères réservés (
$&+,/:;=?@
c'est-à-dire les points de code 24, 26, 2B, 2C, 2F, 3A, 3B, 3D, 3F, 40) - Caractères dangereux (
" <>#%{}|\^~[]`
c'est-à-dire les points de code 20, 22, 3C, 3E, 23, 25, 7B, 7D, 7C, 5C, 5E, 7E, 5B, 5D, 60)
Voici la même liste, mais à la place comme une liste de points de code décimaux:
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
C'est le golf de code, donc le code le plus court en octets (ou la méthode de notation alternative approuvée) gagne!
Cas de test
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
ne contient pas le point d'interrogation.Réponses:
Pyth,
30 2826 octetsessayez-le en ligne
Explication
CG
est cette astuce qui génère un nombre énorme qui contient tous les chiffres possibles. C'est parfait, car nous ne nous soucions pas des doublons lorsque nous vérifions si une chaîne se trouve dans une autre.la source
A-Za-z0-9
. Par exemple,.
doit être conservé plutôt que traduit en%2E
. (cc: @GamrCorps)Vim, 67 octets / frappes
Notez que cela
<cr>
représente la touche Entrée, par exemple0x0D
qui est un seul octet.Il s'agit d'une solution assez simple. Explication:
Ces
printf("%02x",char2nr(submatch(0)))
ordures sont terriblement impies .la source
printf("%02x",char2nr(submatch(0)))
ordures sont terriblement impies" et extrêmement hackyPerl, 40 octets
Code de 39 octets +
-p
.Un peu boiteux, mais je pense que c'est la solution la plus courte ...
Usage
la source
Julia, 47 octets
Essayez-le en ligne!
la source
Python 3, 92 octets
5 octets grâce à orlp.
1 octet grâce au Sp3000.
Ideone it!
la source
re.match("[!'()*.0-9A-Za-z_-]",c)and c or'%%%02X'%ord(c)
\w
inclut ASCII étendu'()*
->'-*
\w
fonctionne avec l' option256
(re.ASCII
): ideone . Cela fonctionne certainement en Python 3 sur ideone, et cela devrait fonctionner avec desu"..."
chaînes en Python 2, mais ideone semble faire des choses amusantes à ce dernier (par exempleprint len(u"ÑÉÐÔ®")
donne 10 sur ideone mais 5 sur repl.it et mon ordinateur, bien que tous soient 2.7. 10)C, 83 octets
la source
Python, 86 octets
Port de ma réponse C.
la source
Ruby, 37 + 3 = 40 octets
Exécutez avec
-p
(3 octets supplémentaires), comme$ ruby -p percent_encode.rb
:la source
Gelée ,
2827 octetsCeci est un lien monadique. Essayez-le en ligne!
Comment ça fonctionne
la source
Haskell,
201179178127119 octetsNon golfé:
la source
where
, transformer leif
en gardes, rendre partiel, perdre le dernier argument deshowHex
, en lignep
, en lignes
, perdre la signature, réorganiser leelem
et perdre encore plus d'espace. En première approximation, je suis descendu à 118 de cette façon.No instance for (Foldable t0) arising from a use of ‘foldr’
. Il dit que le type de la fonction est ambigu, ce qui entraîne une liaison inférée def :: t0 Char -> [Char]
. Et deuxièmement, je n'ai pas pu supprimer l'argument de chaîne vide de showHex car il renvoie un ShowS, qui est un alias de type pourString -> String
avoir donc besoin de la chaîne vide.ShowS
prend une chaîne ... mais vous en avez une: celle avec laquelle vous ajoutez(++)
. Vous pouvez donc perdre les deux en même temps. C'est en fait pourquoiShowS
ça ressemble à ça. Je ne reçois pas l'erreur de type, donc je suppose que c'est une chose de version? Deux autres choses que j'ai remarquées maintenant:otherwise
peuvent toujours être remplacées par1<2
(un raccourci pourTrue
), mais si vous revenez à laif
place, vous pouvez incorporere
et supprimer tous les noms. Et même transformer le pli en aconcatMap
, c'est-à-dire a(>>=)
. N'économise pas beaucoup, mais au moins un peu. Pourrait également résoudre l'erreur de type.Python 2, 78 octets
Plus joliment formaté:
la source
SQF ,
199176Utilisation du format de fonction en tant que fichier:
Appelez en tant que
"STRING" call NAME_OF_COMPILED_FUNCTION
la source
PowerShell v2 +, 146 octets
Long parce que je voulais montrer une approche différente plutôt que de simplement copier-coller la même chaîne d'expression régulière que tout le monde utilise.
Au lieu de cela ici, nous parcourons chaque point de code qui doit être codé en pourcentage, et faisons un littéral
-replace
sur la chaîne d'entrée à$n
chaque itération (réenregistrant dans$n
). Ensuite, nous devons prendre en compte les deux caractères spéciaux qui doivent être échappés,\
et^
donc ils se trouvent dans des-replace
éléments séparés à la fin. Comme nous n'avons pas réenregistré cette chaîne finale, elle est laissée dans le pipeline et l'impression est implicite.la source
Assemblage x86 16/32 bits, 73 octets
Code d'octet:
Démontage:
Appeler avec:
- esi = pointeur vers le tampon contenant la chaîne source;
- edi = pointeur vers le tampon qui reçoit la chaîne codée;
- ecx = longueur de la chaîne source.
la source