Python 2 , 38 30 28 octets
lambda S:`6793**164`[len(S)]
Essayez-le en ligne!
Malheureusement, il reste encore un octet de plus que la meilleure réponse de Python 2 à ce jour; bien que ne pas utiliser l' enklact
approche.
Maintenant, un octet plus court que la réponse de i cri everytim !
Comment ça marche?
Après beaucoup de force brute, j'ai trouvé une expression qui donne un nombre qui a les bons chiffres.
J'ai remarqué que regarder un seul chiffre spécifique de la longueur de la chaîne donnée nécessitait 3 octets ( %10
). J'ai donc écrit un autre programme Python ( lien Pastebin ) pour rechercher davantage les nombres qui mappent directement la longueur des chaînes en entrée au jour de la semaine.
Le nombre magique ressemble à ceci: 6793**164 = 28714733692312345620167113260575862840674216760386883406587492336415023761043044176257567032312859371641211117824224067391750766520256112063756278010050204239810862527958109285342869876264808102743173594017101607983288521836082497514383184553444755034407847810524083812459571382103831904835921560285915349760536969265992879312869538914200854305957428078269094250817029486005437991820466986793657301214564264748923199288698278615871481529585816783654841131577178922192383679718074693535597651237893794976519274268917335387876260270630339777501802739852278932279775510324916969726203688466311848240746465178859847331248655567344801
(un nombre avec 629 chiffres décimaux impressionnant)
Et comme vous pouvez le constater, le nombre fournit le mappage nécessaire de [28, 20, 13, 11, 4, 16, 17] à [0, 1, 2, 3, 4, 5, 6] (les chaînes Python valent 0- indexé):
2871 4 733692 3 1 2 34 5 6 20 1 6711326 0 5758628406742167603868834...
[4]^ [11]^ [13]^ [16]^ ^[17] ^[20] ^[28]
Mon programme a également trouvé d' autres expressions qui donnent des nombres avec la propriété nécessaire, mais ils prennent plus d' octets pour représenter (29 au lieu de 28): 19439**540
, 34052**726
, 39311**604
, 44873**182
, 67930**164
et 78579**469
. (Ce sont toutes les expressions trouvées par le programme lié; son exécution a pris plusieurs heures.)
Fonction alternative qui nécessite 28 octets: lambda S:`7954<<850`[len(S)]
Fonction alternative qui nécessite 29 octets: lambda S:`9699<<2291`[len(S)]
Fonction alternative qui nécessite 30 octets: lambda S:`853<<4390`[len(S)+9]
Fonction alternative qui nécessite 31 octets:lambda S:`1052<<3330`[len(S)+8]
Comment ça marche? Comment ai-je généré ce nombre? (Réponse sur 30 octets)
La réponse de 30 octets était lambda S:`3879**41`[len(S)%10]
.
En regardant la longueur de la chaîne d'entrée [28, 20, 13, 11, 4, 16, 17]
, j'ai remarqué que tous les derniers chiffres de la base dix diffèrent, ce qui donne la liste [8, 0, 3, 1, 4, 6, 7]
. Donc, je n'avais besoin que d'une correspondance de cette liste avec la liste des sept jours de la semaine [0, 1, 2, 3, 4, 5, 6]
.
Ma première approche utilisait simplement une chaîne pour effectuer le mappage:, lambda S:"13*24*560"[len(S)%10]
bien que la chaîne nécessite onze octets ( "13*24*560"
).
J'ai donc écrit un programme Python ( lien Pastebin ) pour tester les expressions arithmétiques aboutissant à un entier avec des chiffres identiques, dans l’espoir de jouer plus avant au programme. Ce que j’ai trouvé jusqu’à présent, c’est `3879**41`
(seulement dix octets, la seule et donc la plus petite expression trouvée par mon programme).
Bien sûr, il existe de nombreuses expressions possibles que l’on peut essayer; Je viens d'avoir la chance qu'il y en ait un dans la forme a**b
avec un résultat assez petit qui correspond à mes besoins.
Juste pour tous les curieux, 3879**41 = 1372495608710279938309112732193682350992788476725725221643007306215781514348937145528919415861895033279220952836384201346579163035594383625990271079 = 1.372... * 10**147
.
Une autre fonction valide que j'ai trouvée lors de la recherche d'expressions alternatives nécessitant malheureusement 32 octets: lambda S:`7**416`[len(S)%10+290]