Коли я дістаю свій бутерброд?


37

enter image description here

Дано один із наступних даних:

Куряча солодка цибуля Теріякі
Піч смажена курка
Груди індички
Італійський BMT
Тунець
Шинка чорна лісова
Фрикаделька Маринара
виведіть число від 1-7 (або 0-6), що представляє день тижня, коли ви отримаєте цю угоду, починаючи з понеділка як найменше число. Якщо бажано, введення може бути великим чи великим літером (наприклад, "італійський bmt"). Не дозволяється Інтернет.


8
Не реально зрозуміти, як ця складність Колмогорова. Текст - це вхід ... цифри - вихід.
— геокавель

5
Також в неділю кажуть "М’ясна маринара" або "М'ясна куля Марина Ра"?
— Erik the Outgolfer

17
Я майже впевнений, що це повинна бути Маринара, але кемінг на зображенні досить жахливий ...
— повністюлюдський

6
Якщо це комусь корисно: кількість as плюс кількість es у кожному вході відповідно [5,4,3,2,1,3,6].
— geokavel

Відповіді:


85

Python 2 , 38 30 28 байт

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]


1
Як ви створили це число? : o
— повністюлюдський

10
@icrieverytim Brute force.
— Джонатан Фрех

-9114**28це менше ціле число *, яке також працює (* в абсолютних значеннях не лише тому, що воно негативне - 111 цифр, а не 629). Не економить на байтах.
— Джонатан Аллан

4
Кожен раз я перевіряю питання PCG в HNQ, і, як правило, розчарований, коли моменти для гри в гольф - це трійка перших місць. Сьогодні я не розчарувався. Дякую!
— Сідні

4
@icrieverytim ಠ_ಠ - це саме те саме число, але вдвічі зменшилось вдвічі factor_ಠ: 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

18

Пітон , 26 байт

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

Спробуйте в Інтернеті!

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

Цей код випливає з мого досвіду з послідовностями De Bruijn та програмуванням для шахів.

У шахах ви часто працюєте з кількома 64-бітовими цілими числами, де кожен біт вказує на те, що щось є правдивим чи неправдивим щодо відповідного квадрата на шаховій дошці, наприклад, "тут є білий шматок" або "цей квадрат містить пішак".

Тому корисно мати можливість швидкого перетворення 2**nна nшвидке та дешеве. У C і C ++ найшвидший спосіб зробити це - множення на 64-бітну послідовність De Bruijn - еквівалентну зміщенню на nбіти - потім зсув 58 праворуч (для останнього поставте перші шість біт - переконайтеся, що ви ' повторно використовуючи непідписаний int, або ви отримаєте півтора разу) і знайдіть це число 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там, де х може бути 1 або 0, і це не впливає на результат для цих конкретних підпроектів - я встановив їх на 0 просто для мінімізації кількості, але зміна будь-якого з останніх 8 х не повинна впливати на довжина вихідного коду. Встановивши всі xs на 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;}

Спробуйте в Інтернеті!


i;char x[]="enklact";коротше, ніж i,x[]={101,110,107,108,97,99,116};.
— Джонатан Фрех

Я збирався розмістити це повідомлення: char*x="enklact"ще коротше: Спробуйте в Інтернеті!
— scottinet

Також можна видалити i=0.
— Джонатан Фрех

Ще коротша версія з використанням index: Спробуйте в Інтернеті!
— scottinet

@scottinet Приємно! Я ніколи раніше не використовував index (). Спасибі
— cleblanc



5

Я думав, що опублікую ще пару альтернатив

Javascript 38 байт

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

Пояснення: Бітові маски скелі?

Javascript 27 байт

s=>"240350671"[s.length%10]

друга альтернатива на 29 байт давно забутаa=
— Бруно Коста,

Для чого a=потрібна частина? Подивіться на відповідь Шаггі .
— геокавель

1
@BrunoCosta На цьому сайті ми не вимагаємо, щоб ви називали свої функції. Анонімні працюють, тому вам це не потрібно a=.
— Rɪᴋᴇʀ

1
@BrunoCosta це круто, це справді залежить від вас. Ви також можете просто не рахувати його в кількості байтів заголовка і включати його в фрагмент для зручності тестування.
— Rɪᴋᴇʀ

1
@MichaelBoger Unfofrtantly Я не думаю, що це може, тому що мінімальна кількість коду, щоб зробити цю роботу, я вважаю, що це щось у порядку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;)
— Ерік the Outgolfer

5
О, на думку fudge заради того, чому вкладається в словник Jelly?
— повністюлюдський

3
@icrieverytim Це не так, enkце рядок і lactateце слово. EDIT: щойно підтверджено, enklactateнемає в словнику.
— Ерік Аутгольфер

