lambda S:`6793**164`[len(S)]
Попробуйте онлайн!
К сожалению, до сих пор на один байт длиннее, чем лучший ответ Python 2; хотя не используя enklact
-approach.
Теперь один байт короче , чем я тании ответ everytim - х !
Как это работает?
После большого перебора я нашел выражение, которое приводит к числу, которое имеет только правильные цифры.
Я заметил, что для просмотра только одной конкретной цифры длины данной строки требуется 3 байта ( %10
). Поэтому я написал еще одну программу на Python ( ссылка на Pastebin ) для дальнейшего поиска чисел, которые напрямую отображают длины входных строк на день недели.
Магическое число выглядит так: 6793**164 = 28714733692312345620167113260575862840674216760386883406587492336415023761043044176257567032312859371641211117824224067391750766520256112063756278010050204239810862527958109285342869876264808102743173594017101607983288521836082497514383184553444755034407847810524083812459571382103831904835921560285915349760536969265992879312869538914200854305957428078269094250817029486005437991820466986793657301214564264748923199288698278615871481529585816783654841131577178922192383679718074693535597651237893794976519274268917335387876260270630339777501802739852278932279775510324916969726203688466311848240746465178859847331248655567344801
(число с впечатляющими 629 десятичными цифрами)
И, как вы можете видеть, число обеспечивает необходимое отображение от [28, 20, 13, 11, 4, 16, 17] к [0, 1, 2, 3, 4, 5, 6] (строки Python равны 0- индексированный):
2871 4 733692 3 1 2 34 5 6 20 1 6711326 0 5758628406742167603868834...
[4]^ [11]^ [13]^ [16]^ ^[17] ^[20] ^[28]
Моя программа также нашла другие выражения , которые дают номера с требуемым свойством, хотя они занимают более байты для представления (29 вместо 28): 19439**540
, 34052**726
, 39311**604
, 44873**182
, 67930**164
и 78579**469
. (Это все выражения, найденные связанной программой; ее выполнение заняло несколько часов.)
Альтернативная функция, которая требует 28 байтов: lambda S:`7954<<850`[len(S)]
Альтернативная функция, которая требует 29 байтов: lambda S:`9699<<2291`[len(S)]
Альтернативная функция, которая требует 30 байтов: lambda S:`853<<4390`[len(S)+9]
Альтернативная функция, которая требует 31 байт:lambda S:`1052<<3330`[len(S)+8]
Как это работает? Как я сгенерировал это число? (30-байтовый ответ)
30-байтовый ответ был lambda S:`3879**41`[len(S)%10]
.
Глядя на длину входной строки [28, 20, 13, 11, 4, 16, 17]
, я заметил, что все последние цифры в базовой десятке различаются, что приводит к появлению списка [8, 0, 3, 1, 4, 6, 7]
. Поэтому мне нужно было только сопоставление из этого списка со списком всех семи дней недели [0, 1, 2, 3, 4, 5, 6]
.
Мой первый подход просто использовал строку для выполнения отображения: lambda S:"13*24*560"[len(S)%10]
хотя для строки требовалось одиннадцать байтов ( "13*24*560"
).
Поэтому я написал программу на Python ( ссылка на Pastebin ) для проверки арифметических выражений, которые приводят к целому числу с совпадающими цифрами, в надежде на дальнейшее развитие программы. До сих пор я придумал `3879**41`
(только десять байтов, единственное и, следовательно, самое маленькое выражение, которое находит моя программа).
Конечно, есть много возможных выражений, которые можно попробовать; Мне просто повезло, что был один в форме a**b
с достаточно маленьким результатом, который соответствовал моим потребностям.
Просто для любопытных 3879**41 = 1372495608710279938309112732193682350992788476725725221643007306215781514348937145528919415861895033279220952836384201346579163035594383625990271079 = 1.372... * 10**147
.
Еще одна действительная функция, которую я нашел во время поиска альтернативных выражений, которая, к сожалению, требует 32 байта: lambda S:`7**416`[len(S)%10+290]