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.