Когда я получу свой бутерброд?

37

введите описание изображения здесь

Учитывая один из следующих входов:

Сладкая луковая курица терияки
Жареная курица в духовке
Грудка индейки
Итальянский BMT
тунец
Шварцвальдская ветчина
Фрикаделька Маринара
выведите число от 1 до 7 (или от 0 до 6), представляющее день недели, в которую вы получили эту сделку, начиная с понедельника, как самого низкого числа. Входные данные могут быть как строчными, так и прописными (если хотите) (например, «italian bmt»). Интернет не допускается.

geokavel
источник
8
Не очень понимаю, как у Колмогорова такая сложность. Текст - это ввод ... числа - это вывод.
геокавель
5
Также в воскресенье говорят "Фрикаделька Маринара" или "Фрикаделька Марина Ра"?
Эрик Outgolfer
17
Я почти уверен, что это должна быть Маринара, но образ на изображении довольно ужасный ...
полностью человек
6
Если это кому-нибудь пригодится: число a's плюс число e' в каждом входе равно [5,4,3,2,1,3,6] соответственно.
геокавель

Ответы:

85

Python 2 , 38 30 28 байт

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]

Джонатан Фрех
источник
1
Как вы сгенерировали это число? : o
Полностью человек
10
@icrieverytim Грубая сила.
Джонатан Фрех
-9114**28это меньшее целое число *, которое также работает (* в абсолютном выражении не только потому, что оно отрицательно - 111 цифр, а не 629). Не экономит на байтах, хотя.
Джонатан Аллан
4
Время от времени я проверяю вопросы PCG в HNQ и, как правило, разочаровываюсь, обнаружив, что языки игры в гольф - это первые три места. Сегодня я не был разочарован. Спасибо!
Сидни
4
@icrieverytim ಠ_ಠ это то же самое число, но уменьшенное вдвое с коэффициентом сдвига еще на один ಠ_ಠ: P
HyperNeutrino
49

Python 2 , 29 байт

lambda s:'enklact'.find(s[3])

Попробуйте онлайн!

объяснение

Волшебная строка, enklactбыла найдена при поиске первого столбца с уникальными буквами.

Первый столбец идет SOTITBMбесполезно, потому что он содержит дубликаты. Второй и третий тоже не работают, потому что они есть wvutuleи eeranaaсоответственно. Четвертый столбец, тем не менее, работает, так как содержит все уникальные буквы.

lambda s:'enklact'.find(s[3])

lambda s:                      # declare a function that takes a single paramater s
                  .find(    )  # find the index of the first instance of...
                        s[3]   # the fourth (0-indexing) character of s...
         'enklact'             # in the magic string
totallyhuman
источник
18

Python , 26 байт

lambda S:1923136>>len(S)&7

Попробуйте онлайн!

С благодарностью (за мою вторую прямую игру в гольф) на ответ Джонатана Фреха - я бы не подумал использовать длину строки вместо отличительной буквы!

Этот код основан на моем опыте с 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 точно в тех точных точках, в которых эти имена сэндвичей оказываются на месте, а затем нужно взять последние три бита после сдвига вправо.

Майкл Богер
источник
Очень похоже на мой подход с битовой маской, но даже лучше.
Бруно Коста
12

Желе , 10 байт

Что со всем этим бизнесом?

⁽ṃXị“Ð$¥»i

Монадическая ссылка, содержащая список символов и возвращающая понедельник = 1 день недели.

Попробуйте онлайн! или посмотрите набор тестов

Как?

⁽ṃXị“Ð$¥»i - Link: list of characters, sandwichName  e.g. "Tuna"
⁽ṃX        - base 250 literal                             -7761
   ị       - index into sandwichName (1-indexed & modular) 'n'
    “Ð$¥»  - dictionary word                               "retinal"
         i - index of                                           5
