Python 2, 14508 11700 11088 10164 9486 9746 7860 145 Bytes * 36 unique = 5220
Ich habe den Titel gesehen und fand, dass dies eine interessante Herausforderung für den eher wortreichen Python war. Dies sind meine Notizen, als ich dieses Problem anging.
Mein erster Versuch reduzierte die Unikate auf 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))
Ich dachte, ich könnte es besser machen. Unter Verwendung von map
kam es zu 26 Unikaten:
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)))
Ungefähr zu dieser Zeit bemerkte ich im Fragetext, dass die Punktzahl uniques * bytes
nicht nur einzigartig war! Das bedeutete, dass ich für die oben genannten Punkte 14508 und 11700 Punkte erhielt. Nicht sehr konkurrenzfähig. Deshalb reduziere ich jetzt die Bytes, indem ich den Text als Hex-Zeichenfolge speichere:
# 308*36 = 11088
print''.join(chr(int('456c697a6162657468206f626e6f78696f75736c792071756f74656420286a75737420746f6f20726f77647920666f72206d79207065616365293a202254484520515549434b2042524f574e20464f58204a554d5053204f56455220544845204c415a5920444f472c2220676976696e67206d652061206c6f6f6b2e'[i*2:i*2+2],16)) for i in range(124))
Die Größe wurde reduziert, aber mehr eindeutige Zeichen. Aber wenn ich eine gepackte 2-stellige Dezimalzeichenfolge mit einem Versatz von 32 verwendet habe:
# 308*33 = 10164
print''.join(chr(int('37767390656669847200796678798873798583768900818579846968000874858384008479790082798768890070798200778900806965676909260002524037004953413543003450475546003847560042534548510047543750005240370044335857003647391202007173867378710077690065007679797514'[i*2:i*2+2])+32) for i in range(124))
Dies hat die gleiche Anzahl von Bytes, speichert aber 3 Unikate.
Ich habe einen neuen Plan. Wenn ich eine lange Python-Ganzzahl mit 7-Bit-Zeichen packe, könnte ich jedes durch Verschieben extrahieren:
# 306*31 = 9486
h=1073974643401006528619595312441225198653732186368270382545648881135648217524502741093886285232362673460172159947573049818819511630304840724474679255867143965214892747087773876949021986013520804726327302180335979259392708372721217579101211940864406962137554744750
w=''
while h:w=chr(h&127)+w;h>>=7
print w
Nun, das reduzierte die Punktzahl auf 9486. Ein interessantes Experiment, aber bei weitem nicht gut genug. Was ist nun, wenn ich die Funktionsnamen loswird und mich auf die Formatierung von Zeichenfolgen verlasse?
# 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)
Ich habe jetzt nur 22 Unikate, aber die Punktzahl verbessert sich nicht.
Ok, was ist, wenn ich den offensichtlichen Weg eingeschlagen habe und nur die Zeichenfolge ausgedruckt habe:
# 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.'
Score von 7860. Ich hätte das zuerst tun sollen. Aber ich hätte nicht so viel gelernt.
Ich denke, ich könnte Uniques um 26 reduzieren, wenn ich die Großbuchstaben dynamisch produziere. Also:
# 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.'
Ich denke, Python wird nicht viel besser als 5220. Die Aufgabe, die eindeutigen Zeichen in Python zu minimieren, war allerdings aufschlussreich.
Update: mbomb007 hat eine bessere Python-Lösung mit 5005. Gute Arbeit.