1
@icrieverytim Я думаю, що це просто лактат .
— Містер Xcoder

2
Боже, я хотів знайти спосіб знущатися зі словника Джеллі ... Можливо, наступного разу. : P
— повністюлюдський

3

Japt , 12 байт

0-індексується, приймає введення в малі регістри.

`kÇXsm`bUg#

Перевірте це


Пояснення

Неявне введення рядкового рядка U

`kÇXsm`

Стислий рядок kotinsm.

bUg#

Отримайте перший індекс ( b) символу в індексі ( g) 26 ( #) у U. (Так, індексація!)

Неявний вихід цілого результату.


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

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

`klact`bUg3

Перевірте це


Куди enпішов? : P
— повністюлюдський

1
@icrieverytim: that's a compressed string; en is compressed to an unprintable.
— Shaggy

7
I think I see a bUg in your code.
— shenles


3

JavaScript (ES6), 25 bytes

0-indexed.

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

Test it

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
This is 25 bytes!
— geokavel

Thanks, @geokavel. Don't know where I got those extra 3 bytes from; even counting f= would only make it 27.
— Shaggy

simple and effective solution. +1 :)
— Brian H.

@Shaggy Maybe your third extra byte was a trailing newline.
— Michael Boger

3

GolfScript, 12 bytes

{+}*93&(5?7%

Try it online!

Maps the inputs (via the sum of their code points) to 0 to 6.

Explanation

Found with a GolfScript snippet brute force tool I wrote a while ago...

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

Here is how this transforms each of the inputs to the desired result:

                                 {+}*   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 bytes

Using the enklact method:

=FIND(MID(A1,4,1),"enklact")

You can drop 2 bytes by converting this to Google Sheets and dropping the ")
— Taylor Scott

2

Perl 6, 22 bytes

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

Try it online!


perl 2017.07 accepts tr/enklact/^6/.comb[3] which would be 22 bytes, but tio.run apparently does not have it yet.
— Massa

(tio.run runs perl6 v2017.6)
— Massa

1
As long as an interpreter exists that can run the 22 byte version, it's valid.
— Shaggy


2

Husk, 10 bytes

%7^5←n93ṁc

Try it online!

Another port of my GolfScript answer. I'm sure eventually I'll find a language that can sum the code points for a single byte...

Husk (post-challenge update), 9 bytes

%7^5←n93Σ

Try it online!

Now, Σ does sum code points directly. Since this was added per a request after I answered this challenge, I'm not going to use it as my primary score though.





1

Perl 5, 43 + 1 (-p) = 44 bytes

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

Try it online!

Requires the first three characters of input to be upper case.


It has to be all uppercase, all lowercase, or regular.
— geokavel

Call it all uppercase, then. Anything beyond the first three characters is ignored.
— Xcali

1

Java 8, 26 bytes

Credit to @icrieverytim

Takes input as a char[]

s->"enklact".indexOf(s[3])

You can do s->"enklact".indexOf(s[3]) if you specify that you take input as a char array.
— shooqie

Is that okay? I've a few answers that can be shortened like that
— Roberto Graham


1

C++, 119 118 77 76 73 bytes

-41 bytes thanks to Peter Cordes
-1 byte thanks to Zacharý
-3 bytes thanks to Michael Boger

At the string index 3, character for every sandwich is different

#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);
}

Golfing with std::string, that was obvious ofc... what was i thinking...


1
std::find in a string literal (or maybe a std::string) seems like the obvious way to go. Basically the same idea as index or strchr that the C answers are using, in a data structure where the 0-5 is implicit from the position.
— Peter Cordes

You can remove the newline inbetween lines 2 and 3.
— Zacharý

You don't need a variable to store enklact. std::string("enklact").find(p[3]) works fine. This brings it down 3 characters.
— Michael Boger

You CAN pass string literals to your function (g++ only raises a warning) so the memcpy stuff isn't needed.
— Michael Boger

0

C# (.NET Core), 289 bytes

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()));}}

Run online


0

Golfscript, 13 bytes

Try it online!

'enklact'\3=?

Takes the 4th character (which, for each, will be unique) and looks it up in the string "enklact".

Alternatively:

'nklact'\3=?)

This takes advantage of the fact that Golfscript's ? function returns -1 if the element searched for is not found (which, for Monday, it will not). If this were allowed, the solution could be reduced by 1 byte.



0

K (oK), 13 bytes

Solution:

"enklact"?*3_

Try it online!

Examples:

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

Explanation:

Interpretted right-to-left, pull out the 4th element from the input and return the zero-index location in the "enklact" list:

"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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.