Python 2 , 38 30 28 bytes
lambda S:`6793**164`[len(S)]
Experimente online!
Infelizmente ainda um byte a mais do que a melhor resposta do Python 2 até agora; embora não use a enklact
abordagem-.
Agora, um byte menor que a resposta de cri everytim !
Como funciona?
Depois de muita força bruta, encontrei uma expressão que resulta em um número com os dígitos certos.
Percebi que olhar apenas um dígito específico do comprimento da string requeria 3 bytes ( %10
). Então, eu escrevi outro programa Python ( link Pastebin ) para procurar mais números que mapeiam diretamente os comprimentos das strings de entrada para o dia da semana.
O número mágico é assim: 6793**164 = 28714733692312345620167113260575862840674216760386883406587492336415023761043044176257567032312859371641211117824224067391750766520256112063756278010050204239810862527958109285342869876264808102743173594017101607983288521836082497514383184553444755034407847810524083812459571382103831904835921560285915349760536969265992879312869538914200854305957428078269094250817029486005437991820466986793657301214564264748923199288698278615871481529585816783654841131577178922192383679718074693535597651237893794976519274268917335387876260270630339777501802739852278932279775510324916969726203688466311848240746465178859847331248655567344801
(um número com impressionantes 629 dígitos decimais)
E como você pode ver, o número fornece o mapeamento necessário de [28, 20, 13, 11, 4, 16, 17] a [0, 1, 2, 3, 4, 5, 6] (as seqüências de caracteres Python são 0- indexados):
2871 4 733692 3 1 2 34 5 6 20 1 6711326 0 5758628406742167603868834...
[4]^ [11]^ [13]^ [16]^ ^[17] ^[20] ^[28]
Meu programa também encontrou outras expressões que produzem números com a propriedade necessária, embora eles levam mais bytes para representar (29 em vez de 28): 19439**540
, 34052**726
, 39311**604
, 44873**182
, 67930**164
e 78579**469
. (Essas são todas as expressões encontradas pelo programa vinculado; sua execução levou várias horas.)
Função alternativa que requer 28 bytes: lambda S:`7954<<850`[len(S)]
Função alternativa que requer 29 bytes: lambda S:`9699<<2291`[len(S)]
Função alternativa que requer 30 bytes: lambda S:`853<<4390`[len(S)+9]
Função alternativa que requer 31 bytes:lambda S:`1052<<3330`[len(S)+8]
Como funciona? Como eu gerei esse número? (Resposta de 30 bytes)
A resposta de 30 bytes foi lambda S:`3879**41`[len(S)%10]
.
Observando os comprimentos da string de entrada [28, 20, 13, 11, 4, 16, 17]
, notei que todos os últimos dígitos da base dez diferem, resultando na lista [8, 0, 3, 1, 4, 6, 7]
. Então, eu só precisava de um mapeamento dessa lista para a lista de todos os sete dias da semana [0, 1, 2, 3, 4, 5, 6]
.
Minha primeira abordagem simplesmente usou uma string para realizar o mapeamento:, lambda S:"13*24*560"[len(S)%10]
embora a string exigisse onze bytes ( "13*24*560"
).
Então, escrevi um programa Python ( link Pastebin ) para testar expressões aritméticas que resultam em um número inteiro com dígitos correspondentes, na esperança de aprimorar ainda mais o programa. O que eu criei até agora é `3879**41`
(apenas dez bytes, a única e, portanto, menor expressão que meu programa encontra).
Obviamente, existem muitas expressões possíveis diferentes que alguém poderia tentar; Eu apenas tive sorte que havia um na forma a**b
com um resultado razoavelmente pequeno que se encaixava na minha necessidade.
Apenas para qualquer pessoa curiosa 3879**41 = 1372495608710279938309112732193682350992788476725725221643007306215781514348937145528919415861895033279220952836384201346579163035594383625990271079 = 1.372... * 10**147
.
Outra função válida que encontrei ao procurar expressões alternativas que infelizmente exigem 32 bytes: lambda S:`7**416`[len(S)%10+290]