Giới thiệu
Như một số bạn có thể biết, URL thực sự có một danh sách các ký tự làm những việc đặc biệt. Ví dụ, /
nhân vật tách các phần của URL, và ?
, &
và =
các nhân vật được sử dụng để vượt qua truy vấn các thông số đến máy chủ. Trong thực tế, có một loạt các nhân vật có chức năng đặc biệt : $&+,/:;=?@
. Khi bạn cần sử dụng các ký tự này trong URL vì bất kỳ lý do nào khác ngoài các hàm đặc biệt, bạn phải thực hiện một thứ gọi là mã hóa phần trăm .
Mã hóa phần trăm là khi bạn lấy giá trị thập lục phân của một ký tự và thêm một %
ký tự vào đầu của ký tự đó. Ví dụ, ký tự ?
sẽ được mã hóa thành %3F
và ký tự &
sẽ được mã hóa thành %26
. Trong một URL cụ thể, điều này cho phép bạn gửi các ký tự này dưới dạng dữ liệu qua URL mà không gây ra sự cố phân tích cú pháp. Thử thách của bạn sẽ là lấy một chuỗi và mã hóa phần trăm tất cả các ký tự cần được mã hóa.
Các thách thức
Bạn sẽ viết một chương trình hoặc hàm lấy trong một chuỗi gồm các ký tự có mã số 00-FF (ký tự ASCII và ASCII mở rộng). Sau đó, bạn sẽ phải xuất hoặc trả lại cùng một chuỗi với mỗi ký tự được mã hóa phần trăm nếu cần thiết. Xây dựng hoàn thành nhiệm vụ này là không được phép, cũng không phải là sơ hở tiêu chuẩn. Để tham khảo, đây là danh sách mọi ký tự cần được mã hóa phần trăm:
- Kiểm soát các ký tự (Codepoints 00-1F và 7F)
- Các ký tự ASCII mở rộng (Codepoints 80-FF)
- Các ký tự dành riêng (
$&+,/:;=?@
, tức là các điểm mã 24, 26, 2B, 2C, 2F, 3A, 3B, 3D, 3F, 40) - Các ký tự không an toàn (
" <>#%{}|\^~[]`
ví dụ: mã hóa 20, 22, 3C, 3E, 23, 25, 7B, 7D, 7C, 5C, 5E, 7E, 5B, 5D, 60)
Đây là cùng một danh sách, nhưng thay vào đó là một danh sách các mã số thập phân:
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
Đây là mã golf, vì vậy mã ngắn nhất tính bằng byte (hoặc phương pháp tính điểm thay thế được phê duyệt) sẽ thắng!
Các trường hợp thử nghiệm
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
không chứa dấu hỏi.