Kiedy dostanę moją kanapkę?


37

wprowadź opis zdjęcia tutaj

Biorąc pod uwagę jeden z następujących danych wejściowych:

Kurczak ze słodkiej cebuli Teriyaki
Pieczony kurczak w piekarniku
Pierś z indyka
Włoski BMT
Tuńczyk
Szynka Czarnego Lasu
Klopsik Marinara
wypisz liczbę od 1-7 (lub 0-6) reprezentującą dzień tygodnia, w którym otrzymasz ofertę, zaczynając od poniedziałku jako najniższej liczby. Dane wejściowe mogą być pisane małymi lub dużymi literami, jeśli jest to preferowane (tj. „Włoski bmt”). Internet nie jest dozwolony.


8
Naprawdę nie widzę, jak ta złożoność Kołmogorowa. Tekst jest wejściem ... liczby są wyjściem.
geokavel

5
Czy w niedzielę mówi się także „Meatball Marinara” lub „Meatball Marina Ra”?
Erik the Outgolfer,

17
Jestem pewien, że ma być Marinara ale Keming na obrazie jest dość straszne ...
totallyhuman

6
Jeśli jest to przydatne dla każdego: liczba aplus liczba ena każdym wejściu wynosi odpowiednio [5,4,3,2,1,3,6].
geokavel

Odpowiedzi:


85

Python 2 , 38 30 28 bajtów

lambda S:`6793**164`[len(S)]

Wypróbuj online!

Niestety wciąż o jeden bajt dłużej niż najlepsza dotychczasowa odpowiedź w Pythonie 2; chociaż nie używa enklactpodejścia.

Teraz jeden bajt krótszy niż odpowiedź cri everytim !

Jak to działa?

Po dużej brutalnej sile znalazłem wyrażenie, którego wynikiem jest liczba z odpowiednimi cyframi.
Zauważyłem, że spojrzenie tylko na jedną konkretną cyfrę długości łańcucha wymaga 3 bajtów ( %10). Napisałem więc inny program w języku Python ( link Pastebin ), aby dalej szukać liczb, które bezpośrednio mapują długości ciągów wejściowych na dzień tygodnia.

Magiczna liczba wygląda następująco: 6793**164 = 28714733692312345620167113260575862840674216760386883406587492336415023761043044176257567032312859371641211117824224067391750766520256112063756278010050204239810862527958109285342869876264808102743173594017101607983288521836082497514383184553444755034407847810524083812459571382103831904835921560285915349760536969265992879312869538914200854305957428078269094250817029486005437991820466986793657301214564264748923199288698278615871481529585816783654841131577178922192383679718074693535597651237893794976519274268917335387876260270630339777501802739852278932279775510324916969726203688466311848240746465178859847331248655567344801(liczba z imponującymi 629 cyframi dziesiętnymi)

I jak widać, liczba zapewnia niezbędne mapowanie od [28, 20, 13, 11, 4, 16, 17] do [0, 1, 2, 3, 4, 5, 6] (ciągi Pythona to 0- indeksowane):

2871 4 733692 3 1 2 34 5 6 20 1 6711326 0 5758628406742167603868834... [4]^ [11]^ [13]^ [16]^ ^[17] ^[20] ^[28]

Mój program znaleźć również inne wyrażenia, które poddają numery z wymaganą nieruchomości, choć ma więcej bajtów do reprezentowania (29 zamiast 28): 19439**540, 34052**726, 39311**604, 44873**182, 67930**164i 78579**469. (Są to wszystkie wyrażenia znalezione przez połączony program; jego wykonanie zajęło kilka godzin).

Alternatywna funkcja wymagająca 28 bajtów: lambda S:`7954<<850`[len(S)]
Alternatywna funkcja wymagająca 29 bajtów: lambda S:`9699<<2291`[len(S)]
Alternatywna funkcja wymagająca 30 bajtów: lambda S:`853<<4390`[len(S)+9]
Alternatywna funkcja wymagająca 31 bajtów:lambda S:`1052<<3330`[len(S)+8]

