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


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.