Mathematica, 65 bajtów
f[a___,x_,b___]/;NestList[2#-1&,a~Min~b/. 2->0,4]~SubsetQ~{a,b}=x
Definiuje funkcję, fktó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ę, fktó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 ai 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 xjest pojedynczym argumentem. Ponieważ po prawej stronie definicji jest po prostu x, potrzebujemy trochę magii, która zapewni, że xzostanie 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ć, Trueaby ten wzór pasował. Piękno polega na tym, że dopasowujący wzór Mathematica spróbuje każdego zadania a, xib 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 ai brazem 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 - 12 , 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 ai bto 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 ai bstanowi jej podzbiór.