Jak to działa? Jak wygenerowałem ten numer? (Odpowiedź 30 bajtów)

30 bajt odpowiedź była lambda S:`3879**41`[len(S)%10].

Patrząc na długości łańcucha wejściowego [28, 20, 13, 11, 4, 16, 17]zauważyłem, że wszystkie ostatnie cyfry w bazie dziesięciu różnią się, w wyniku czego powstaje lista [8, 0, 3, 1, 4, 6, 7]. Więc tylko potrzebne mapowanie z tej listy do wykazu wszystkich siedmiu dni tygodnia [0, 1, 2, 3, 4, 5, 6].

Moje pierwsze podejście wykorzystało po prostu ciąg znaków do wykonania odwzorowania: lambda S:"13*24*560"[len(S)%10]chociaż ciąg wymagał jedenastu bajtów ( "13*24*560").
Napisałem więc program w języku Python ( łącze Pastebin ), aby przetestować wyrażenia arytmetyczne, których wynikiem jest liczba całkowita z dopasowanymi cyframi, mając nadzieję na dalsze działanie programu. Do tej pory wymyśliłem `3879**41`(tylko dziesięć bajtów, jedyne i przez to najmniejsze wyrażenie, które mój program znajduje).

Oczywiście istnieje wiele różnych możliwych wyrażeń, które można wypróbować; Po prostu miałem szczęście, że był taki w formie a**bz dość małym wynikiem, który pasował do moich potrzeb.

Wystarczy dla każdego, ciekawy, 3879**41 = 1372495608710279938309112732193682350992788476725725221643007306215781514348937145528919415861895033279220952836384201346579163035594383625990271079 = 1.372... * 10**147.

Kolejną ważną funkcję, którą znalazłem podczas wyszukiwania alternatywnych wyrażeń, która niestety wymaga 32 bajtów: lambda S:`7**416`[len(S)%10+290]


1
Jak wygenerowałeś ten numer? : o
całkowicie ludzki,

10
@icrieverytim Brute force.
Jonathan Frech,

-9114**28jest mniejszą liczbą całkowitą *, która również działa (* w wartościach bezwzględnych nie tylko dlatego, że jest ujemna - 111 cyfr zamiast 629). Nie oszczędza jednak na bajtach.
Jonathan Allan,

4
Od czasu do czasu sprawdzam pytania PCG w HNQ i zwykle jestem rozczarowany, że języki gry w golfa to trzy najważniejsze miejsca. Dzisiaj nie zawiodłem się. Dziękuję Ci!
Sidney,

4
@icrieverytim ಠ_ಠ to właśnie ten sam numer, ale połowę ze współczynnikiem przesunięcia jednego więcej ಠ_ಠ: P
HyperNeutrino

49

Python 2 , 29 bajtów

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

Wypróbuj online!

Wyjaśnienie

Magiczny ciąg, enklactzostał znaleziony, szukając pierwszej kolumny z unikalnymi literami.

Pierwsza kolumna idzie, SOTITBMco nie jest przydatne, ponieważ zawiera duplikaty. Drugi i trzeci również nie działają, ponieważ są wvutulei eeranaaodpowiednio. Czwarta kolumna działa jednak, ponieważ ma wszystkie unikalne litery.

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

Python , 26 bajtów

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

Wypróbuj online!

Z długiem wdzięczności (za moją drugą prostą próbę golfa) na odpowiedź Jonathana Frecha - nie pomyślałbym, żebym użył długości sznurka zamiast litery wyróżniającej!

Ten kod wywodzi się z mojego doświadczenia z sekwencjami De Bruijna i programowaniem szachów.

W szachach często pracujesz z kilkoma 64-bitowymi liczbami całkowitymi, przy czym każdy bit wskazuje, że coś jest zgodne z prawdą lub fałszem w odniesieniu do odpowiedniego kwadratu na szachownicy, na przykład „jest tu biały kawałek” lub „ten kwadrat zawiera pionek”.

