lambda S:`6793**164`[len(S)]
Спробуйте в Інтернеті!
На жаль, все ж на один байт довший, ніж найкращий відповідь Python 2; хоча не використовує enklact
-аб.
Тепер на один байт коротший, ніж відповідь я на криси !
Як це працює?
Після великої кількості грубої сили я знайшов вираз, який призводить до числа, яке має лише правильні цифри.
Я помітив, що для перегляду лише однієї конкретної цифри довжини заданого рядка потрібно 3 байти ( %10
). Тому я написав ще одну програму Python ( Pastebin link ) для подальшого пошуку номерів, які безпосередньо відображають довжину вхідних рядків до дня тижня.
Магічне число виглядає приблизно так: 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 link ) для перевірки на арифметичні вирази, які призводять до цілого числа з відповідними цифрами, сподіваючись на подальше гольф програми. Що я придумав поки що - це `3879**41`
лише десять байтів, єдине і, таким чином, найменше вираження, яке знаходить моя програма).
Звичайно, існує багато різних можливих виразів, які можна спробувати; Мені просто пощастило, що був такий у формі a**b
з досить невеликим результатом, який відповідав моїй потребі.
Тільки для тих , хто цікавих, 3879**41 = 1372495608710279938309112732193682350992788476725725221643007306215781514348937145528919415861895033279220952836384201346579163035594383625990271079 = 1.372... * 10**147
.
Ще одну дійсну функцію, яку я знайшов під час пошуку альтернативних виразів, на жаль, потрібно 32 байти: lambda S:`7**416`[len(S)%10+290]