Mathematica, 65 bajtów
f[a___,x_,b___]/;NestList[2#-1&,a~Min~b/. 2->0,4]~SubsetQ~{a,b}=x
Definiuje funkcję, f
która powinna zostać wywołana z 5 argumentami, np
f[5, 9, 17, 33, 829]
Zasadniczo funkcję można wywołać z dowolną (niezerową) liczbą argumentów, ale możesz uzyskać nieoczekiwane wyniki ...
Myślę, że po raz pierwszy udało mi się postawić całe rozwiązanie nietrywialnego wyzwania po lewej stronie =
.
Wyjaśnienie
To rozwiązanie naprawdę działa dla nas w zakresie możliwości dopasowywania wzorców Mathematica. Podstawową funkcją, której używamy, jest to, że Mathematica nie może po prostu zdefiniować prostych funkcji, takich jak, f[x_] := (* some expression in x *)
ale możemy użyć dowolnie złożonych wzorców po lewej stronie, np. f[{a_, b_}, x_?OddQ] := ...
Dodałby definicję, f
która jest używana tylko wtedy, gdy jest wywoływana za pomocą dwuelementu lista i nieparzysta liczba całkowita. Dogodnie możemy już nadawać nazwy elementom dowolnie daleko w dół wyrażenia po lewej stronie (np. W ostatnim przykładzie moglibyśmy od razu odnieść się do dwóch elementów listy jako a
i b
).
Wzór, którego używamy w tym wyzwaniu jest f[a___,x_,b___]
. Tu a___
i b___
są sekwencje zero lub więcej argumentów i x
jest pojedynczym argumentem. Ponieważ po prawej stronie definicji jest po prostu x
, potrzebujemy trochę magii, która zapewni, że x
zostanie użyta dla szukanego przez nas wejścia a___
ib___
są po prostu symbolami wieloznacznymi obejmującymi pozostałe elementy.
Odbywa się to poprzez dołączenie warunku do wzorca za pomocą /;
. Prawa strona /;
(wszystko do =
) musi wrócić, True
aby ten wzór pasował. Piękno polega na tym, że dopasowujący wzór Mathematica spróbuje każdego zadania a
, x
ib
aby wejść do nas, więc poszukiwanie właściwego elementu odbywa się za nami. Jest to zasadniczo deklaratywne rozwiązanie problemu.
Jeśli chodzi o sam warunek:
NestList[2#-1&,a~Min~b/. 2->0,4]~SubsetQ~{a,b}
Zauważ, że to wcale nie zależy x
. Zamiast tego warunek ten zależy tylko od pozostałych czterech elementów. Jest to kolejna wygodna funkcja rozwiązania dopasowywania wzorców: ze względu na wzorce sekwencji a
i b
razem zawierają wszystkie inne dane wejściowe.
Zatem ten warunek musi sprawdzić, czy pozostałe cztery elementy są ciągłymi elementami z naszej sekwencji z co najwyżej jedną przerwą. Podstawowym pomysłem na sprawdzenie tego jest to, że generujemy kolejne cztery elementy z minimum (via ) i sprawdzamy, czy te cztery elementy są podzbiorem tego. Jedynymi danymi wejściowymi, które mogą powodować problemy, są te, które zawierająxi+1 = 2xi - 1
2
, ponieważ generuje to również prawidłowe elementy sekwencji, więc musimy sobie z tym poradzić osobno.
Ostatnia część: przejdźmy do samego wyrażenia, ponieważ jest tu trochę zabawniejszego cukru syntaktycznego.
...a~Min~b...
Ta notacja infix jest skrótem od Min[a,b]
. Pamiętajmy jednak, że a
i b
to sekwencje, więc to rzeczywiście rozwija się do czterech elementów Min[i1, i2, i3, i4]
i daje nam najmniejszy pozostały element w wejściu.
.../. 2->0
Jeśli wynikiem jest 2, zamieniamy ją na 0 (co wygeneruje wartości, które nie są w sekwencji). Przestrzeń jest niezbędna, ponieważ w przeciwnym razie Mathematica analizuje literał pływaka .2
.
NestList[...&,...,4]
Do tej wartości 4 razy stosujemy nienazwaną funkcję i zbieramy wyniki na liście.
2#-1&
To po prostu zwielokrotnia jego wkład przez 2 i zmniejsza go.
...~SubsetQ~{a,b}
Na koniec sprawdzamy, czy lista zawierająca wszystkie elementy z a
i b
stanowi jej podzbiór.