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 Marinarawypisz 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.
code-golf
string
kolmogorov-complexity
geokavel
źródło
źródło
a
plus liczbae
na każdym wejściu wynosi odpowiednio [5,4,3,2,1,3,6].sudo
.Odpowiedzi:
Python 2 ,
383028 bajtówWypróbuj online!
Niestety wciąż o jeden bajt dłużej niż najlepsza dotychczasowa odpowiedź w Pythonie 2; chociaż nie używaenklact
podejś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**164
i78579**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**b
z 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]
źródło
-9114**28
jest 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.Python 2 , 29 bajtów
Wypróbuj online!
Wyjaśnienie
Magiczny ciąg,
enklact
został znaleziony, szukając pierwszej kolumny z unikalnymi literami.Pierwsza kolumna idzie,
SOTITBM
co nie jest przydatne, ponieważ zawiera duplikaty. Drugi i trzeci również nie działają, ponieważ sąwvutule
ieeranaa
odpowiednio. Czwarta kolumna działa jednak, ponieważ ma wszystkie unikalne litery.źródło
Python , 26 bajtów
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**n
nan
. W C i C ++ najszybszym sposobem na to jest pomnożenie przez 64-bitową sekwencję De Bruijn - równoważną przesunięciu on
bity - 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,n
który jest w tym samym zakresie, ale rzadko ten sam numer.To jest trochę powiązane. Jednak zamiast zmieniać z
2**n
nan
, chcemy zmienić zn
na 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,
000
a następny jest001
, 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.
źródło
Galaretka , 10 bajtów
O co chodzi z tym całym „enklaktycznym” biznesem?
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?
źródło
-7761/retinal
kombinację?⁽..
.)⁽..
jest rzeczywiście [-31349,32250] - [- 99999] (istnieją także inne liczby mogą reprezentować jeden z trzech lub mniej bajtów jak7!!
lubȷ76
)C (gcc) ,
727156464139 bajtówWypróbuj online!
źródło
i;char x[]="enklact";
jest krótszy niżi,x[]={101,110,107,108,97,99,116};
.char*x="enklact"
jest jeszcze krótszy: Wypróbuj online!i=0
.index
: Wypróbuj online!MATL ,
1615 bajtówWypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
źródło
Perl 5 , 24 bajtów
23 bajtowy kod + 1 dla
-p
.-4 bajty dzięki @nwellnhof !
Wypróbuj online!
źródło
Myślałem, że opublikuję kilka innych alternatyw
JavaScript 38 bajtów
Objaśnienie: Skały z maską bitową?
Javascript 27 bajtów
źródło
a=
a=
potrzebna jest część? Spójrz na odpowiedź Kudłaty .a=
.a=s=>{b=s.Length;return(271474896&7<<b)>>b}
Galaretka , 11 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
enklactate
zamiastenklact
mojego ciągu, w którym to przypadku sprowadza go do 11;)enk
jest , to ciąg znaków ilactate
słowo. EDYCJA: właśnie potwierdzona,enklactate
nie ma jej w słowniku.Japt , 12 bajtów
Indeksowane 0, przyjmuje dane pisane małymi literami.
Sprawdź to
Wyjaśnienie
Domniemane wprowadzanie małych liter
U
Skompresowany ciąg
kotinsm
.Zdobądź pierwszy indeks (
b
) znaku w indeksie (g
) 26 (#
) wU
. (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.
Sprawdź to
źródło
en
poszedł? : Pen
jest skompresowany do niedrukowalnego.bUg
w twoim kodzie.05AB1E , 11 bajtów
Zaoszczędzono 1 bajt dzięki Erikowi Outgolfer i 1 bajt dzięki Magic Octopus Urn.
Wypróbuj online!
źródło
"enklact"
->’enkl†¼’
’enkl†¼’
->.•ΛΓ2º•
JavaScript (ES6), 25 bajtów
0-indeksowane.
Sprawdź to
źródło
f=
sprawi, że będzie to tylko 27.GolfScript , 12 bajtów
Wypróbuj online!
Odwzorowuje dane wejściowe (poprzez sumę ich punktów kodowych)
0
na6
.Wyjaśnienie
Znaleziono za pomocą narzędzia Brute Force do fragmentu kodu GolfScript, które napisałem jakiś czas temu ...
Oto jak przekształca to każde wejście do pożądanego wyniku:
źródło
Excel, 28 bajtów
Za pomocą
enklact
metody:źródło
")
Perl 6 , 22 bajtów
Wypróbuj online!
źródło
tr/enklact/^6/.comb[3]
22 bajty, ale tio.run najwyraźniej jeszcze go nie ma.v2017.6
)CJam , 11 bajtów
Wypróbuj online!
Port mojej odpowiedzi w GolfScript . Jednoznaczny odczyt danych wejściowych kosztuje 1 bajt, ale oszczędzamy dwa podczas sumowania punktów kodowych.
źródło
Łuska , 10 bajtów
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
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.źródło
Pyth , 13 bajtów
Sprawdź wszystkie przypadki testowe.
Alternatywny:
3
można zastąpić dowolną z następujących wartości:[3, 4, 11, 13, 21, 24, 25, 26]
źródło
Pyke , 12 bajtów
Wypróbuj tutaj!
źródło
Proton , 23 bajty
Wypróbuj online!
: P
źródło
Perl 5 , 43 + 1 (
-p
) = 44 bajtyWypróbuj online!
Wymaga, aby pierwsze trzy znaki wprowadzania były pisane wielkimi literami.
źródło
Java 8, 26 bajtów
Podziękowania dla @icrieverytim
Pobiera dane jako char []
źródło
s->"enklact".indexOf(s[3])
jeśli określisz, że bierzesz dane wejściowe jako tablicę znaków.Haskell , 36 bajtów
-9 bajtów dzięki H.PWiz.
Wypróbuj online!
Alternatywne rozwiązanie, 45 bajtów
Używa
indexOf
funkcji wData.List
aselemIndex
.Wypróbuj online!
źródło
break
. Dzięki!C ++,
119118777673 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
Gra w golfa
std::string
, to było oczywiste ... o czym myślałem ...źródło
std::find
dosłownie ciąg znaków (a może astd::string
) wydaje się oczywistą drogą. Zasadniczo taki sam pomysł,index
lubstrchr
, że odpowiedź C używanego w strukturze danych, gdzie 0-5 jest niejawne z pozycji.std::string("enklact").find(p[3])
działa w porządku. Sprowadza to 3 znaki.C # (.NET Core) , 289 bajtów
Uruchom online
źródło
Golfscript, 13 bajtów
Wypróbuj online!
Bierze 4. znak (który dla każdego będzie niepowtarzalny) i przegląda go w ciągu „
enklact
”.Alternatywnie:
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.źródło
Dyalog APL, 13 bajtów
Wypróbuj online!
źródło
K (oK) , 13 bajtów
Rozwiązanie:
Wypróbuj online!
Przykłady:
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”:
źródło