Cel
Otrzymujesz liczbę całkowitą n
( n > 1
). Musisz wyjście ile permutacji liczb całkowitych 1
do n
istnieją które zaczynają się 1
, w końcu n
, i nie ma dwóch kolejnych liczb całkowitych, które różnią się o 1.
Alternatywnie, jeśli weźmiesz pełny wykres K_n
i usuniesz krawędzie ścieżki 1-2-3-...-n
, musisz policzyć ścieżki Hamiltonian od 1
do n
na pozostałym wykresie.
Przykłady wykorzystają f(n)
funkcję, która pobiera n
i wyświetla liczbę prawidłowych permutacji, ale przesłanie może być funkcją lub programem.
Przykłady
W przypadku n = 6
, możliwe jest rozwiązanie1-3-5-2-4-6
Nie 1-3-5-2-6-4
jest to jednak prawidłowe rozwiązanie, ponieważ się nie kończy 6
.
W rzeczywistości n = 6
istnieją tylko 2 rozwiązania ( 1-4-2-5-3-6
jest to drugie).
Stąd f(6) = 2
.
Dla n = 4
jedynych permutacji, które zaczynają się 1
i kończą w, 4
są 1-2-3-4
i 1-3-2-4
. W obu z nich 2
sąsiaduje z 3
, podając kolejne liczby całkowite, które różnią się o 1. Dlatego f(4) = 0
.
Przypadki testowe
f(6) = 2
f(4) = 0
f(8) = 68
f(13) = 4462848
Kryterium wygranej
To jest golf golfowy, wygrywa najkrótsza odpowiedź.
źródło
[2..n-1]
nie zawiera delt1
lub-1
, musisz też sprawdzić, czy żadna z nich nie zaczyna się od,2
ani nie kończyn-1
...Q_ser:=z + 2 z^6 + 10 z^7 + 68 z^8 + 500 z^9 + 4174 z^10 + 38774 z^11 + 397584z^12 + 4462848 z^13 + 54455754 z^14
Spędzam teraz trochę czasu próbując użyć formuł, ale nie mogę skomponować takiej, która generuje sekwencję. Zadziwiające, że wykładnik z jest wprowadzeniem formuły, a wynikiem jest współczynnik mnożenia. Tym, jak można stąd wydedukować formułę, może być ta, która ma najkrótszą odpowiedź w bajtachOdpowiedzi:
MATL , 16 bajtów
Wypróbuj online!
Dla wejść przekraczających
12
zabraknie pamięci.Wyjaśnienie
źródło
Matematyka, 58 bajtów, czas wielomianowy ( n )
Jak to działa
Zamiast iterować permutacje brutalną siłą, stosujemy zasadę włączenia / wyłączenia, aby policzyć je kombinatorycznie.
Niech S będzie zbiorem wszystkich permutacji [1,…, n] z σ 1 = 1, σ n = n , i niech S i będzie zbiorem permutacji σ ∈ S takim, że | σ i - σ i + 1 | = 1. Zatem liczba, której szukamy, to
| S | - | S 1 ∪ ⋯ ∪ S n - 1 | = ∑ 2 ≤ k ≤ n + 1; 1 ≤ i 2 <⋯ < i k - 1 < n (−1) k - 2 | S i 2 ∩ ⋯ ∩ S i k - 1 |.
Teraz | S i 2 ∩ ⋯ ∩ S i k - 1 | zależy tylko od k i liczby j serii kolejnych indeksów w [ i 1 , i 2 ,…, i k - 1 , i k ] gdzie dla wygody ustalamy i 1 = 0 i i k = n . Konkretnie,
| S i 2 ∩ ⋯ ∩ S i k - 1 | = 2 j - 2 ( n - k ) !, dla 2 ≤ j ≤ k ≤ n ,
| S i 2 ∩ ⋯ ∩ S i k - 1 | = 1, dla j = 1, k = n + 1.
Liczba takich zestawów indeksów [ i 1 , i 2 ,…, i k - 1 , i k ] z przebiegami j wynosi
( k - 1 C j - 1 ) ( n - k C j - 2 ), dla 2 ≤ j ≤ k ≤ n ,
1, dla j = 1, k = n + 1.
Wynik jest zatem
(−1) n - 1 + ∑ 2 ≤ k ≤ n ∑ 2 ≤ j ≤ k (−1) k - 2 ( k - 1 C j - 1 ) ( n - k C j - 2 ) 2 j - 2 ( n - k )!
Wewnętrzna suma nad j mogą być zapisywane za pomocą hipergeometryczny 2 F 1 funkcji :
(−1) n - 1 + ∑ 2 ≤ k ≤ n (−1) k ( k - 1) 2 F 1 (2 - k , k - n ; 2; 2) ( n - k )!
do którego stosujemy transformację Pfaffa, która pozwala nam odegrać w golfa moc -1, używając wartości bezwzględnej:
(−1) n - 1 + ∑ 2 ≤ k ≤ n (−1) n ( k - 1) 2 F 1 ( k , k - n ; 2; 2) ( n - k )!
= | -1 + ∑ 1 ≤ k ≤ n ( k - 1) 2 F 1 ( k , k - n ; 2; 2) ( n - k )! |.
Próbny
źródło
Galaretka ,
1716 bajtówLink monadyczny.
Wypróbuj online!
W jaki sposób?
źródło
IỊṀ
jest prawidłowe. W szczególności, co jeśli na przykład-2
jest tam jedna z delt? Możesz to naprawićIAỊṀ
za +1.x <= 1
.Japt ,
1918 bajtówPrzetestuj online! Nie polecam testowania na czymkolwiek większym niż
10
.Wyjaśnienie
źródło
1
.n > 1
.05AB1E , 17 bajtów
Wypróbuj online!
źródło
¹1Š)˜
zapisuje bajt.Haskell,
7665 bajtówZaoszczędź 11 bajtów dzięki @xnor.
Korzystając z wyniku
Q_rec
na stronie 7 znaleziska @ ChristiaanWesterbeek, otrzymujemyNie rozumiem, jak ich następny wynik
ha
odnosi się do tego, ale po przyspieszeniu (najpierw przez zapamiętywanie, zobacz wcześniejsze wersje, a następnie jak poniżej) otrzymuję ich liczby.Chociaż powyższe jest w porządku
n=20
, jest zasadniczo przykładem, jak nie robić rekurencji. Oto szybsza wersja (tylko dlan>=6
), która również potrzebowałaby tylko stałej pamięci - gdyby tylko liczby nie rosły ...To daje
Nie ma problemu, aby uzyskać,
f 5000
ale nie chcę wkleić wyniku ...BTW, nie można używać fantazyjnej matematyki i nadal nie używać (ultra) brutalnej siły. Po pierwsze, zamiast patrzeć na wszystkie permutacje, spójrz na częściowe permutacje i rozszerzaj je tylko wtedy, gdy nie są już nieprawidłowe. Nie ma sensu patrzeć na wszystkie permutacje zaczynające się od
1 6 5
. Po drugie, niektóre częściowe kombinacje, takie jak1 3 5 7
i1 5 3 7
mają dokładnie takie same poprawne kontynuacje, więc obsługuj je razem. Korzystając z tych pomysłów, mogłem obliczyć wartości don=16
0,3 s.źródło
f n=sum$zipWith((*).f)[n-5..][n-4,1,10-2*n,4,n-2]
.Python, 125 bajtów
źródło
Mathematica, 66 bajtów
Wyjaśnienie
Function
z pierwszym argumentem#
.źródło
JavaScript (ES6),
100747260 bajtówPoniżej znajduje się wersja przed opanowaniem golfa przez @PeterTaylor
Dzięki odpowiedzi od @ChristianSievers, która zdołała sporządzić rozwiązanie Haskell z artykułu który znalazłem po googlowaniu „0, 2, 10, 68, 500, 4174, 38774, 397584”, oto wersja Javascript, która również nie permutuje.
Stosowanie
źródło
f(n)
kiedyn>1
, więc nie ma znaczenia, po co wróciszn=1
. Myślę też, żef(1)=1
jest poprawny.n<6?n==1|0:
aby uzyskać dodatkowe oszczędności dwóch znaków.f=n=>n--<6?!n|0:f(n)*--n+4*f(n--)-2*f(n--)*--n+f(n)*++n+f(n)
Brachylog , 26 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Python 3 ,
109107102 bajtówWypróbuj online!
Usunięto cztery bajty, nie próbując w jednym wierszu funkcji (jak sugeruje @shooqie), a drugi bajt, zastępując
abs
kwadrat. (Wymaga Python 3.5+)źródło
Python 2 , 136 bajtów
-10 bajtów dzięki @ovs.
Wypróbuj online!
źródło
Mathematica, 134 bajty
przypadki testowe n: 2–12
źródło
Python 2 , 105 bajtów
Wypróbuj online!
Jest to oparte na pracy Philippe'a Flajoleta odkrytej przez @Christiaan Westerbeek ; jest znacznie szybszy i dwa bajty krótszy niż moje rozwiązanie Python 3, które wylicza możliwe permutacje. (W Python 3
reduce
został irytująco przeniesiony dofunctools
.)Istnieje znacznie krótsza wersja z produktem kropkowym numpy, ale ta przepełnia się dość szybko i wymaga zaimportowania numpy. Ale za co warto:
źródło