pengantar
Seperti yang mungkin Anda ketahui, URL sebenarnya memiliki daftar karakter yang melakukan hal-hal khusus. Sebagai contoh, /
karakter memisahkan bagian-bagian dari URL, dan ?
, &
, dan =
karakter yang digunakan untuk melewati permintaan parameter ke server. Bahkan, ada sekelompok karakter dengan fungsi khusus: $&+,/:;=?@
. Ketika Anda perlu menggunakan karakter ini di URL untuk alasan lain selain fungsi khusus, Anda harus melakukan sesuatu yang disebut pengodean persen .
Persen pengkodean adalah ketika Anda mengambil nilai heksadesimal karakter dan menambahkan %
karakter ke awal. Misalnya, karakter ?
akan dikodekan sebagai %3F
, dan karakter &
akan dikodekan sebagai %26
. Di URL secara khusus, ini memungkinkan Anda untuk mengirim karakter ini sebagai data melalui URL tanpa menyebabkan masalah penguraian. Tantangan Anda adalah mengambil string, dan meng-enkode semua karakter yang perlu dikodekan.
Tantangan
Anda harus menulis program atau fungsi yang menggunakan string tunggal yang terdiri dari karakter dengan codepoint 00-FF (karakter ASCII dan Extended ASCII). Anda kemudian harus menampilkan atau mengembalikan string yang sama dengan setiap karakter persen-disandikan jika perlu. Built-in yang menyelesaikan tugas ini tidak diperbolehkan, juga tidak ada celah standar. Untuk referensi, berikut adalah daftar setiap karakter yang perlu dikodekan persen:
- Kontrol karakter (Codepoints 00-1F dan 7F)
- Karakter ASCII yang diperluas (Codepoints 80-FF)
- Karakter yang dicadangkan (
$&+,/:;=?@
, yaitu titik kode 24, 26, 2B, 2C, 2F, 3A, 3B, 3D, 3F, 40) - Karakter tidak aman (
" <>#%{}|\^~[]`
, yaitu titik kode 20, 22, 3C, 3E, 23, 25, 7B, 7D, 7C, 5C, 5E, 7E, 5B, 5D, 60)
Berikut ini adalah daftar yang sama, tetapi sebagai daftar dari codepoint desimal:
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
Ini golf kode, jadi kode terpendek dalam byte (atau metode penilaian alternatif yang disetujui) menang!
Uji Kasus
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
tidak mengandung tanda tanya.Jawaban:
Pyth,
30 2826 bytecoba online
Penjelasan
CG
adalah trik ini yang menghasilkan sejumlah besar yang berisi semua kemungkinan angka. Ini sempurna, karena kami tidak peduli dengan duplikat ketika memeriksa apakah string ada di string lain.sumber
A-Za-z0-9
. Misalnya,.
harus dilestarikan daripada diterjemahkan%2E
. (cc: @GamrCorps)Vim, 67 byte / penekanan tombol
Catatan yang
<cr>
mewakili tombol enter, misalnya0x0D
yang merupakan byte tunggal.Ini adalah solusi yang cukup mudah. Penjelasan:
Itu
printf("%02x",char2nr(submatch(0)))
sampah sangat ungolfy .sumber
printf("%02x",char2nr(submatch(0)))
Sampah itu sangat ungolfy" dan sangat pekatPerl, 40 byte
39 byte kode +
-p
.Agak timpang, tapi saya pikir itu solusi terpendek ...
Pemakaian
sumber
Julia, 47 byte
Cobalah online!
sumber
Python 3, 92 byte
5 byte berkat orlp.
1 byte berkat Sp3000.
Ide itu!
sumber
re.match("[!'()*.0-9A-Za-z_-]",c)and c or'%%%02X'%ord(c)
\w
termasuk ASCII diperpanjang'()*
->'-*
\w
bekerja dengan opsi256
(re.ASCII
): ideone . Ini pasti bekerja di Python 3 pada ideone, dan itu harus bekerja denganu"..."
string di Python 2, tetapi ideone tampaknya melakukan hal-hal yang funky untuk yang terakhir (misalnyaprint len(u"ÑÉÐÔ®")
memberikan 10 pada ideone tetapi 5 pada repl.it dan komputer saya, meskipun semuanya 2.7. 10)C, 83 byte
sumber
Python, 86 byte
Port jawaban C saya.
sumber
Ruby, 37 + 3 = 40 byte
Jalankan dengan
-p
(3 byte tambahan), seperti$ ruby -p percent_encode.rb
:sumber
Jelly ,
2827 byteIni adalah tautan monadik. Cobalah online!
Bagaimana itu bekerja
sumber
Haskell,
201179178127119 byteTidak Disatukan:
sumber
where
, mengubahif
penjaga menjadi, membuat sebagian, kehilangan argumen terakhir darishowHex
, inlinep
, inlines
, kehilangan tanda tangan, menyusun ulangelem
dan kehilangan lebih banyak spasi. Sebagai perkiraan pertama saya turun ke 118 dengan cara itu.No instance for (Foldable t0) arising from a use of ‘foldr’
. Dikatakan bahwa jenis fungsinya ambigu, menghasilkan pengikatan yang disimpulkanf :: t0 Char -> [Char]
. Dan yang kedua, saya tidak bisa menghapus argumen string kosong dari showHex karena mengembalikan ShowS, yang merupakan jenis alias karenaString -> String
itu membutuhkan string kosong.ShowS
mengambil sebuah String ... tetapi Anda memiliki satu: yang Anda tambahkan(++)
. Jadi, Anda bisa kehilangan keduanya sekaligus. Itulah sebabnya mengapaShowS
terlihat seperti itu. Saya tidak mendapatkan kesalahan ketik, jadi saya kira ini versi versi? Dua hal lain yang saya perhatikan sekarang:otherwise
selalu dapat digantikan oleh1<2
(singkatan untukTrue
), tetapi jika Anda kembali keif
sebaliknya Anda dapat inlinee
dan letakkan semua nama. Dan bahkan mengubah lipatan menjadiconcatMap
, yaitu a(>>=)
. Tidak banyak menabung, tapi setidaknya sedikit. Mungkin bisa mengatasi kesalahan tipe juga.Python 2, 78 byte
Lebih baik diformat:
sumber
SQF ,
199176Menggunakan format fungsi-sebagai-file:
Sebut sebagai
"STRING" call NAME_OF_COMPILED_FUNCTION
sumber
PowerShell v2 +, 146 byte
Lama karena saya ingin menunjukkan pendekatan yang berbeda daripada hanya menyalin-menempel string regex yang sama yang digunakan orang lain.
Alih-alih di sini, kita mengulangi setiap titik kode yang harus dikodekan persen, dan melakukan literal
-replace
pada string input$n
setiap iterasi (menyimpan kembali ke dalam$n
). Maka kita perlu memperhitungkan dua karakter khusus yang perlu melarikan diri,\
dan^
, jadi itu adalah-replace
elemen yang terpisah di akhir. Karena kami tidak menyimpan ulang string terakhir, itu masih ada di jalur pipa dan pencetakan tersirat.sumber
Perakitan x86 16/32-bit, 73 byte
Kode byte:
Membongkar:
Panggil dengan:
- esi = pointer ke buffer yang menampung string sumber;
- edi = pointer ke buffer yang menerima string yang disandikan;
- ecx = panjang string sumber.
sumber