Wyzwanie
Biorąc pod uwagę liczbę całkowitą n ≥ 4 , wyprowadzaj permutację liczb całkowitych [0, n-1] z tą właściwością, że nie ma obok siebie dwóch kolejnych liczb całkowitych. Wartość permutacji pi
to suma abs(pi[i] - i)
wszystkich wskaźników i
.
Przykłady
(1, 3, 0, 2)
ma wartość6
(0, 2, 4, 1, 3)
ma wartość6
(0, 2, 4, 1, 3, 5)
ma wartość6
(0, 2, 4, 1, 5, 3, 6)
ma wartość8
Wynik Twojej odpowiedzi
Wynik Twojej odpowiedzi to suma wartości permutacji n = 4 .. 14
plus liczba bajtów zajętych przez kod. Im niższy wynik, tym lepiej. Twój kod musi dawać prawidłowe dane wyjściowe dla wszystkich tych wartości n
.
Musisz być w stanie uruchomić przesyłanie do ukończenia na swoim komputerze.
W przypadku remisu decydujący będzie czas ostatniej edycji, który spowodował odpowiedni wynik.
Czy to nie to samo pytanie, co to ?
Odpowiedzi na połączone pytanie nie będą konkurencyjne dla tego pytania, ponieważ nie podejmują żadnych wysiłków w celu optymalizacji wartości permutacji. Na przykład n=10
permutacja [1, 3, 5, 7, 9, 0, 2, 4, 6, 8]
podana w większości odpowiedzi daje wartość 30
. Możesz zrobić znacznie więcej niż to.
W części dotyczącej permutacji ogólna optymalna wartość wynosi co najwyżej 120
. (Dziękuję @Laikoni.) Natomiast odpowiedź Dennisa na poprzednie pytanie wynosi 222 . (Dziękujemy za @ user202729.)
źródło
[6,6,6,8,10,12,12,12,14,16,18]
dla wyniku 120. Co ciekawe, ten wzór można znaleźć w A078706 .A078706
zn=17
, która może mieć wynik20
.Odpowiedzi:
Galaretka ,
363433323130 bajtów, wynik: 120Dzięki Dennis za -1 bajtów! (domyślnie przez naprawienie błędu Jelly, chociaż funkcja ta jest późniejsza niż wyzwanie)
Nowa funkcja: skumulowana suma (
Ä
).Wypróbuj online!
Użyj 1-indeksowania.
Zajmuje również czas liniowy.
Ten program C ++ generuje leksykograficznie najmniejszą permutację, zakładając, że | i - p i | ≤ szerokość (gdzie szerokość jest stałą zakodowaną na stałe) dla wszystkich 0 ≤ i <n , ze złożonością czasową około O (szerokość 2 × 2 2 × szerokość × n) (która jest tylko O (n) dla stałej szerokości ): Wypróbuj online !
W jaki sposób?
Obserwuj wzór. Zauważmy, że sekwencja wszystkich elementów oprócz 4 ostatnich jest prefiksem
Oblicza różnicę przyrostową sekwencji.
Zwróć uwagę na okres 5.
Wdrożenie Jelly:
Dla 4 ostatnich elementów
wystarczy brutalna siła wszystkich 24 możliwości. O (1) .(uwaga: nie używam już brutalnej siły wszystkich 24 możliwości z wersji 32-bajtowej)
źródło
0 2 4 1 3 5 8 6
i ma większy współczynnik rozgałęzienia, ale nie ma tak prostego wzorca.CJam (60 bajtów + 120 = 180 punktów)
Zestaw testów online ze zintegrowanym ocenianiem
Przedłużenie do n = 24
Sekcja
źródło
Haskell , 146 + 89 punktów + bajty
Powtarza wzór [1,3,0,2], ostatnie
mod i 4
elementy są ręcznie dostrojone.Poprzedni algorytm (132 + 116):
Bruteforuje prawidłową liczbę skoków o długości ± 2 lub ± 3. Wybiera ostatni, który zawiera prawidłowe liczby, wydaje się działać dobrze i jest znacznie tańszy niż implementacja wyniku. Tio właśnie kończy czas przed ostatnim wynikiem, który wynosi 18.
Wypróbuj online!
źródło
Japt, 120 + 20 = 140
(Kopiowanie jednego z moich rozwiązań z drugiego wyzwania dałoby mi 227)
Wypróbuj lub użyj tej wersji, aby sprawdzić wyniki. Obie wersje mogą zacząć się na ciebie pojawiać około 9.
Wyjaśnienie
źródło
Rubin , 120 punktów +
112 106 9182 bajtówWypróbuj online!
Sekwencja jest w zasadzie
(a-2)+(a+2)%5
.Jeśli n mod 5 nie jest równy 0 lub 1, ostatnie 3 lub 4 elementy są różne.
Jest to wciąż na wpół zakodowane, zawsze znajduje najlepsze rozwiązanie, może może być trochę bardziej golfa, ale zabrakło mi pomysłów.
źródło
JavaScript (Node.js) , wynik 148 +
10973 bajtówWypróbuj online! Objaśnienie:
l
śledzi ostatnią wygenerowaną liczbę im
śledzi kolejną liczbę przeciwnej parzystości dol
; pol
przekroczenium+2
zmienne są wymieniane. Korekta jest wykonywana na początku sekwencji, aby sekwencje, których długości nie są wielokrotnościami 5, nie pomijały żadnych liczb, i dokonano innej korektyn=4
.źródło