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. 기타
- 이것은 code-golf 이므로 가장 짧은 코드가 승리합니다.
- 경로는 비워 둘 수 있지만 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/
답변
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는 끝납니다 …
답변
자바 스크립트 (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
테스트
답변
자바 스크립트 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 바이트가 절약되었습니다.
답변
파이썬 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에서 구현을 가져 와서 골프를 쳤습니다. 휴식은 매우 간단합니다. 퇴근 후 더 많이 골프를칩니다. 그 동안 제안은 항상 감사합니다!
답변
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+'/'