একটি URL সংক্ষিপ্তকারী প্রয়োগ করুন


12

ইউআরএল খুব দীর্ঘ হয়ে যাচ্ছে। সুতরাং, আপনাকে একটি URL সংক্ষিপ্ত করতে অবশ্যই একটি অ্যালগরিদম প্রয়োগ করতে হবে।

আমি। একটি ইউআরএল এর কাঠামো

একটি URL এর 2 টি প্রধান অংশ রয়েছে: একটি ডোমেন এবং একটি পথ । একটি ডোমেন প্রথম স্ল্যাশের আগে URL এর অংশ of আপনি ধরে নিতে পারেন যে URL টিতে কোনও প্রোটোকল অন্তর্ভুক্ত নেই। পথটি সব কিছু।

আ। ডোমেইন

একটি URL ডোমেইনের ভালো কিছু হবে: xkcd.com meta.codegolf.stackexcchhannnge.cooom। প্রতিটি অংশ পিরিয়ড- blag.xkcd.comবিভক্ত , যেমন , অংশগুলি "ব্লেগ", "এক্সকেসিডি", এবং "কম"। এটি আপনি এটি দিয়ে কি করবেন:

  • যদি এতে দুটি অংশের বেশি থাকে তবে শেষ দুটিটি একদিকে রাখুন এবং বাকী অংশের প্রথম অক্ষরটি সংযুক্ত করুন।

  • তারপরে, এটি দ্বিতীয় থেকে শেষ অংশের প্রথম চিঠির সাথে সম্মত করুন।

  • একটি সময়কাল এবং দ্বিতীয় থেকে শেষ অংশের দ্বিতীয় এবং তৃতীয় অক্ষর যুক্ত করুন।

  • শেষ অংশটি বাতিল করুন।

III। পথ

পাথ মত হবে: /questions/2140/ /1407/। আগের মতো, "অংশগুলি" স্ল্যাশ দ্বারা পৃথক করা হয়। পথে প্রতিটি অংশের জন্য, করুন:

  • একটি স্ল্যাশ যোগ করুন

  • যদি এটি বেস-টেন ডিজিটের সম্পূর্ণ তৈরি হয়, তবে এটি একটি সংখ্যা হিসাবে ব্যাখ্যা করুন এবং বেস -৩ inte সংখ্যায় রূপান্তর করুন।

  • অন্যথায়, অংশ প্রথম অক্ষর যোগ করুন।

শেষে, একটি স্ল্যাশ যুক্ত করুন।