Джонатан Аллан
источник
Как вы нашли -7761/retinalкомбо?
Эминья
3
Написал цикл, который пробегал, создавая "слова" и проверяя, существуют ли они в словаре. «Ретинал» был единственным между -32249 и 32250 (диапазон ⁽...)
Джонатан Аллан
... небольшая ошибка - диапазон ⁽..фактически равен [-31349,32250] - [- 99,999] (есть и другие числа, которые можно представить с тремя или менее байтами, такими как 7!!или ȷ76)
Джонатан Аллан
9

C (gcc) , 72 71 56 46 41 39 байт

f(char*s){s=index(s="enklact",s[3])-s;}

Попробуйте онлайн!

cleblanc
источник
i;char x[]="enklact";короче чем i,x[]={101,110,107,108,97,99,116};.
Джонатан Фрех
Собирался опубликовать это на: char*x="enklact"еще короче: Попробуйте онлайн!
Скоттинет
Также вы можете удалить i=0.
Джонатан Фрех
Еще более короткая версия с использованием index: попробуйте онлайн!
Скоттинет
@ Scottinet Хорошо! Я никогда не использовал index () раньше. Спасибо
cleblanc
5

Я думал, что выложу пару других альтернатив

Javascript 38 байт

a=s=>(271474896&7<<s.Length)>>s.Length

Пояснение: Бит-маска пород?

JavaScript 27 байт

s=>"240350671"[s.length%10]
Бруно Коста
источник
2-ая ​​альтернатива давно a=
Бруно Коста
Зачем a=нужна часть? Посмотрите на ответ Шегги .
геокавель
1
@BrunoCosta На этом сайте мы не требуем, чтобы вы называли свои функции. Анонимные работают, поэтому вам не нужно a=.
17
1
@ BrunoCosta это круто, это действительно зависит от вас. Вы также можете просто не подсчитать его в числе байтов заголовка и включить его во фрагмент для облегчения тестирования.
17
1
@MichaelBoger Несомненно, я не думаю, что это возможно, потому что минимальный объем кода для этой работы, я полагаю, это что-то вродеa=s=>{b=s.Length;return(271474896&7<<b)>>b}
Бруно Коста
4

Желе , 11 байт

4ị“-ƭɼoṚ0»i

Попробуйте онлайн!

Объяснение:

4ị“-ƭɼoṚ0»i
4ị          4th element of z
  “-ƭɼoṚ0»i First index in "enklactate"
Эрик Аутгольфер
источник
2
@ Mr.Xcoder, если только я не использую enklactateвместо enklactсвоей строки, в этом случае она снижается до 11;)
Эрик Outgolfer
5
О, ради помадки, почему enklactate в словаре Jelly?
полностью человек
3
@icrieverytim Это не enkстрока, а lactateслово. РЕДАКТИРОВАТЬ: только что подтвердил, enklactateне в словаре.
Эрик Outgolfer
1
@icrieverytim Я думаю, что это просто лактат .
г-н Xcoder
2
О, Мааан, я хотел найти способ издеваться над словарем Желе ... Может быть, в следующий раз. : P
полностью человек
3

Japt , 12 байт

0-индексированный, принимает ввод в нижнем регистре.

`kÇXsm`bUg#

Попробуй это


объяснение

Неявный ввод строчной буквы U

`kÇXsm`

Сжатая строка kotinsm.

bUg#

