Introdução
Como alguns de vocês devem saber, os URLs realmente têm uma lista de caracteres que fazem coisas especiais. Por exemplo, o /
caractere separa as partes do URL, e ?
, &
e =
caracteres são usados para passar parâmetros de consulta para o servidor. Na verdade, há um monte de personagens com funções especiais: $&+,/:;=?@
. Quando você precisar usar esses caracteres na URL por qualquer outro motivo além das funções especiais, precisará fazer algo chamado codificação por cento .
A codificação em porcentagem é quando você pega o valor hexadecimal de um %
caractere e o precede antes do início. Por exemplo, o caractere ?
seria codificado como %3F
e o caractere &
seria codificado como %26
. Em um URL especificamente, isso permite que você envie esses caracteres como dados via URL sem causar problemas de análise. Seu desafio será pegar uma string e codificar em porcentagem todos os caracteres que precisam ser codificados.
O desafio
Você deve escrever um programa ou função que utilize uma única cadeia de caracteres composta por caracteres com pontos de código 00-FF (caracteres ASCII e ASCII estendido). Você precisará gerar ou retornar a mesma string com cada caractere codificado em porcentagem, se necessário. Built-ins que realizam essa tarefa não são permitidos, nem são brechas padrão. Para referência, aqui está uma lista de todos os caracteres que precisam ser codificados em porcentagem:
- Caracteres de controle (Codepoints 00-1F e 7F)
- Caracteres ASCII estendidos (Codepoints 80-FF)
- Caracteres reservados (
$&+,/:;=?@
ou seja, pontos de código 24, 26, 2B, 2C, 2F, 3A, 3B, 3D, 3F, 40) - Caracteres inseguros (
" <>#%{}|\^~[]`
ou seja, pontos de código 20, 22, 3C, 3E, 23, 25, 7B, 7D, 7C, 5C, 5E, 7E, 5B, 5D, 60)
Aqui está a mesma lista, mas como uma lista de pontos de código decimais:
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 é o código golf, pelo que o código mais curto em bytes (ou método de pontuação alternativo aprovado) vence!
Casos de teste
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
não contém o ponto de interrogação.Respostas:
Pitão,
30 2826 bytesexperimente online
Explicação
CG
é esse truque que gera um número enorme que contém todos os dígitos possíveis. Isso é perfeito, pois não nos importamos com duplicatas ao verificar se uma sequência está em outra.fonte
A-Za-z0-9
. Por exemplo,.
deve ser preservado em vez de traduzido para%2E
. (cc: @GamrCorps)Vim, 67 bytes / pressionamentos de tecla
Observe que
<cr>
representa a tecla Enter, por exemplo,0x0D
que é um único byte.Esta é uma solução bastante direta. Explicação:
Aquele
printf("%02x",char2nr(submatch(0)))
lixo é terrivelmente sem graça .fonte
printf("%02x",char2nr(submatch(0)))
lixo é terrivelmente ungolfy" e extremamente hackyPerl, 40 bytes
Código de 39 bytes +
-p
.Um pouco manco, mas acho que é a solução mais curta ...
Uso
fonte
Julia, 47 bytes
Experimente online!
fonte
Python 3, 92 bytes
5 bytes graças ao orlp.
1 byte graças ao Sp3000.
Ideone it!
fonte
re.match("[!'()*.0-9A-Za-z_-]",c)and c or'%%%02X'%ord(c)
\w
inclui ASCII estendido'()*
->'-*
\w
funciona com a opção256
(re.ASCII
): ideone . Definitivamente funciona no Python 3 no ideone, e deve funcionar comu"..."
strings no Python 2, mas o ideone parece fazer coisas divertidas com o último (por exemplo,print len(u"ÑÉÐÔ®")
dá 10 no ideone, mas 5 no repl.it e no meu computador, apesar de todos serem 2,7. 10)C, 83 bytes
fonte
Python, 86 bytes
Porta da minha resposta C.
fonte
Ruby, 37 + 3 = 40 bytes
Execute com
-p
(3 bytes extras), como$ ruby -p percent_encode.rb
:fonte
Geléia ,
2827 bytesEste é um link monádico. Experimente online!
Como funciona
fonte
Haskell,
201179178127119 bytesUngolfed:
fonte
where
, transformar osif
guardas, tornar parcial, perder o último argumento deshowHex
, em linhap
, em linhas
, perder a assinatura, reordenarelem
e perder ainda mais espaço em branco. Como primeira aproximação, desci para 118 dessa maneira.No instance for (Foldable t0) arising from a use of ‘foldr’
. Ele diz que o tipo da função é ambíguo, resultando em uma ligação inferida def :: t0 Char -> [Char]
. E, segundo, não pude remover o argumento da string vazia do showHex, pois ele retorna um ShowS, que é um alias de tipo para aString -> String
necessidade da string vazia.ShowS
pega uma String ... mas você tem uma: a que você está adicionando(++)
. Então você pode perder os dois ao mesmo tempo. É por issoShowS
que parece assim. Não recebo o erro de tipo, então acho que é uma coisa da versão? Duas outras coisas que notei até agora:otherwise
sempre podem ser substituídas por1<2
(uma abreviação deTrue
), mas se você retornar,if
poderá incorporare
e soltar todos os nomes. E até transforme a dobra em aconcatMap
, ie a(>>=)
. Não economiza muito, mas pelo menos um pouco. Também pode resolver o erro de tipo.Python 2, 78 bytes
Mais bem formatado:
fonte
SQF ,
199176Usando o formato de função como um arquivo:
Ligar como
"STRING" call NAME_OF_COMPILED_FUNCTION
fonte
PowerShell v2 +, 146 bytes
Muito tempo porque eu queria mostrar uma abordagem diferente, em vez de apenas copiar e colar a mesma cadeia de caracteres de regex que todo mundo está usando.
Em vez disso, passamos por todos os pontos de código que devem ser codificados em porcentagem e fazemos um literal
-replace
na string de entrada a$n
cada iteração (salvando novamente em$n
). Precisamos considerar os dois caracteres especiais que precisam ser escapados\
e^
, portanto, esses-replace
elementos estão separados no final. Como não salvamos novamente a sequência final, ela é deixada no pipeline e a impressão está implícita.fonte
Conjunto x86 de 16/32 bits, 73 bytes
Código de bytes:
Desmontagem:
Ligue com:
- esi = ponteiro para o buffer que contém a string de origem;
- edi = ponteiro para o buffer que recebe a string codificada;
- ecx = comprimento da cadeia de origem.
fonte