URL 단축기 구현


12

URL이 너무 길어지고 있습니다. 따라서 URL을 줄이려면 알고리즘을 구현해야합니다.

나는. URL의 구조

URL에는 도메인경로의 두 가지 주요 부분이 있습니다 . 도메인은 첫 번째 슬래시 이전의 URL 부분입니다. URL에 프로토콜이 포함되어 있지 않다고 가정 할 수 있습니다. 경로는 다른 모든 것입니다.

ii. 도메인

URL의 도메인은 다음과 같습니다 xkcd.com meta.codegolf.stackexcchhannnge.cooom. 각 부품은 기간별로 구분됩니다 (예 : blag.xkcd.com부품은 "blag", "xkcd"및 "com"). 이것이 당신이 할 일입니다 :

  • 두 개 이상의 부품이 포함 된 경우 마지막 두 개를 제쳐두고 나머지 부품의 첫 글자를 연결하십시오.

  • 그런 다음 첫 번째 문자를 두 번째에서 마지막 부분까지 연결하십시오.

  • 마지막 부분부터 마침표와 두 번째 및 세 번째 문자를 추가하십시오.

  • 마지막 부분을 폐기하십시오.

iii. 경로

경로는 다음과 같습니다 /questions/2140/ /1407/.. 이전과 같이 "부품"은 슬래시로 구분됩니다. 경로의 각 부분에 대해 다음을 수행하십시오.

  • 슬래시 추가

  • 10 진수로 완전히 구성된 경우 숫자로 해석하여 36 진수로 변환하십시오.

  • 그렇지 않으면 부품의 첫 글자를 추가하십시오.

마지막에 슬래시를 추가하십시오.

iv. 기타

  • 이것은 이므로 가장 짧은 코드가 승리합니다.
  • 경로는 비워 둘 수 있지만 URL은 항상 슬래시로 끝납니다.
  • 프로토콜이되지 않습니다 (예를 들어 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. 아니면이 도전의 목적과 관련이 있습니까?
insertusername 여기

그것은 관련이 없습니다.
ev3commander

답변:


0

Pyth, 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)))

마지막으로, excruciation는 끝납니다 ...


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`/`

설명

나는 이것을 @Neil의 솔루션 과 독립적으로 만들었지 만 매우 비슷하게 보입니다 .

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`/`

편집 : Doᴡɴɢᴏᴀᴛ 덕분에 4 바이트가 절약되었습니다.


당신은 만들 수 있어야 .split('/')하고 .split('.')문자열 템플릿에
Downgoat

@ Doᴡɴɢᴏᴀᴛ Bah, 나도 기억했다 join!
Neil

1

파이썬 2, 378 365 바이트

최신 정보

그것을 조금 아래로 골프. base36 함수의 ~ 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+"/"

파이썬에는 int를 base36-String으로 변환하는 기본 방법이 없으므로 numpy에서 구현을 가져 와서 골프를 쳤습니다. 휴식은 매우 간단합니다. 퇴근 후 더 많이 골프를칩니다. 그 동안 제안은 항상 감사합니다!


0

Pyhton 2, 336 329 바이트

최신 정보

webwarrior 덕분에 고정 및 단축

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+'/'

기발한

일부 모드가 포함 된 DenkerAffe 버전 : "foo / bar? baz"체계를 올바르게 처리하고 base36 변환 함수에서 음수를 입력 할 필요가 없습니다.

 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])
webwarrior
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.