Вступление
Как некоторые из вас могут знать, URL-адреса на самом деле имеют список символов, которые делают особые вещи. Например, /
символ отделяет части URL, и ?
, &
и =
символы используются для передачи запроса параметров на сервер. В самом деле, есть куча символов с помощью специальных функций: $&+,/:;=?@
. Когда вам нужно использовать эти символы в URL-адресе по любой другой причине, кроме специальных функций, вы должны выполнить то, что называется процентным кодированием .
Процент кодирования - это когда вы берете шестнадцатеричное значение %
символа и добавляете символ к его началу. Например, символ ?
будет закодирован как %3F
, а символ &
закодирован как %26
. В частности, в URL-адресе это позволяет отправлять эти символы в виде данных через URL-адрес, не вызывая проблем с анализом. Ваша задача - взять строку и кодировать в процентах все символы, которые необходимо кодировать.
Соревнование
Вы должны написать программу или функцию, которая принимает одну строку, состоящую из символов с кодовыми точками 00-FF (символы ASCII и Extended ASCII). Затем вам необходимо будет вывести или вернуть одну и ту же строку с каждым символом, закодированным в процентах, если это необходимо. Встроенные модули, которые выполняют эту задачу, не допускаются, как и стандартные лазейки. Для справки, вот список каждого символа, который должен быть в процентах:
- Управляющие символы (кодовые точки 00-1F и 7F)
- Расширенные символы ASCII (кодовые точки 80-FF)
- Зарезервированные символы (
$&+,/:;=?@
т. Е. Кодовые точки 24, 26, 2B, 2C, 2F, 3A, 3B, 3D, 3F, 40) - Небезопасные символы (
" <>#%{}|\^~[]`
т. Е. Кодовые точки 20, 22, 3C, 3E, 23, 25, 7B, 7D, 7C, 5C, 5E, 7E, 5B, 5D, 60)
Вот тот же список, но вместо этого как список десятичных кодовых точек:
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
Это кодовый гольф, поэтому выигрывает самый короткий код в байтах (или одобренный альтернативный метод подсчета очков)!
Тестовые случаи
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
не содержит вопросительный знак.Ответы:
Pyth,
30 2826 байтпопробуйте это онлайн
объяснение
CG
является такой трюк , которые генерируют огромное количество , которое содержит все возможные цифры. Это прекрасно, так как нам не нужны дубликаты при проверке, находится ли строка в другой.источник
A-Za-z0-9
. Например,.
должен быть сохранен, а не переведен в%2E
. (cc: @GamrCorps)Vim, 67 байт / нажатий клавиш
Обратите внимание, что
<cr>
представляет ключ ввода, например,0x0D
который является одним байтом.Это довольно простое решение. Объяснение:
Этот
printf("%02x",char2nr(submatch(0)))
мусор ужасно негольфителен .источник
printf("%02x",char2nr(submatch(0)))
мусор ужасно нечистоплотный» и чрезвычайно хакерскийPerl, 40 байт
39 байт код +
-p
.Немного отстой, но я думаю, что это самое короткое решение ...
использование
источник
Юлия, 47 байт
Попробуйте онлайн!
источник
Python 3, 92 байта
5 байт благодаря orlp.
1 байт благодаря Sp3000.
Идео это!
источник
re.match("[!'()*.0-9A-Za-z_-]",c)and c or'%%%02X'%ord(c)
\w
включает расширенный ASCII'()*
->'-*
\w
работает с опцией256
(re.ASCII
): Ideone . Он определенно работает в Python 3 на ideone, и он должен работать соu"..."
строками в Python 2, но ideone, кажется, делает что-то необычное с последним (например,print len(u"ÑÉÐÔ®")
дает 10 на ideone, но 5 на repl.it и моем компьютере, несмотря на то, что все равно 2.7. 10)C 83 байта
источник
Python, 86 байт
Порт моего C ответа.
источник
Рубин, 37 + 3 = 40 байт
Выполнить с
-p
(3 дополнительных байта), например$ ruby -p percent_encode.rb
:источник
Желе ,
2827 байтЭто монадическая ссылка. Попробуйте онлайн!
Как это устроено
источник
Haskell,
201179178127119 байтUngolfed:
источник
where
, превратитьif
в охранников, сделать частичным, потерять последний аргументshowHex
, встроенныйp
, встроенныйs
, потерять подпись, изменить порядокelem
и потерять еще больше пробелов. В первом приближении я опустился до 118 таким образом.No instance for (Foldable t0) arising from a use of ‘foldr’
. Это говорит о том, что тип функции неоднозначен, что приводит к предполагаемому связываниюf :: t0 Char -> [Char]
. И, во-вторых, я не смог удалить аргумент пустой строки из showHex, так как он возвращает ShowS, который является псевдонимом типа дляString -> String
такой необходимости пустой строки.ShowS
принимает строку ... но у вас есть одна: та, с которой вы добавляете(++)
. Таким образом, вы можете потерять оба одновременно. Вот почему на самом делеShowS
выглядит именно так. Я не получаю ошибку типа, так что я думаю, что это версия версии? К настоящему времени я заметил еще две вещи:otherwise
всегда можно заменить на1<2
(сокращениеTrue
), но если вы вернетесьif
вместо этого, вы можете вставитьe
и удалить все имена. И даже превратить створку вconcatMap
, т.е.(>>=)
. Не много экономит, но хоть немного. Может решить и ошибку типа тоже.Python 2, 78 байт
Более красиво отформатирован:
источник
SQF ,
199176Использование формата «функция как файл»:
Позвонить как
"STRING" call NAME_OF_COMPILED_FUNCTION
источник
PowerShell v2 +, 146 байт
Долго, потому что я хотел показать другой подход, а не просто копировать и вставлять ту же строку регулярного выражения, которую используют все остальные.
Вместо этого здесь мы перебираем каждую кодовую точку, которая должна кодироваться в процентах, и делаем литерал
-replace
для входной строки$n
каждую итерацию (повторное сохранение обратно в$n
). Затем нам нужно учесть два специальных символа, которые нужно экранировать,\
и^
, таким образом, они находятся в отдельных-replace
элементах в конце. Поскольку мы не сохранили эту последнюю строку, она остается в конвейере, и печать неявна.источник
16/32-битная сборка x86, 73 байта
Байт-код:
Разборка:
Вызов с:
- esi = указатель на буфер, который содержит исходную строку;
- edi = указатель на буфер, который получает закодированную строку;
- ecx = длина исходной строки.
источник