Получить первый индекс ( b) символа в index ( g) 26 ( #) в U. (Ага, индексная упаковка!)

Неявный вывод целочисленного результата.


альтернатива

То же, что и выше (и все остальные!), Просто вместо этого используются символы с индексом 3, что позволяет вводить регистр заглавия.

`klact`bUg3

Попробуй это

мохнатый
источник
Куда делась en? : P
полностью человек
1
@icrieverytim: это сжатая строка; enсжимается до непечатного.
Лохматый
7
Я думаю, что вижу bUgв вашем коде.
Шенлес
3

05AB1E , 11 байт

1 байт благодаря Erik the Outgolfer и 1 байт благодаря Magic Octopus Urn.

.•ΛΓ2º•I3èk

Попробуйте онлайн!

Мистер Xcoder
источник
"enklact"->’enkl†¼’
Эрик Outgolfer
’enkl†¼’->.•ΛΓ2º•
Волшебная урна осьминога
@MagicOctopusUrn О, спасибо
мистер Xcoder
@ Mr.Xcoder, вот как я это понял.
Волшебная Урна Осьминога
@MagicOctopusUrn сохранит в архиве, спасибо: p
Mr. Xcoder
3

JavaScript (ES6), 25 байт

0 индексированные.

s=>"enklact".search(s[3])

Попробуй это

o.innerText=(f=
s=>"enklact".search(s[3])
)(i.value);oninput=_=>o.innerText=f(i.value)
<select id=i><option selected value="Sweet Onion Chicken Teriyaki">Sweet Onion Chicken Teriyaki</option><option value="Oven Roasted Chicken">Oven Roasted Chicken</option><option value="Turkey Breast">Turkey Breast</option><option value="Italian BMT">Italian BMT</option><option value="Tuna">Tuna</option><option value="Black Forest Ham">Black Forest Ham</option><option value="Meatball Marinara">Meatball Marinara</option></select><pre id=o>

мохнатый
источник
1
Это 25 байтов !
геокавель
Спасибо, @geokavel. Не знаю, откуда я взял эти дополнительные 3 байта; даже при подсчете f=получится только 27.
Лохматый
простое и эффективное решение. +1 :)
Брайан Х.
@Shaggy Может быть, ваш третий лишний байт был завершающим переводом строки.
Майкл Богер
3

GolfScript , 12 байт