Dlatego warto szybko i tanio przekonwertować 2**nna n. W C i C ++ najszybszym sposobem na to jest pomnożenie przez 64-bitową sekwencję De Bruijn - równoważną przesunięciu o nbity - a następnie przesunięcie w prawo 58 (aby umieścić ostatnie sześć bitów na końcu - upewnij się, że ' ponownie używasz bez znaku int lub dostaniesz 1s połowę czasu) i poszukaj tej liczby 0..63 w tabeli, która daje ci odpowiedni, nktóry jest w tym samym zakresie, ale rzadko ten sam numer.

To jest trochę powiązane. Jednak zamiast zmieniać z 2**nna n, chcemy zmienić z nna inną 3-bitową liczbę. Tak więc ukrywamy nasze 3-bitowe liczby w magicznej 31-bitowej liczbie (28-bitowe przesunięcie wymaga bitów 28-30, z numeracją rozpoczynającą się od 0.)

Wygenerowałem potrzebną liczbę, po prostu widząc, jakie wartości musiały spaść gdzie (próbując zarówno 0..6, jak i 1..7 jako zestawy wyjściowe). Na szczęście zdarzają się nakładające się wartości (14, 16 i 17)! A ponieważ pierwszy tri-bit jest, 000a następny jest 001, nie potrzebujemy ostatnich 7 bitów, co powoduje mniej cyfr -> mniej bajtów źródła.

Wymagana liczba to 000xxxx001110101011xxxx100xxxx, gdzie x może wynosić 1 lub 0 i nie wpływa to na wynik dla tych konkretnych subwooferów - ustawiłem je na 0 tylko w celu zminimalizowania liczby, ale zmiana któregokolwiek z ostatnich 8 xs nie powinna mieć wpływu długość kodu źródłowego. Ustawienie wszystkich wartości x na 0 i pominięcie początku daje 1923136 w postaci dziesiętnej (lub 1D5840 w postaci szesnastkowej, ale wtedy potrzebujesz prefiksu 0x - szkoda!). & 7 na końcu tylko maskuje ostatnie 3 bity, możesz również użyj% 8, ale wtedy potrzebujesz nawiasów z powodu reguł pierwszeństwa operatora Pythona.

tl; dr: 1923136 koduje każdą z 3-bitowych kombinacji od 0 do 6 w dokładnie odpowiednich miejscach, w których te nazwy kanapek zdarzają się na miejscu, a następnie należy wziąć trzy ostatnie bity po prawidłowej zmianie.


Całkiem podobne do mojego podejścia z maską bitową, ale jeszcze lepsze.
Bruno Costa,

12

Galaretka , 10 bajtów

O co chodzi z tym całym „enklaktycznym” biznesem?

⁽ṃXị“Ð$¥»i

Monadyczny link zawierający listę znaków i zwracający poniedziałek = 1 dzień tygodnia.

Wypróbuj online! lub zobacz zestaw testowy

W jaki sposób?

⁽ṃ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

Jak znalazłeś -7761/retinalkombinację?
Emigna,

3
Napisałem pętlę, która przebiegała przez tworzenie „słów” i sprawdzanie, czy istnieją w słowniku. „Retinal” był jedynym między -32249 a 32250 (zakres ⁽...)
Jonathan Allan,

... niewielki błąd - zakres ⁽..jest rzeczywiście [-31349,32250] - [- 99999] (istnieją także inne liczby mogą reprezentować jeden z trzech lub mniej bajtów jak 7!!lub ȷ76)
Jonathan Allan

9

C (gcc) , 72 71 56 46 41 39 bajtów

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

Wypróbuj online!


i;char x[]="enklact";jest krótszy niż i,x[]={101,110,107,108,97,99,116};.
Jonathan Frech,

Już miał to opublikować: char*x="enklact"jest jeszcze krótszy: Wypróbuj online!
scottinet,

Możesz także usunąć i=0.
Jonathan Frech,

Jeszcze krótsza wersja index: Wypróbuj online!
scottinet,

@scottinet Nice! Nigdy wcześniej nie korzystałem z index (). Dzięki
cleblanc,



5

Myślałem, że opublikuję kilka innych alternatyw

JavaScript 38 bajtów

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

Objaśnienie: Skały z maską bitową?

Javascript 27 bajtów

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

druga alternatywa to 29 bajtów zapomnianycha=
Bruno Costa

Dlaczego a=potrzebna jest część? Spójrz na odpowiedź Kudłaty .
geokavel

1
@BrunoCosta Na tej stronie nie wymagamy od Ciebie podawania swoich funkcji. Anonimowe działają, więc nie potrzebujesz a=.
Rɪᴋᴇʀ

1
@BrunoCosta to super, to naprawdę zależy od Ciebie. Możesz także nie policzyć go w liczbie bajtów nagłówka i dołączyć go do fragmentu, aby ułatwić testowanie.
Rɪᴋᴇʀ

1
@MichaelBoger Bezskutecznie nie sądzę, aby tak było, ponieważ minimalna ilość kodu, aby ta praca działała, uważam, że jest to coś w stylua=s=>{b=s.Length;return(271474896&7<<b)>>b}
Bruno Costa

4

Galaretka , 11 bajtów

4ị“-ƭɼoṚ0»i

Wypróbuj online!

Wyjaśnienie:

4ị“-ƭɼoṚ0»i
4ị          4th element of z
  “-ƭɼoṚ0»i First index in "enklactate"

2
@ Mr.Xcoder, chyba że użyję enklactatezamiast enklactmojego ciągu, w którym to przypadku sprowadza go do 11;)
Erik the Outgolfer

