Учитывая один из следующих входов:
Сладкая луковая курица терияки Жареная курица в духовке Грудка индейки Итальянский BMT тунец Шварцвальдская ветчина Фрикаделька Маринаравыведите число от 1 до 7 (или от 0 до 6), представляющее день недели, в которую вы получили эту сделку, начиная с понедельника, как самого низкого числа. Входные данные могут быть как строчными, так и прописными (если хотите) (например, «italian bmt»). Интернет не допускается.
code-golf
string
kolmogorov-complexity
geokavel
источник
источник
a
's плюс числоe
' в каждом входе равно [5,4,3,2,1,3,6] соответственно.sudo
.Ответы:
Python 2 ,
383028 байтПопробуйте онлайн!
К сожалению, до сих пор на один байт длиннее, чем лучший ответ 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]
источник
-9114**28
это меньшее целое число *, которое также работает (* в абсолютном выражении не только потому, что оно отрицательно - 111 цифр, а не 629). Не экономит на байтах, хотя.Python 2 , 29 байт
Попробуйте онлайн!
объяснение
Волшебная строка,
enklact
была найдена при поиске первого столбца с уникальными буквами.Первый столбец идет
SOTITBM
бесполезно, потому что он содержит дубликаты. Второй и третий тоже не работают, потому что они естьwvutule
иeeranaa
соответственно. Четвертый столбец, тем не менее, работает, так как содержит все уникальные буквы.источник
Python , 26 байт
Попробуйте онлайн!
С благодарностью (за мою вторую прямую игру в гольф) на ответ Джонатана Фреха - я бы не подумал использовать длину строки вместо отличительной буквы!
Этот код основан на моем опыте с De Bruijn Sequence и программированием для шахмат.
В шахматах вы часто работаете с несколькими 64-битными целыми числами, где каждый бит указывает что-то истинное или ложное в соответствующем квадрате на шахматной доске, например «здесь есть белая фигура» или «этот квадрат содержит пешку».
Поэтому полезно иметь возможность быстро конвертировать
2**n
вn
быстро и дешево. В C и C ++ самый быстрый способ сделать это - умножить на 64-битную последовательность де Брюина - эквивалентную сдвигу наn
биты - затем на 58 смещений вправо (чтобы поставить первые шесть битов последними - убедитесь, что вы ' используйте unsigned int, или вы получите половину времени 1 с) и найдите этот номер 0..63 в таблице, которая дает вам соответствующее значение,n
которое находится в том же диапазоне, но редко - то же самое число.Это отчасти связано. Однако вместо того, чтобы перейти от
2**n
кn
, мы хотим изменить сn
какого-то другого 3-битного числа. Итак, мы скрываем наши 3-битные числа в магическом 31-битном числе (для 28-битного сдвига требуются биты 28-30, нумерация начинается с 0.)Я сгенерировал нужное число, просто увидев, какие значения должны были упасть (пробуя оба 0,6 и 1,7 в качестве выходных наборов). К счастью, перекрывающиеся значения (14, 16 и 17) оказываются удачными! И поскольку первый трехбитный бит есть,
000
а следующий есть001
, нам не нужны самые левые 7 битов, в результате чего меньше цифр -> меньше байтов источника.Требуемое число
000xxxx001110101011xxxx100xxxx
, где x может быть 1 или 0, и это не влияет на результат для этих конкретных сабов - я установил их на 0, чтобы минимизировать число, но изменение любого из последних 8 xs не должно влиять длина исходного кода. Если задать для всех значений x значение 0 и опустить начало, то получится 1923136 в десятичном виде (или 1D5840 в шестнадцатеричном, но тогда вам понадобится префикс 0x - позор!). В конце & 7 просто маскирует последние 3 бита, вы также можете используйте% 8, но тогда вам понадобятся круглые скобки из-за правил приоритета оператора python.tl; dr: 1923136 кодирует каждую из трехбитовых комбинаций от 0 до 6 точно в тех точных точках, в которых эти имена сэндвичей оказываются на месте, а затем нужно взять последние три бита после сдвига вправо.
источник
Желе , 10 байт
Что со всем этим бизнесом?
Монадическая ссылка, содержащая список символов и возвращающая понедельник = 1 день недели.
Попробуйте онлайн! или посмотрите набор тестов
Как?
источник
-7761/retinal
комбо?⁽..
.)⁽..
фактически равен [-31349,32250] - [- 99,999] (есть и другие числа, которые можно представить с тремя или менее байтами, такими как7!!
илиȷ76
)C (gcc) ,
727156464139 байтПопробуйте онлайн!
источник
i;char x[]="enklact";
короче чемi,x[]={101,110,107,108,97,99,116};
.char*x="enklact"
еще короче: Попробуйте онлайн!i=0
.index
: попробуйте онлайн!MATL ,
1615 байтПопробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
Perl 5 , 24 байта
Код 23 байта + 1 для
-p
.-4 байта благодаря @nwellnhof !
Попробуйте онлайн!
источник
Я думал, что выложу пару других альтернатив
Javascript 38 байт
Пояснение: Бит-маска пород?
JavaScript 27 байт
источник
a=
a=
нужна часть? Посмотрите на ответ Шегги .a=
.a=s=>{b=s.Length;return(271474896&7<<b)>>b}
Желе , 11 байт
Попробуйте онлайн!
Объяснение:
источник
enklactate
вместоenklact
своей строки, в этом случае она снижается до 11;)enk
строка, аlactate
слово. РЕДАКТИРОВАТЬ: только что подтвердил,enklactate
не в словаре.Japt , 12 байт
0-индексированный, принимает ввод в нижнем регистре.
Попробуй это
объяснение
Неявный ввод строчной буквы
U
Сжатая строка
kotinsm
.Получить первый индекс (
b
) символа в index (g
) 26 (#
) вU
. (Ага, индексная упаковка!)Неявный вывод целочисленного результата.
альтернатива
То же, что и выше (и все остальные!), Просто вместо этого используются символы с индексом 3, что позволяет вводить регистр заглавия.
Попробуй это
источник
en
? : Pen
сжимается до непечатного.bUg
в вашем коде.05AB1E , 11 байт
1 байт благодаря Erik the Outgolfer и 1 байт благодаря Magic Octopus Urn.
Попробуйте онлайн!
источник
"enklact"
->’enkl†¼’
’enkl†¼’
->.•ΛΓ2º•
JavaScript (ES6), 25 байт
0 индексированные.
Попробуй это
источник
f=
получится только 27.GolfScript , 12 байт
Попробуйте онлайн!
Сопоставляет входы (через сумму их кодовых точек)
0
с6
.объяснение
Найден с помощью грубого инструмента GolfScript, который я написал недавно ...
Вот как это преобразует каждый из входов в желаемый результат:
источник
Excel, 28 байт
Используя
enklact
метод:источник
")
Perl 6 , 22 байта
Попробуйте онлайн!
источник
tr/enklact/^6/.comb[3]
что будет 22 байта, но у tio.run его пока нет.v2017.6
)CJam , 11 байт
Попробуйте онлайн!
Порт моего ответа на GolfScript . Явное чтение входных данных стоит 1 байт, но мы сохраняем два при суммировании кодовых точек.
источник
Шелуха , 10 байт
Попробуйте онлайн!
Еще один порт моего ответа на GolfScript . Я уверен, что в конце концов я найду язык, который может суммировать кодовые точки для одного байта ...
Шелуха (обновление после вызова), 9 байт
Попробуйте онлайн!
Теперь
Σ
же кодовые точки суммы непосредственно. Так как это было добавлено к запросу после того, как я ответил на этот вызов, я не собираюсь использовать его в качестве основного результата.источник
Pyth , 13 байт
Проверьте все контрольные примеры.
Альтернатива:
3
может быть заменено любым из следующих значений:[3, 4, 11, 13, 21, 24, 25, 26]
источник
Пайк , 12 байт
Попробуй это здесь!
источник
Протон , 23 байта
Попробуйте онлайн!
:П
источник
Perl 5 , 43 + 1 (
-p
) = 44 байтаПопробуйте онлайн!
Требуются первые три символа ввода в верхнем регистре.
источник
Java 8, 26 байт
Кредит @icrieverytim
Вводит как символ []
источник
s->"enklact".indexOf(s[3])
если укажете, что вы берете ввод как массив символов.Haskell , 36 байт
-9 байт благодаря H.PWiz.
Попробуйте онлайн!
Альтернативный раствор, 45 байт
Это использует
indexOf
функцию вData.List
качествеelemIndex
.Попробуйте онлайн!
источник
break
. Благодарность!C ++,
119118777673 байта-41 байт благодаря Петру Кордесу
-1 байт благодаря Захарию
-3 байт благодаря Майклу Богеру
В строковом индексе 3 символ каждого сэндвича отличается
std::string
Игра в гольф , это было очевидно ofc ... о чем я думал ...источник
std::find
в строковом литерале (или, может быть,std::string
) кажется очевидным путем. По сути, та же идея, чтоindex
илиstrchr
ответы C, используются в структуре данных, где 0-5 подразумевается от позиции.std::string("enklact").find(p[3])
работает отлично. Это сбивает 3 персонажа.C # (.NET Core) , 289 байт
Запустить онлайн
источник
Golfscript, 13 байт
Попробуйте онлайн!
Берет 4-й символ (который для каждого будет уникальным) и ищет его в строке "
enklact
".В качестве альтернативы:
Это использует тот факт, что
?
функция Golfscript возвращает -1, если искомый элемент не найден (чего в понедельник не будет). Если бы это было разрешено, решение могло бы быть уменьшено на 1 байт.источник
Dyalog APL, 13 байт
Попробуйте онлайн!
источник
K (ок) , 13 байтов
Решение:
Попробуйте онлайн!
Примеры:
Объяснение:
Интерпретируется справа налево, извлеките 4-й элемент из ввода и верните нулевой индекс в списке «enklact»:
источник