পার্সেন্ট-এনকোড একটি স্ট্রিং


14

ভূমিকা

আপনারা কেউ কেউ হয়ত জানেন, ইউআরএলগুলিতে আসলে অক্ষরের একটি তালিকা থাকে যা বিশেষ কাজ করে। উদাহরণস্বরূপ, /চরিত্র URL এর অংশের আলাদা, এবং ?, &এবং =অক্ষর সার্ভারে ক্যোয়ারী পরামিতি পাস করতে ব্যবহৃত হয়। আসলে বিশেষ ফাংশন দিয়ে অক্ষর একটি গুচ্ছ হল: $&+,/:;=?@। যখন বিশেষ ক্রিয়াকলাপ ছাড়াও অন্য কোনও কারণে আপনাকে এই অক্ষরগুলি ইউআরএলটিতে ব্যবহার করতে হবে, তখন আপনাকে শতাংশ-এনকোডিং বলে কিছু করতে হবে ।

শতকরা এনকোডিং হ'ল আপনি যখন কোনও চরিত্রের হেক্সাডেসিমাল মান নিয়ে যান এবং এর শুরুতে একটি %অক্ষর প্রেন্ডেন্ড করেন । উদাহরণস্বরূপ, চরিত্রটি ?এনকোড হবে %3Fএবং অক্ষরটি &এনকোড হবে %26। বিশেষত একটি ইউআরএলে, এটি আপনাকে পার্সিংয়ের সমস্যা তৈরি না করেই এই অক্ষরগুলি URL হিসাবে ডেটা হিসাবে প্রেরণ করতে দেয়। আপনার চ্যালেঞ্জটি হবে একটি স্ট্রিং নেওয়া এবং এনকোড করা দরকার এমন সমস্ত অক্ষরকে শতাংশ-এনকোড করা।

চ্যালেঞ্জ

