Introducción
Como algunos de ustedes saben, las URL realmente tienen una lista de caracteres que hacen cosas especiales. Por ejemplo, el /
carácter separa las partes de la URL, y el ?
, &
y =
los personajes se utiliza para pasar parámetros de consulta al servidor. De hecho, hay un montón de personajes con funciones especiales $&+,/:;=?@
. Cuando necesite usar estos caracteres en la URL por cualquier otro motivo además de las funciones especiales, debe hacer algo llamado codificación porcentual .
La codificación porcentual es cuando tomas el valor hexadecimal de un %
personaje y antepones un carácter al comienzo del mismo. Por ejemplo, el carácter ?
se codificaría como %3F
, y el carácter &
se codificaría como %26
. En una URL específicamente, esto le permite enviar estos caracteres como datos a través de la URL sin causar problemas de análisis. Su desafío será tomar una cadena y codificar en porcentaje todos los caracteres que deben codificarse.
El reto
Deberá escribir un programa o función que tome una sola cadena que consta de caracteres con puntos de código 00-FF (caracteres ASCII y ASCII extendido). Luego tendrá que generar o devolver la misma cadena con cada carácter codificado porcentual si es necesario. Los elementos integrados que realizan esta tarea no están permitidos, ni las lagunas estándar. Como referencia, aquí hay una lista de todos los caracteres que deben codificarse en porcentaje:
- Caracteres de control (puntos de código 00-1F y 7F)
- Caracteres ASCII extendidos (puntos de código 80-FF)
- Caracteres reservados (
$&+,/:;=?@
es decir, puntos de código 24, 26, 2B, 2C, 2F, 3A, 3B, 3D, 3F, 40) - Caracteres inseguros (
" <>#%{}|\^~[]`
es decir, puntos de código 20, 22, 3C, 3E, 23, 25, 7B, 7D, 7C, 5C, 5E, 7E, 5B, 5D, 60)
Aquí hay una misma lista, pero en cambio como una lista de puntos de código decimales:
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
Este es el código de golf, por lo que gana el código más corto en bytes (o método de puntuación alternativo aprobado).
Casos de prueba
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
no contiene el signo de interrogación.Respuestas:
Pyth,
30 2826 bytespruébalo en línea
Explicación
CG
Es este truco que genera un gran número que contiene todos los dígitos posibles. Esto es perfecto, ya que no nos importan los duplicados al verificar si una cadena está en otra.fuente
A-Za-z0-9
. Por ejemplo,.
debe conservarse en lugar de traducirse a%2E
. (cc: @GamrCorps)Vim, 67 bytes / pulsaciones de teclas
Tenga en cuenta que
<cr>
representa la tecla Intro, p. Ej.0x0D
que es un solo byte.Esta es una solución bastante sencilla. Explicación:
Esa
printf("%02x",char2nr(submatch(0)))
basura es terriblemente fea .fuente
printf("%02x",char2nr(submatch(0)))
basura es terriblemente antipática" y extremadamente hackyPerl, 40 bytes
Código de 39 bytes +
-p
.Un poco cojo, pero creo que es la solución más corta ...
Uso
fuente
Julia, 47 bytes
Pruébalo en línea!
fuente
Python 3, 92 bytes
5 bytes gracias a orlp.
1 byte gracias a Sp3000.
Ideone it!
fuente
re.match("[!'()*.0-9A-Za-z_-]",c)and c or'%%%02X'%ord(c)
\w
incluye ASCII extendido'()*
->'-*
\w
funciona con la opción256
(re.ASCII
): ideone . Definitivamente funciona en Python 3 en ideone, y debería funcionar conu"..."
cadenas en Python 2, pero ideone parece hacer cosas extrañas a este último (por ejemplo,print len(u"ÑÉÐÔ®")
da 10 en ideone pero 5 en repl.it y mi computadora, a pesar de ser 2.7. 10)C, 83 bytes
fuente
Python, 86 bytes
Puerto de mi respuesta C.
fuente
Rubí, 37 + 3 = 40 bytes
Ejecutar con
-p
(3 bytes adicionales), como$ ruby -p percent_encode.rb
:fuente
Jalea ,
2827 bytesEste es un enlace monádico. Pruébalo en línea!
Cómo funciona
fuente
Haskell
201179178127119 bytesSin golf:
fuente
where
, convertir losif
guardias, hacer e parcial, perder el último argumento deshowHex
, en líneap
, en líneas
, perder la firma, reordenarelem
y perder aún más espacio en blanco. Como primera aproximación llegué a 118 de esa manera.No instance for (Foldable t0) arising from a use of ‘foldr’
. Dice que el tipo de la función es ambigua, lo que resulta en un enlace inferido def :: t0 Char -> [Char]
. Y en segundo lugar, no pude eliminar el argumento de la cadena vacía de showHex ya que devuelve un ShowS, que es un alias de tipo para laString -> String
necesidad de la cadena vacía.ShowS
toma una cadena ... pero tienes una: con la que estás agregando(++)
. Entonces puedes perder ambos al mismo tiempo. Eso es realmente por qué seShowS
ve de esa manera. No obtengo el error de tipo, así que supongo que es una cosa de versión. Otras dos cosas que noté por ahora:otherwise
siempre se pueden reemplazar por1<2
(una abreviatura deTrue
), pero si regresas aif
en su lugar puedes alineare
y soltar todos los nombres. E incluso convertir el pliegue en aconcatMap
, es decir, a(>>=)
. No ahorra mucho, pero al menos un poco. También podría resolver el error de tipo.Python 2, 78 bytes
Más bien formateado:
fuente
SQF ,
199176Usando el formato de función como archivo:
Llamar como
"STRING" call NAME_OF_COMPILED_FUNCTION
fuente
PowerShell v2 +, 146 bytes
Mucho tiempo porque quería mostrar un enfoque diferente en lugar de simplemente copiar y pegar la misma cadena de expresiones regulares que todos los demás están usando.
En cambio, aquí, recorremos cada punto de código que debe estar codificado en porcentaje, y hacemos un literal
-replace
en la cadena de entrada$n
cada iteración (volviendo a guardar$n
). Luego, debemos tener en cuenta los dos caracteres especiales que necesitan escapar\
y^
, por lo tanto, están en-replace
elementos separados al final. Como no volvimos a guardar esa cadena final, se dejó en la tubería y la impresión es implícita.fuente
Conjunto x86 de 16/32 bits, 73 bytes
Código de bytes:
Desmontaje
Llame con:
- esi = puntero al búfer que contiene la cadena de origen;
- edi = puntero al búfer que recibe una cadena codificada;
- ecx = longitud de la cadena de origen.
fuente