5
Och, na litość boską , dlaczego enklactate w słowniku Jelly?
całkowicieludzki

3
@icrieverytim To nie enkjest , to ciąg znaków i lactatesłowo. EDYCJA: właśnie potwierdzona, enklactatenie ma jej w słowniku.
Erik the Outgolfer

1
@icrieverytim Myślę, że to tylko mleczan .
Pan Xcoder,

2
Aw maaan, chciałem znaleźć sposób na wyśmiewanie się ze słownika Jelly ... Może następnym razem. : P
totalnie ludzki,

3

Japt , 12 bajtów

Indeksowane 0, przyjmuje dane pisane małymi literami.

`kÇXsm`bUg#

Sprawdź to


Wyjaśnienie

Domniemane wprowadzanie małych liter U

`kÇXsm`

Skompresowany ciąg kotinsm.

bUg#

Zdobądź pierwszy indeks ( b) znaku w indeksie ( g) 26 ( #) w U. (Tak, owijanie indeksu!)

Wynik niejawny wyniku liczb całkowitych.


Alternatywny

To samo co powyżej (i wszyscy inni!), Po prostu używając zamiast tego znaków z indeksu 3, umożliwiając wprowadzanie wielkości liter.

`klact`bUg3

Sprawdź to


Gdzie enposzedł? : P
totalnie ludzki,

1
@icrieverytim: to skompresowany ciąg; enjest skompresowany do niedrukowalnego.
Kudłaty

7
Myślę, że widzę bUgw twoim kodzie.
shenles,


3

JavaScript (ES6), 25 bajtów

0-indeksowane.

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

Sprawdź to

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
To jest 25 bajtów !
geokavel

Dzięki, @geokavel. Nie wiem skąd mam te dodatkowe 3 bajty; nawet liczenie f=sprawi, że będzie to tylko 27.
Shaggy

proste i skuteczne rozwiązanie. +1 :)
Brian H.,

@Shaggy Może twój trzeci dodatkowy bajt był końcową nową linią.
Michael Boger,

3

GolfScript , 12 bajtów