আপনি এমন একটি প্রোগ্রাম বা ফাংশন লিখবেন যা কোডডপয়েন্টস 00-এফএফ (এএসসিআইআই এবং বর্ধিত এএসসিআইআই অক্ষর) সহ অক্ষর সমন্বিত একটি একক স্ট্রিংয়ে নেবে। তারপরে আপনাকে প্রয়োজনে প্রতিটি অক্ষর শতকরা-এনকোড সহ একই স্ট্রিংটি আউটপুট দিতে হবে বা ফিরে আসতে হবে। এই কাজটি সম্পাদনকারী বিল্ট-ইনগুলি অনুমোদিত নয় বা মানক ফাঁকও নয়। রেফারেন্সের জন্য, এখানে প্রতিটি অক্ষরের একটি তালিকা রয়েছে যা শতাংশে এনকোড করা দরকার:

  • নিয়ন্ত্রণের অক্ষর (কোডপয়েন্টস 00-1F এবং 7 এফ)
  • প্রসারিত ASCII অক্ষর (কোডপয়েন্টস 80-এফএফ)
  • সংরক্ষিত অক্ষর ( $&+,/:;=?@যেমন 24, 26, 2 বি, 2 সি, 2 এফ, 3 এ, 3 বি, 3 ডি, 3 এফ, 40)
  • অনিরাপদ অক্ষর ( " <>#%{}|\^~[]`যেমন কোড 20, 22, 3 সি, 3 ই, 23, 25, 7 বি, 7 ডি, 7 সি, 5 সি, 5 ই, 7 ই, 5 বি, 5 ডি, 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

আপনার কি এমন একটি টেস্টকেস রয়েছে যা নিয়ন্ত্রণের অক্ষরগুলি দেখায়?
লিকি নুন

পছন্দ করুন
GamrCorps

আমি নিশ্চিত কোডপয়েন্টে EFপ্রশ্ন চিহ্ন নেই।
ব্যবহারকারী48538

@ zyabin101 আপনি কোথায় এটি পেলেন? আমি এটা দেখতে পাচ্ছি না।
GamrCorps

"উদাহরণস্বরূপ, চরিত্রটি%% এফ হিসাবে এনকোড করা হবে ..."
ব্যবহারকারী48538

উত্তর:


2

পাইথ, 30 28 26 বাইট

L?hx+G+rG1CGbb+\%.HCbsmydz

অনলাইনে চেষ্টা করুন

ব্যাখ্যা

L?hx+G+rG1CGbb+\%.HCbsmydz
L?hx+G+rG1CGbb+\%.HCb       First part, L defines the function y(b)
 ?hx+G+rG1CGbb+\%.HCb       ? is the ternary operator
  hx+G+rG1CGb               This part will be evaluated
  hx                        x will find the first occurence of a
                            character in a list. If it doesn't
                            find one, it will return -1. hx then
                            equals 0 (or false).
    +G+rG1CG                The list of allowed characters, a
                            concetanation (+) of the alphabet (G),
                            uppercase alphabet (rG1) and numbers
                            (CG, see below for details)
            b               The character to find in the list
             b              True branch of the ternary operator,
                            the character is allowed and returned.
              +\%.HCb       False branch, convert to hex and add %
                     smydz  The actual program
                      mydz  Map every character in the input (z)
                            using the function y on every d
                     s      Join the array, and implicit print.

CGহয় এই কৌতুক করে একটি বিশাল সংখ্যা সব সম্ভব ডিজিটের রয়েছে উৎপন্ন। এটি নিখুঁত, যেহেতু স্ট্রিং অন্যটিতে রয়েছে কিনা তা পরীক্ষা করার সময় আমরা সদৃশগুলির যত্ন করি না।


এই উত্তরটি প্রশ্নের উত্তরটি পূরণ করে না। কেবলমাত্রের চেয়ে আরও অনুমোদিত চরিত্র রয়েছে A-Za-z0-9। উদাহরণস্বরূপ, .অনুবাদ না করে সংরক্ষণ করা উচিত %2E। (সিসি: @ গ্যামারকর্পস)
ডিএলসাস

3

ভিম, 67 বাইট / কীস্ট্রোক

:s/\c[^a-z!'()*0-9._-]/\='%'.printf("%02x",char2nr(submatch(0)))/g<cr>

নোট যা <cr>প্রবেশ কী উপস্থাপন করে, যেমন 0x0Dএকটি একক বাইট।

এটি একটি দুর্দান্ত সোজা সমাধান। ব্যাখ্যা:

:s/                                                                    "Search and replace
   \c                                                                  "Case-insensitive
     [^a-z!'()*0-9._-]/                                                "A negative range. Matches any character not alphabetc, numeric or in "!'()*0-9._-"
                       \=                                              "Evaluate
                         '%'                                           "a percent sign string
                            .                                          "Concatenated with
                             printf("%02x",char2nr(submatch(0)))       "The hex value of the character we just matched
                                                                /g     "Make this apply to ever match
                                                                  <cr> "Actually run the command

সেই printf("%02x",char2nr(submatch(0)))আবর্জনা মারাত্মকভাবে অস্পষ্ট


"সেই printf("%02x",char2nr(submatch(0)))আবর্জনা মারাত্মকভাবে অসঙ্গতিপূর্ণ" এবং অত্যন্ত হ্যাকি
লিকি নুন

2

পার্ল, 40 বাইট

39 বাইট কোড + -p

কিছুটা খোঁড়া, তবে আমি মনে করি এটি সবচেয়ে সংক্ষিপ্ত সমাধান ...

s/[^!'()*-.\w]/sprintf'%%%02x',ord$&/ge

ব্যবহার

echo -n ' !"#$%&'\''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqstuvwxyz{|}~' | perl -pe "s/[^'()*-.\w]/sprintf'%%%02x',ord$&/ge"
%20%21%22%23%24%25%26'()*+,-.%2f0123456789%3a%3b%3c%3d%3e%3f%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5b%5c%5d%5e_%60abcdefghijklmnopqstuvwxyz%7b%7c%7d%7e


1

পাইথন 3, 92 বাইট

Orlp ধন্যবাদ 5 বাইট।

1 বাইট Sp3000 ধন্যবাদ।

import re;lambda s:''.join(re.match("[!'-*.0-9\w-]",c,256)and c or'%%%02X'%ord(c)for c in s)

আইডিয়ন!


re.match("[!'()*.0-9A-Za-z_-]",c)and c or'%%%02X'%ord(c)
অরল্প

@ এসপি 3000 এর \wমধ্যে বর্ধিত এএসসিআইআই অন্তর্ভুক্ত রয়েছে
লিকি নুন

এছাড়াও, '()*->'-*
Sp3000

আমি মনে করি ( ) বিকল্পটি: আদর্শের\w সাথে কাজ করে । এটি অবশ্যই পাইডন 3 তে আইডিয়োনে কাজ করে এবং এটি পাইথন 2-এ স্ট্রিংয়ের সাথে কাজ করা উচিত , তবে আইডোনটি মনে হয় শেষেরগুলিকে মজার জিনিসগুলি দেয় (উদাহরণস্বরূপ আইডোনকে 10 দেয় তবে repl.it এবং 5 টি কম্পিউটারে 5 দেয় , সমস্ত কিছু 2.7 হওয়া সত্ত্বেও)। 10)256re.ASCIIu"..."print len(u"ÑÉÐÔ®")
Sp3000

1

সি, 83 বাইট

f(char*p){for(;*p;++p)printf(isalnum(*p)||strchr("!'()*-._",*p)?"%c":"%%%02X",*p);}

1

পাইথন, 86 বাইট

lambda s:"".join(["%%%02X"%ord(c),c][c<"{"and c.isalnum()or c in"!'()*-._"]for c in s)

আমার সি উত্তর পোর্ট।


1

রুবি, 37 + 3 = 40 বাইট

-p(3 অতিরিক্ত বাইট) দিয়ে চালান , যেমন $ ruby -p percent_encode.rb:

gsub(/[^\w!'()*-.]/){"%%%02X"%$&.ord}

1

জেলি , 28 27 বাইট

ḟØWḟ©“!'()*-.”Od⁴‘ịØH”%p®,y

এটি একটি monadic লিঙ্ক। এটি অনলাইন চেষ্টা করুন!

কিভাবে এটা কাজ করে

ḟØWḟ©“!'()*-.”Od⁴‘ịØH”%p®,y  Monadic link. Argument: s (string)

 ØW                          Yield “0...9A...Z_a...z”.
ḟ                            Remove these characters from s.
     “!'()*-.”               Yield “!'()*-.”.
   ḟ                         Remove these characters from s.
    ©                        Copy the result to the register.
              O              Ordinal; get the code point of each character.
               d⁴            Divmod 16; yield quotient and remainder modulo 16.
                 ’           Decrement the results.
                  ịØH        Index into “0123456789ABCDEF”.
                     ”p%     Perform Cartesian product with ”%, prepending it to
                             each pair of hexadecimal digits.
                        ®,   Yield [t, r], where t is the string in the register
                             and r the result of the Cartesian product.
                          y  Use this pair to perform transliteration on s.

1

Haskell,, 201 179 178 127 119 বাইট

import Data.Char;import Numeric;f=(=<<)(\c->if isAlphaNum c&&isAscii c||elem c"-_.~"then[c]else '%':(showHex$ord c)"")

Ungolfed:

import Data.Char
import Numeric

f=(=<<) e
e c = if isAlphaNum c && isAscii c && c `elem` "-_.~" then [c] else '%' : (showHex $ ord c) ""

আপনি কি একগুচ্ছ জায়গা সরিয়ে ফেলতে পারবেন?
আর

আপনি আলগা করতে পারেন where, ifপ্রহরীদের রূপান্তর করতে পারেন, আংশিক করতে পারেন, শেষ যুক্তিটি আলগা করতে পারেন showHex, ইনলাইন p, ইনলাইন s, স্বাক্ষরটি আলগা করতে পারেন, elemএবং আরও আরও সাদা স্থান ফাঁকা করতে পারেন। প্রথম অনুমান হিসাবে আমি 118 এ নেমে এসেছি।
মার্লিন

কোডটি ছাঁটাই করার বিষয়ে বেশ কয়েকটি ভালো পরামর্শের জন্য @ মারলিনকে ধন্যবাদ। তবে কিছু নির্দিষ্ট পরামর্শ নিয়ে আমার কিছুটা সমস্যা হয়েছিল। প্রথমত, আমি স্বাক্ষরটি সরিয়ে ফেললে জিএইচসি অভিযোগ করবে No instance for (Foldable t0) arising from a use of ‘foldr’। এটি বলে যে ফাংশনটির ধরণটি দ্ব্যর্থক, এর ফলে একটি অনুমানক বাধ্য হয় f :: t0 Char -> [Char]। এবং সর্বোপরি, আমি খালি স্ট্রিং আর্গুমেন্টটি শোহেক্স থেকে মুছে ফেলতে পারিনি কারণ এটি একটি শো-এস প্রদান করে, যা String -> Stringখালি স্ট্রিংয়ের প্রয়োজনের জন্য এটি টাইপ একটি নাম ।
sham1

@ শ্যাম 1, হ্যাঁ, ShowSএকটি স্ট্রিং নেয় ... তবে আপনার একটি রয়েছে: আপনি যেটি যুক্ত করছেন (++)। সুতরাং আপনি একই সময়ে উভয় আলগা করতে পারেন। আসলে কেন ShowSসেভাবে দেখায়। আমি টাইপ ত্রুটি পাই না, তাই আমি অনুমান করি এটি একটি সংস্করণ জিনিস? দুই অন্যান্য বিষয়ের আমি এখন দ্বারা খেয়াল: otherwiseসবসময় দ্বারা প্রতিস্থাপিত হতে পারে 1<2(জন্য একটি সাঁটে লেখার True), কিন্তু যদি তোমরা ফিরে আসতে ifপরিবর্তে আপনি ইনলাইন করতে eএবং সকল নামের ড্রপ। এমনকি একটি মধ্যে ভাঁজ চালু concatMap, অর্থাত্ একটি (>>=)। অনেক কিছু বাঁচায় না, তবে কমপক্ষে কিছুটা। প্রকারের ত্রুটিটিও সমাধান করতে পারে।
মার্লিন

0

পাইথন 2, 78 বাইট

lambda s:"".join(["%%%02x"%ord(c),c][c.isalnum()or c in"!'()*-._"]for c in s)

আরও সুন্দর বিন্যাসিত:

lambda s:
    "".join(["%%%02x" % ord(c), c][c.isalnum() or c in"!'()*-._"] for c in s)

0

এসকিউএফ , 199 176

ফাইল হিসাবে ফাংশন হিসাবে ব্যবহার:

i="";a="0123456789ABCDEF!'()*-.GHIJKLMNOPQRSTUVWXYZ_";{i=i+if((toUpper _x)in a)then{_x}else{x=(toArray[_x])select 0;"%"+(a select floor(x/16))+(a select(x%16))}}forEach _this;i

যেমন কল "STRING" call NAME_OF_COMPILED_FUNCTION


0

পাওয়ারশেল ভি 2 +, 146 বাইট

param($n)37,38+0..36+43,44,47+58..64+91,93+96+123..255-ne33|%{$n=$n-replace"[$([char]$_)]",("%{0:x2}"-f$_)};$n-replace'\\','%5c'-replace'\^','%5e'

দীর্ঘ কারণ আমি অন্য প্রত্যেকে ব্যবহার করছে একই রেজেক্স স্ট্রিংটি কেবল অনুলিপি-পেষ্ট করার চেয়ে আলাদা পদ্ধতি প্রদর্শন করতে চেয়েছিলাম।

এখানে পরিবর্তে, আমরা প্রতিটি কোড পয়েন্টটি লুপ করব যা অবশ্যই শতাংশ-এনকোড হওয়া উচিত এবং প্রতিটি পুনরাবৃত্তির -replaceইনপুট স্ট্রিংয়ে একটি আক্ষরিক কাজ করে $n(পুনরায় সেভ করে $n)। তারপরে আমাদের দুটি বিশেষ অক্ষরের জন্য অ্যাকাউন্টিং করতে হবে যার পালানোর দরকার রয়েছে \এবং ^তাই -replaceশেষ পর্যন্ত পৃথক উপাদানগুলিতে রয়েছে। যেহেতু আমরা সেই চূড়ান্ত স্ট্রিংটিকে পুনরায় সংরক্ষণ করতে পারি নি, এটি পাইপলাইনে রেখে গেছে এবং মুদ্রণ জড়িত।


0

16/32-বিট x86 বিধানসভা, 73 বাইট

বাইট কোড:

AC 3C 21 72 2A 74 3E 3C 26 76 24 3C 2B 72 36 3C
2C 76 1C 3C 2F 72 2E 74 16 3C 3A 72 28 74 10 3C
5F 74 22 50 0C 60 3C 60 74 02 3C 7B 58 72 16 D4
10 3C 09 1C 69 2F 86 E0 3C 09 1C 69 2F 92 B0 25
AA 92 AA 86 E0 AA E2 B8 C3

disassembly:

l0: lodsb         ;fetch a character
    cmp  al, 21h
    jb   l1       ;encode 0x00-0x20
    je   l2       ;store 0x21
    cmp  al, 26h
    jbe  l1       ;encode 0x22-0x26
    cmp  al, 2bh
    jb   l2       ;store 0x27-0x2A
    cmp  al, 2ch
    jbe  l1       ;encode 0x2B-0x2C
    cmp  al, 2fh
    jb   l2       ;store 0x2D-0x2E
    je   l1       ;encode 0x2F
    cmp  al, 3ah
    jb   l2       ;store 0x30-0x39
    je   l1       ;encode 0x3A
    cmp  al, 5fh
    je   l2       ;store 0x5F
    push eax
    or   al, 60h  ;merge ranges
    cmp  al, 60h
    je   l3       ;encode 0x40, 0x60
    cmp  al, 7bh
l3: pop  eax
    jb   l2       ;store 0x41-0x5A, 0x61-0x7A
                  ;encode 0x3B-0x3F, 0x5B-0x5E, 0x7B-0xFF

l1: aam  10h      ;split byte to nibbles
    cmp  al, 9    ;convert 0x0A-0x0F 
    sbb  al, 69h  ;to
    das           ;0x41-0x46 ('A'-'F')
    xchg ah, al   ;swap nibbles
    cmp  al, 9    ;do
    sbb  al, 69h  ;other
    das           ;half
    xchg edx, eax ;save in edx
    mov  al, '%'
    stosb         ;emit '%'
    xchg edx, eax
    stosb         ;emit high nibble
    xchg ah, al

l2: stosb         ;emit low nibble or original character
    loop l0       ;until end of string
    ret

এর সাথে কল করুন:
- এসি = পয়েন্টার টু বাফার যা উত্সের স্ট্রিং ধারণ করে;
- এডি = বাফার পয়েন্টার যা এনকোডড স্ট্রিং গ্রহণ করে;
- ecx = উত্সের স্ট্রিংয়ের দৈর্ঘ্য।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.