Python 2 , 38 30 28 bajtów
lambda S:`6793**164`[len(S)]
Wypróbuj online!
Niestety wciąż o jeden bajt dłużej niż najlepsza dotychczasowa odpowiedź w Pythonie 2; chociaż nie używa enklact
podejścia.
Teraz jeden bajt krótszy niż odpowiedź cri everytim !
Jak to działa?
Po dużej brutalnej sile znalazłem wyrażenie, którego wynikiem jest liczba z odpowiednimi cyframi.
Zauważyłem, że spojrzenie tylko na jedną konkretną cyfrę długości łańcucha wymaga 3 bajtów ( %10
). Napisałem więc inny program w języku Python ( link Pastebin ), aby dalej szukać liczb, które bezpośrednio mapują długości ciągów wejściowych na dzień tygodnia.
Magiczna liczba wygląda następująco: 6793**164 = 28714733692312345620167113260575862840674216760386883406587492336415023761043044176257567032312859371641211117824224067391750766520256112063756278010050204239810862527958109285342869876264808102743173594017101607983288521836082497514383184553444755034407847810524083812459571382103831904835921560285915349760536969265992879312869538914200854305957428078269094250817029486005437991820466986793657301214564264748923199288698278615871481529585816783654841131577178922192383679718074693535597651237893794976519274268917335387876260270630339777501802739852278932279775510324916969726203688466311848240746465178859847331248655567344801
(liczba z imponującymi 629 cyframi dziesiętnymi)
I jak widać, liczba zapewnia niezbędne mapowanie od [28, 20, 13, 11, 4, 16, 17] do [0, 1, 2, 3, 4, 5, 6] (ciągi Pythona to 0- indeksowane):
2871 4 733692 3 1 2 34 5 6 20 1 6711326 0 5758628406742167603868834...
[4]^ [11]^ [13]^ [16]^ ^[17] ^[20] ^[28]
Mój program znaleźć również inne wyrażenia, które poddają numery z wymaganą nieruchomości, choć ma więcej bajtów do reprezentowania (29 zamiast 28): 19439**540
, 34052**726
, 39311**604
, 44873**182
, 67930**164
i 78579**469
. (Są to wszystkie wyrażenia znalezione przez połączony program; jego wykonanie zajęło kilka godzin).
Alternatywna funkcja wymagająca 28 bajtów: lambda S:`7954<<850`[len(S)]
Alternatywna funkcja wymagająca 29 bajtów: lambda S:`9699<<2291`[len(S)]
Alternatywna funkcja wymagająca 30 bajtów: lambda S:`853<<4390`[len(S)+9]
Alternatywna funkcja wymagająca 31 bajtów:lambda S:`1052<<3330`[len(S)+8]
Jak to działa? Jak wygenerowałem ten numer? (Odpowiedź 30 bajtów)
30 bajt odpowiedź była lambda S:`3879**41`[len(S)%10]
.
Patrząc na długości łańcucha wejściowego [28, 20, 13, 11, 4, 16, 17]
zauważyłem, że wszystkie ostatnie cyfry w bazie dziesięciu różnią się, w wyniku czego powstaje lista [8, 0, 3, 1, 4, 6, 7]
. Więc tylko potrzebne mapowanie z tej listy do wykazu wszystkich siedmiu dni tygodnia [0, 1, 2, 3, 4, 5, 6]
.
Moje pierwsze podejście wykorzystało po prostu ciąg znaków do wykonania odwzorowania: lambda S:"13*24*560"[len(S)%10]
chociaż ciąg wymagał jedenastu bajtów ( "13*24*560"
).
Napisałem więc program w języku Python ( łącze Pastebin ), aby przetestować wyrażenia arytmetyczne, których wynikiem jest liczba całkowita z dopasowanymi cyframi, mając nadzieję na dalsze działanie programu. Do tej pory wymyśliłem `3879**41`
(tylko dziesięć bajtów, jedyne i przez to najmniejsze wyrażenie, które mój program znajduje).
Oczywiście istnieje wiele różnych możliwych wyrażeń, które można wypróbować; Po prostu miałem szczęście, że był taki w formie a**b
z dość małym wynikiem, który pasował do moich potrzeb.
Wystarczy dla każdego, ciekawy, 3879**41 = 1372495608710279938309112732193682350992788476725725221643007306215781514348937145528919415861895033279220952836384201346579163035594383625990271079 = 1.372... * 10**147
.
Kolejną ważną funkcję, którą znalazłem podczas wyszukiwania alternatywnych wyrażeń, która niestety wymaga 32 bajtów: lambda S:`7**416`[len(S)%10+290]