ঈ। বিবিধ।

  • এটি , তাই সংক্ষিপ্ততম কোড জিততে পারে।
  • পথটি ফাঁকা থাকতে পারে, তবে ইউআরএল সর্বদা একটি স্ল্যাশের সাথে শেষ হবে।
  • কোনও প্রোটোকল থাকবে না (যেমন http://, file:///)
  • ডোমেনে কখনও কখনও দুটি অংশের কম হবে না।
  • স্ট্যান্ডার্ড লুফোলস প্রযোজ্য।

উদাহরণ

ইন: xkcd.com/72/
আউট:x.kc/20/

ইন: math.stackexchange.com/a/2231/
আউট:ms.ta/a/1pz/

ইন: hello.org/somecoolcodeintrepreteriijjkk?code=3g3fzsdg32,g2/
আউট:h.el/s/


আপনার শেষ উদাহরণে, পথটি কি শেষ হয় না kkএবং যা শুরু হয় ?তা কি কোয়েরি স্ট্রিং, যা স্ল্যাশের সাথে শেষ হওয়া উচিত নয়? এছাড়াও সমস্ত URL গুলি স্ল্যাশের সাথে শেষ হবে না /, যেমন www.something.com/path। বা এই চ্যালেঞ্জের উদ্দেশ্যে এটি কি অপ্রাসঙ্গিক?
সন্নিবেশকারী নাম

তা অপ্রাসঙ্গিক।
ev3commander

উত্তর:


0

পাইথ, 93 85 বাইট

Lsm@+jkUTGdjb36J<zxz\/KP>zhxz\/=cJ\.pss[mhd<J_2hePJ\.<tePJ2\/;=cK\/sm+?-djkUThdysd\/K

পাইথোনিক সিউডোকোডে হাতে সংকলিত:

                z = input()                     # raw, unevaluated
                G = "abcdefghijklmnopqrstuvwxyz"
                k = ""
                T = 10
L               def y(b):                       # define y as base10to36
 sm                 join(map(lambda d:
  @+jkUTGd            (join(range(T),interleave=k)+G)[d],
                                                # the join(..)+G makes "0...9a...z"
  jb36                 convert(b,36)            # returns a list of digit values in base10
J<zxz\/         J = z[:z.index("\/")]           # domain portion
KP>zhxz\/       K = z[1+z.index("\/"):][:-1]    # path portion
=cJ\.           J = J.split(".")                # splits domain into parts
pss[            no_newline_print(join(join[     # 1 join yields a list, the other a string
 mhd<J_2            map(lambda d:d[0],J[:-2]),
 hePJ               J[:-1][-1][1],
 \.                 ".",
 <tePJ2             J[:-1][-1][1:][:2],
 \/                 "\/"
;               ])
=cK\/           K = K.split("\/")
sm              print(join(map(lambda d:
 +?-djkUThdysd\/    "\/"+(d[0] if filterOut(d,join(range(T),interleave=k)) else y(int(d))),
                    # the filter will turn pure number into empty string, which is False
 K                  K)))

অবশেষে, উসকানি শেষ ...


4

জাভাস্ক্রিপ্ট (ES6), 149 বাইট

u=>u.split`/`.map((p,i)=>i?/^\d+$/.test(p)?(+p).toString(36):p[0]:(d=p.split`.`).slice(0,-1).map((s,j)=>s[l=j,0]).join``+"."+d[l].slice(1,3)).join`/`

ব্যাখ্যা

আমি @ নীলের সমাধানটিকে এটিকে স্বাধীন করে তুলেছি তবে এটি খুব অনুরূপ দেখাচ্ছে looking

u=>
  u.split`/`.map((p,i)=>       // for each part p at index i
    i?                         // if this is not the first part
      /^\d+$/.test(p)?         // if p is only digits
        (+p).toString(36)      // return p as a base-36 number
      :p[0]                    // else return the first letter
    :
      (d=p.split`.`)           // d = domain parts
      .slice(0,-1).map((s,j)=> // for each domain part before the last
        s[l=j,0]               // return the first letter, l = index of last domain part
      ).join``
      +"."+d[l].slice(1,3)     // add the 2 letters as the final domain
  )
  .join`/`                     // output each new part separated by a slash

পরীক্ষা


1

জাভাস্ক্রিপ্ট ES6, 157 বাইট

u=>u.split`/`.map((p,i)=>i?/^\d+$/.test(p)?(+p).toString(36):p[0]:p.split`.`.reverse().map((h,i)=>i--?i?h[0]:h[0]+'.'+h[1]+h[2]:'').reverse().join``).join`/`

সম্পাদনা করুন: ডওকে ধন্যবাদ 4 টি বাইট সংরক্ষণ করা হয়েছে ᴡɴɢᴏᴀᴛ


আপনার স্ট্রিং টেমপ্লেটগুলি তৈরি করতে .split('/')এবং এটিকে সক্ষম করতে হবে.split('.')
32

@ দো বাহ, আমারও মনে আছে join!
নীল

1

পাইথন 2, 378 365 বাইট

হালনাগাদ

কিছুক্ষন এটি গল্ফ করে। বেস36-ফাংশনের জন্য 150 ডলার বাইটগুলি বিরক্তিকর, তবে পাইথন যতক্ষণ না এর জন্য একটি বিল্টিন তৈরি না করে আমি তা থেকে মুক্তি পেতে পারি না ...

def b(n):
 a=abs(n);r=[];
 while a :
    r.append('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'[a%36]);a//=36
 if n<0:r.append('-')
 return''.join(reversed(r or'0'))
u=raw_input();P=u.split("/")[0].split(".")
print"".join([p[0] for p in P[0:-2]]+[P[-2][0]]+["."]+list(P[-2])[1:3]+["/"]+[b(int(p))+"/"if p.isdigit()else p[0]+"/" for p in u.split(".")[-1].split("/")[1:-1]])

পুরনো সংস্করণ

def b(n):
 a=abs(n)
 r=[]
 while a:
    r.append('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'[a%36])
    a//=36
 if n<0:r.append('-')
 return''.join(reversed(r or'0'))
u=raw_input()
P=u.split("/")[0].split(".")
s=""
if len(P)>2:
 for p in P[:-2]:s+=p[0]
s+=P[-2][0]+"."+P[0][1:3]
P=u.split(".")[-1].split("/")[1:-1]
for p in P:
 s+="/"+(b(int(p)) if p.isdigit() else p[0])
print s+"/"

পাইথনের যেহেতু ইনটগুলিকে বেস 36-স্ট্রিংয়ে রূপান্তরিত করার কোনও অন্তর্নির্মিত উপায় নেই, তাই আমি বাস্তবটিকে ন্যায়ের কাছ থেকে নেওয়া এবং এটি গল্ফ করে ed বিশ্রামটি বেশ সোজা, আমি কাজের পরে আরও গল্ফ করব। ইতিমধ্যে পরামর্শ সর্বদা প্রশংসা!


0

পিহটন 2, 336 329 বাইট

হালনাগাদ

ওয়েবওয়ারিওরকে স্থির এবং সংক্ষিপ্ত ধন্যবাদ

def b(a):
 r=''
 while a:
  r+=chr((range(48,58)+range(65,91))[a%36])
  a//=36
 return ''.join(reversed(r or '0'))
u=raw_input()
P=u.split('/')[0].split('.')
s=''
if len(P)>2:
 for p in P[:-2]: s+=p[0]
s+=P[-2][0]+'.'+P[0][1:3]
P=u.split('.')[-1].split('/')[1:]
for p in P: s+='/'+(b(int(p)) if p.isdigit() else p[0])
print s+'/'

মূল

কিছু মোডের সাথে ডেনকারএফির সংস্করণ: "foo / bar? Baz" স্কিমটি সঠিকভাবে পরিচালনা করুন, পাশাপাশি, বেস 36 রূপান্তর ফাংশনে নেতিবাচক কেসের প্রয়োজন নেই।

 def b(a):
 r=''
 while a:
  r+=('0123456789ABCDEFGHUKLMNOPQRSTUVWXYZ'[a%36])
  a//=36
 return ''.join(reversed(r or '0'))
u=raw_input()
P=u.split('/')[0].split('.')
s=''
if len(P)>2:
 for p in P[:-2]: s+=p[0]
s+=P[-2][0]+'.'+P[0][1:3]
P=u.split('.')[-1].split('/')[1:]
for p in P: s+='/'+(b(int(p)) if p.isdigit() else p[0])
print s+'/'

আপনার দেখার স্ট্রিংয়ে ত্রুটি রয়েছে এবং পুরো লাইনটি আরও ছোট করা যেতে পারে:r+=chr((range(48,58)+range(65,91))[a%36])
ওয়েবওয়্যার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.