Python 2, 14508 11700 11088 10164 9486 9746 7860145 바이트 * 36 고유 = 5220
나는 제목을보고 이것이 다소 장엄한 파이썬에게는 흥미로운 도전이라고 생각했다. 이 문제를 다룰 때의 메모입니다.
첫 번째 시도는 고유성을 31로 줄였습니다.
print''.join(chr([69,108,105,122,97,98,101,116,104,32,111,98,110,111,120,105,111,117,115,108,121,32,113,117,111,116,101,100,32,40,106,117,115,116,32,116,111,111,32,114,111,119,100,121,32,102,111,114,32,109,121,32,112,101,97,99,101,41,58,32,34,84,72,69,32,81,85,73,67,75,32,66,82,79,87,78,32,70,79,88,32,74,85,77,80,83,32,79,86,69,82,32,84,72,69,32,76,65,90,89,32,68,79,71,44,34,32,103,105,118,105,110,103,32,109,101,32,97,32,108,111,111,107,46][r])for r in range(124))
나는 내가 더 잘할 수 있다고 생각했다. 를 사용 map
하면 고유 항목이 26 개로 줄어 듭니다.
print''.join(map(chr,(69,108,105,122,97,98,101,116,104,32,111,98,110,111,120,105,111,117,115,108,121,32,113,117,111,116,101,100,32,40,106,117,115,116,32,116,111,111,32,114,111,119,100,121,32,102,111,114,32,109,121,32,112,101,97,99,101,41,58,32,34,84,72,69,32,81,85,73,67,75,32,66,82,79,87,78,32,70,79,88,32,74,85,77,80,83,32,79,86,69,82,32,84,72,69,32,76,65,90,89,32,68,79,71,44,34,32,103,105,118,105,110,103,32,109,101,32,97,32,108,111,111,107,46)))
이 시점에서 나는 질문 텍스트에서 점수가 uniques * bytes
유일한 것이 아니라 임을 알았습니다 ! 그것은 위의 점수가 14508과 11700이라는 것을 의미했습니다. 경쟁이 심하지 않습니다. 이제 텍스트를 16 진 문자열로 저장하여 바이트를 줄입니다.
# 308*36 = 11088
print''.join(chr(int('456c697a6162657468206f626e6f78696f75736c792071756f74656420286a75737420746f6f20726f77647920666f72206d79207065616365293a202254484520515549434b2042524f574e20464f58204a554d5053204f56455220544845204c415a5920444f472c2220676976696e67206d652061206c6f6f6b2e'[i*2:i*2+2],16)) for i in range(124))
크기는 줄어들었지만 더 독특한 캐릭터입니다. 그러나 32 오프셋으로 압축 된 2 자리 10 진수 문자열을 사용하면 :
# 308*33 = 10164
print''.join(chr(int('37767390656669847200796678798873798583768900818579846968000874858384008479790082798768890070798200778900806965676909260002524037004953413543003450475546003847560042534548510047543750005240370044335857003647391202007173867378710077690065007679797514'[i*2:i*2+2])+32) for i in range(124))
바이트 수는 같지만 고유 항목은 3 개 저장됩니다.
나는 새로운 계획을 세운다. 7 비트 문자로 파이썬 긴 정수를 포장하면 다음을 이동하여 각 정수를 추출 할 수 있습니다.
# 306*31 = 9486
h=1073974643401006528619595312441225198653732186368270382545648881135648217524502741093886285232362673460172159947573049818819511630304840724474679255867143965214892747087773876949021986013520804726327302180335979259392708372721217579101211940864406962137554744750
w=''
while h:w=chr(h&127)+w;h>>=7
print w
그로 인해 점수는 9486으로 줄었습니다. 흥미로운 실험이지만, 그다지 좋은 곳은 없습니다. 이제 함수 이름을 제거하고 문자열 형식을 사용하면 어떻게됩니까?
# 443 * 22 = 9746
print('%c'*124)%(69,108,105,122,97,98,101,116,104,32,111,98,110,111,120,105,111,117,115,108,121,32,113,117,111,116,101,100,32,40,106,117,115,116,32,116,111,111,32,114,111,119,100,121,32,102,111,114,32,109,121,32,112,101,97,99,101,41,58,32,34,84,72,69,32,81,85,73,67,75,32,66,82,79,87,78,32,70,79,88,32,74,85,77,80,83,32,79,86,69,82,32,84,72,69,32,76,65,90,89,32,68,79,71,44,34,32,103,105,118,105,110,103,32,109,101,32,97,32,108,111,111,107,46)
나는 이제 22 개의 유니크를 가지고 있지만 점수는 향상되지 않습니다.
좋아, 내가 분명한 방법으로 문자열을 인쇄하면 어떻게 될까요?
# 131*60 = 7860
print'Elizabeth obnoxiously quoted (just too rowdy for my peace): "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG," giving me a look.'
7860 점.이 작업을 먼저 수행 했어야합니다. 그러나 나는 그렇게 많이 배우지 않았을 것입니다.
대문자 부분을 동적으로 생성하면 고유성을 26만큼 줄일 수 있다고 생각합니다.
# 145*36 = 5220
print'Elizabeth obnoxiously quoted (just too rowdy for my peace): '+'"the quick brown fox jumps over the lazy dog,"'.upper()+' giving me a look.'
파이썬은 5220보다 훨씬 나아지지 않을 것이라고 생각합니다. 파이썬에서 고유 문자를 최소화하는 작업은 확실히 유익했습니다.
업데이트 : mbomb007에는 5005의 더 나은 Python 솔루션이 있습니다.