{+}*93&(5?7%

Попробуйте онлайн!

Сопоставляет входы (через сумму их кодовых точек) 0с 6.

объяснение

Найден с помощью грубого инструмента GolfScript, который я написал недавно ...

{+}*  # Sum all code points.
93&   # ... AND 93.
(     # Decrement.
5?    # ... raised to the fifth power.
7%    # ... modulo 7.

Вот как это преобразует каждый из входов в желаемый результат:

                                 {+}*   93&     (            5?   7%
Sweet Onion Chicken Teriyaki     2658    64    63     992436543    0
Oven Roasted Chicken             1887    93    92    6590815232    1
Turkey Breast                    1285     5     4          1024    2
Italian BMT                       965    69    68    1453933568    3
Tuna                              408    24    23       6436343    4
Black Forest Ham                 1446     4     3           243    5
Meatball Marinara                1645    77    76    2535525376    6
Мартин Эндер
источник
2

Excel, 28 байт

Используя enklactметод:

=FIND(MID(A1,4,1),"enklact")
Wernisch
источник
Вы можете сбросить 2 байта, преобразовав это в Google Sheets и сбросив")
Тейлор Скотт
2

Perl 6 , 22 байта

tr/enklact/^6/.comb[3]

Попробуйте онлайн!

Масса
источник
Perl 2017.07 принимает, tr/enklact/^6/.comb[3]что будет 22 байта, но у tio.run его пока нет.
Масса
(tio.run запускает perl6 v2017.6)
Масса
1
Пока существует интерпретатор, который может запустить 22-байтовую версию, он действителен.
Лохматый
2

Шелуха , 10 байт

%7^5←n93ṁc

Попробуйте онлайн!

Еще один порт моего ответа на GolfScript . Я уверен, что в конце концов я найду язык, который может суммировать кодовые точки для одного байта ...

Шелуха (обновление после вызова), 9 байт

%7^5←n93Σ

Попробуйте онлайн!

Теперь Σ же кодовые точки суммы непосредственно. Так как это было добавлено к запросу после того, как я ответил на этот вызов, я не собираюсь использовать его в качестве основного результата.

Мартин Эндер
источник
1

Perl 5 , 43 + 1 ( -p) = 44 байта

for$i(S,O,TUR,I,TUN,B,M){$"++;$_=$"if/^$i/}

Попробуйте онлайн!

Требуются первые три символа ввода в верхнем регистре.

Xcali
источник
Он должен быть прописным, строчным или обычным.
геокавель
Тогда назовите все это прописными буквами. Все, кроме первых трех символов, игнорируется.
Xcali
1

Java 8, 26 байт

Кредит @icrieverytim

Вводит как символ []

s->"enklact".indexOf(s[3])
Роберто Грэм
источник
Вы можете сделать это, s->"enklact".indexOf(s[3])если укажете, что вы берете ввод как массив символов.
shooqie
Все хорошо? У меня есть несколько ответов, которые могут быть сокращены таким образом
Роберто Грэм
1

Haskell , 36 байт

-9 байт благодаря H.PWiz.

f s=length$fst$span(/=s!!3)"enklact"

Попробуйте онлайн!

Альтернативный раствор, 45 байт

Это использует indexOfфункцию в Data.Listкачестве elemIndex.

import Data.List
(`elemIndex`"enklact").(!!3)

Попробуйте онлайн!

totallyhuman
источник
1
37 байтов
H.PWiz
@ H.PWiz О, аккуратное оскорбление break. Благодарность!
полностью человек
1
36
H.PWiz
@ H.PWiz Ха-ха, как я скучал по этому. XD
полностью человек
1

C ++, 119 118 77 76 73 байта

-41 байт благодаря Петру Кордесу
-1 байт благодаря Захарию
-3 байт благодаря Майклу Богеру

В строковом индексе 3 символ каждого сэндвича отличается

#include<string>
int s(char*p){return std::string("enklact").find(p[3]);}
std::initializer_list<char*> t{
    "Sweet Onion Chicken Teriyaki",
    "Oven Roasted Chicken",
    "Turkey Breast",
    "Italian BMT",
    "Tuna",
    "Black Forest Ham",
    "Meatball Marinara"
};

for (auto& a : t) {
    std::cout << s(a);
}

std::stringИгра в гольф , это было очевидно ofc ... о чем я думал ...

HatsuPointerKun
источник
1
std::findв строковом литерале (или, может быть, std::string) кажется очевидным путем. По сути, та же идея, что indexили strchrответы C, используются в структуре данных, где 0-5 подразумевается от позиции.
Питер Кордес
Вы можете удалить новую строку между строками 2 и 3.
Zacharý
Вам не нужна переменная для хранения enklact. std::string("enklact").find(p[3])работает отлично. Это сбивает 3 персонажа.
Майкл Богер
Вы МОЖЕТЕ передать строковые литералы своей функции (g ++ только выдает предупреждение), так что вещи в memcpy не нужны.
Майкл Богер
0

C # (.NET Core) , 289 байт

using System;class c{delegate int s(string r);static void Main(){s y=x=>{if(x[0]==83)return 1;if(x[0]==79)return 2;if (x[0]==84&x[2]=='r')return 3;if(x[0]==73)return 4;if(x[0]==84)return 5;if(x[0] ==66)return 6;if(x[0]==77)return 7;return 0;};Console.Write(y.Invoke(Console.ReadLine()));}}

Запустить онлайн

snorepion
источник
0

Golfscript, 13 байт

Попробуйте онлайн!

'enklact'\3=?

Берет 4-й символ (который для каждого будет уникальным) и ищет его в строке "enklact ".

В качестве альтернативы:

'nklact'\3=?)

Это использует тот факт, что ?функция Golfscript возвращает -1, если искомый элемент не найден (чего в понедельник не будет). Если бы это было разрешено, решение могло бы быть уменьшено на 1 байт.

Джозия Уинслоу
источник
0

K (ок) , 13 байтов

Решение:

"enklact"?*3_

Попробуйте онлайн!

Примеры:

> "enklact"?*3_"Black Forest Ham"
5
> "enklact"?*3_"Turkey Breast"
2

Объяснение:

Интерпретируется справа налево, извлеките 4-й элемент из ввода и верните нулевой индекс в списке «enklact»:

"enklact"?*3_  / the solution
           3_  / 3 drop, 3_"Turkey Breast" => "key Breast" 
          *    / first, *"key Breast" => "k"
         ?     / lookup right in left
"enklact"      / list to lookup element in
streetster
источник