{+}*93&(5?7%

Wypróbuj online!

Odwzorowuje dane wejściowe (poprzez sumę ich punktów kodowych) 0na 6.

Wyjaśnienie

Znaleziono za pomocą narzędzia Brute Force do fragmentu kodu GolfScript, które napisałem jakiś czas temu ...

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

Oto jak przekształca to każde wejście do pożądanego wyniku:

                                 {+}*   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 bajtów

Za pomocą enklactmetody:

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

Możesz upuścić 2 bajty, konwertując to na Arkusze Google i upuszczając")
Taylor Scott

2

Perl 6 , 22 bajtów

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

Wypróbuj online!


perl 2017.07 akceptuje tr/enklact/^6/.comb[3]22 bajty, ale tio.run najwyraźniej jeszcze go nie ma.
Massa

(tio.run działa perl6 v2017.6)
Massa

1
Tak długo, jak istnieje interpreter, który może obsługiwać 22-bajtową wersję, jest on poprawny.
Shaggy


2

Łuska , 10 bajtów

%7^5←n93ṁc

Wypróbuj online!

Kolejny port mojej odpowiedzi w GolfScript . Jestem pewien, że w końcu znajdę język, który może sumować punkty kodu dla jednego bajtu ...

Łuska (aktualizacja po prowokacji), 9 bajtów

%7^5←n93Σ

Wypróbuj online!

Teraz Σ robi bezpośrednio suma punktów kodowych. Ponieważ zostało to dodane na prośbę po tym, jak odpowiedziałem na to wyzwanie, nie zamierzam jednak używać go jako mojego głównego wyniku.





1

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

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

Wypróbuj online!

Wymaga, aby pierwsze trzy znaki wprowadzania były pisane wielkimi literami.


Musi to być cała wielka litera, cała mała litera lub zwykła.
geokavel

Nazwij to więc wielkimi literami. Wszystko poza pierwszymi trzema postaciami jest ignorowane.
Xcali,

1

Java 8, 26 bajtów

Podziękowania dla @icrieverytim

Pobiera dane jako char []

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

Możesz to zrobić, s->"enklact".indexOf(s[3])jeśli określisz, że bierzesz dane wejściowe jako tablicę znaków.
shooqie,

Czy to jest ok? Mam kilka odpowiedzi, które można tak skrócić
Roberto Graham


1

C ++, 119 118 77 76 73 bajtów

-41 bajtów dzięki Peter Cordes
-1 bajtów dzięki Zacharý
-3 bajtów dzięki Michael Boger

Przy indeksie 3 ciąg znaków każda kanapka jest inna

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

Gra w golfa std::string, to było oczywiste ... o czym myślałem ...


1
std::finddosłownie ciąg znaków (a może a std::string) wydaje się oczywistą drogą. Zasadniczo taki sam pomysł, indexlub strchr, że odpowiedź C używanego w strukturze danych, gdzie 0-5 jest niejawne z pozycji.
Peter Cordes

Możesz usunąć nowy wiersz pomiędzy wierszami 2 i 3.
Zacharý

Nie potrzebujesz zmiennej do przechowywania enklact. std::string("enklact").find(p[3])działa w porządku. Sprowadza to 3 znaki.
Michael Boger,

Możesz przekazać literały łańcuchowe do swojej funkcji (g ++ wywołuje tylko ostrzeżenie), więc memcpy nie jest potrzebne.
Michael Boger,

0

C # (.NET Core) , 289 bajtów

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

Uruchom online


0

Golfscript, 13 bajtów

Wypróbuj online!

'enklact'\3=?

Bierze 4. znak (który dla każdego będzie niepowtarzalny) i przegląda go w ciągu „ enklact”.

Alternatywnie:

'nklact'\3=?)

Wykorzystuje to fakt, że ?funkcja Golfscript zwraca -1, jeśli szukany element nie zostanie znaleziony (co w poniedziałek nie będzie). Gdyby to było dozwolone, rozwiązanie można by zmniejszyć o 1 bajt.



0

K (oK) , 13 bajtów

Rozwiązanie:

"enklact"?*3_

Wypróbuj online!

Przykłady:

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

Wyjaśnienie:

Zinterpretowany od prawej do lewej, wyciągnij 4. element z wejścia i zwróć położenie indeksu zero na liście „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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.