Python 2, 14508 11700 11088 10164 9486 9746 7860145 octets * 36 unique = 5220
J'ai vu le titre et j'ai pensé que c'était un défi intéressant pour le Python plutôt verbeux. Ce sont mes notes lorsque j'ai abordé ce problème.
Mon premier essai a réduit les uniques à 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))
Je pensais que je pouvais faire mieux. En utilisant map
, les uniques se résumaient à 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)))
À peu près à cette époque, j'ai remarqué dans le texte de la question que le score était uniques * bytes
, pas seulement unique! Cela signifiait que mes scores pour ce qui précède étaient 14508 et 11700. Pas très compétitif. Donc, je réduit maintenant les octets en stockant le texte sous forme de chaîne hexadécimale:
# 308*36 = 11088
print''.join(chr(int('456c697a6162657468206f626e6f78696f75736c792071756f74656420286a75737420746f6f20726f77647920666f72206d79207065616365293a202254484520515549434b2042524f574e20464f58204a554d5053204f56455220544845204c415a5920444f472c2220676976696e67206d652061206c6f6f6b2e'[i*2:i*2+2],16)) for i in range(124))
La taille a été réduite mais les caractères plus uniques. Mais si j'utilisais une chaîne décimale à 2 chiffres avec un décalage de 32:
# 308*33 = 10164
print''.join(chr(int('37767390656669847200796678798873798583768900818579846968000874858384008479790082798768890070798200778900806965676909260002524037004953413543003450475546003847560042534548510047543750005240370044335857003647391202007173867378710077690065007679797514'[i*2:i*2+2])+32) for i in range(124))
Cela a le même nombre d'octets mais enregistre 3 uniques.
Je fais éclore un nouveau plan. Si j'emballe un entier long Python avec des caractères 7 bits, je pourrais extraire chacun en décalant:
# 306*31 = 9486
h=1073974643401006528619595312441225198653732186368270382545648881135648217524502741093886285232362673460172159947573049818819511630304840724474679255867143965214892747087773876949021986013520804726327302180335979259392708372721217579101211940864406962137554744750
w=''
while h:w=chr(h&127)+w;h>>=7
print w
Eh bien, cela a réduit le score à 9486. Une expérience intéressante, mais loin d'être suffisante. Maintenant, que se passe-t-il si je me débarrasse des noms de fonction et que je me fie au formatage des chaînes?
# 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)
Je n'ai plus que 22 uniques, mais le score ne s'améliore pas.
Ok, que se passe-t-il si je prends la voie évidente et que j'imprime la chaîne:
# 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 de 7860. J'aurais dû le faire en premier. Mais je n'aurais pas autant appris.
Je suppose que je pourrais réduire les uniques de 26 si je produisais dynamiquement les parties majuscules, donc:
# 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.'
Je pense que Python ne sera pas beaucoup mieux que 5220. La tâche de minimiser les caractères uniques en Python était certes instructive.
Mise à jour: mbomb007 a une meilleure solution Python avec un score de 5005. Beau travail.