lambda S:`6793**164`[len(S)]
Provalo online!
Sfortunatamente ancora un byte più lungo della migliore risposta Python 2 finora; sebbene non usi l' enklact
approach.
Ora un byte in meno rispetto alla risposta di everytim !
Come funziona?
Dopo molta forza bruta, ho trovato un'espressione che risulta in un numero che ha le cifre giuste.
Ho notato che guardando solo una cifra specifica delle lunghezze della stringa data richiesto 3 byte ( %10
). Così ho scritto un altro programma Python ( link Pastebin ) per cercare ulteriormente i numeri che mappano direttamente la lunghezza delle stringhe di input al giorno della settimana.
Il numero magico è simile al seguente: 6793**164 = 28714733692312345620167113260575862840674216760386883406587492336415023761043044176257567032312859371641211117824224067391750766520256112063756278010050204239810862527958109285342869876264808102743173594017101607983288521836082497514383184553444755034407847810524083812459571382103831904835921560285915349760536969265992879312869538914200854305957428078269094250817029486005437991820466986793657301214564264748923199288698278615871481529585816783654841131577178922192383679718074693535597651237893794976519274268917335387876260270630339777501802739852278932279775510324916969726203688466311848240746465178859847331248655567344801
(un numero con 629 cifre decimali impressionanti)
E come puoi vedere, il numero fornisce la mappatura necessaria da [28, 20, 13, 11, 4, 16, 17] a [0, 1, 2, 3, 4, 5, 6] (le stringhe di Python sono 0- indicizzato):
2871 4 733692 3 1 2 34 5 6 20 1 6711326 0 5758628406742167603868834...
[4]^ [11]^ [13]^ [16]^ ^[17] ^[20] ^[28]
Il mio programma ha anche trovato altre espressioni che danno i numeri con la proprietà necessaria, anche se prendono più byte per rappresentare (29 invece di 28): 19439**540
, 34052**726
, 39311**604
, 44873**182
, 67930**164
e 78579**469
. (Queste sono tutte le espressioni trovate dal programma collegato; la sua esecuzione è durata diverse ore.)
Funzione alternativa che richiede 28 byte: lambda S:`7954<<850`[len(S)]
Funzione alternativa che richiede 29 byte: lambda S:`9699<<2291`[len(S)]
Funzione alternativa che richiede 30 byte: lambda S:`853<<4390`[len(S)+9]
Funzione alternativa che richiede 31 byte:lambda S:`1052<<3330`[len(S)+8]
Come funziona? Come ho generato quel numero? (Risposta a 30 byte)
La risposta di 30 byte è stata lambda S:`3879**41`[len(S)%10]
.
Osservando le lunghezze della stringa di input [28, 20, 13, 11, 4, 16, 17]
, ho notato che tutte le ultime cifre nella base dieci differiscono, risultando nell'elenco [8, 0, 3, 1, 4, 6, 7]
. Così ho solo bisogno di una mappatura da tale elenco per l'elenco di tutti i sette giorni della settimana, [0, 1, 2, 3, 4, 5, 6]
.
Il mio primo approccio ha semplicemente usato una stringa per eseguire il mapping:, lambda S:"13*24*560"[len(S)%10]
sebbene la stringa richiedesse undici byte ( "13*24*560"
).
Così ho scritto un programma Python ( link Pastebin ) per testare le espressioni aritmetiche che danno come risultato un numero intero con cifre corrispondenti, sperando di approfondire ulteriormente il programma. Ciò che mi è venuto in mente finora è `3879**41`
(solo dieci byte, l'unica e quindi la più piccola espressione che il mio programma trova).
Naturalmente, ci sono molte diverse espressioni possibili che si potrebbero provare; Ho appena avuto la fortuna che ce n'era uno nella forma a**b
con un risultato ragionevolmente piccolo che si adattava alle mie esigenze.
Solo per chiunque sia curioso, 3879**41 = 1372495608710279938309112732193682350992788476725725221643007306215781514348937145528919415861895033279220952836384201346579163035594383625990271079 = 1.372... * 10**147
.
Un'altra funzione valida che ho trovato durante la ricerca di espressioni alternative che purtroppo richiede 32 byte: lambda S:`7**416`[len(S)%10+290]