Magiczna sekwencja to sekwencja liczb całkowitych nieujemnych, x[0..n-1]
tak że istnieją dokładnie takie x[i]
przypadkii
Na przykład 6,2,1,0,0,0,1,0,0,0 to magiczna sekwencja, ponieważ jest 6 0, 2 1 i tak dalej.
Napisz funkcję, która gdy otrzyma n, wyświetla wszystkie magiczne sekwencje o długości n
Wygrywa program, który może wygenerować poprawny wynik dla najwyższej wartości n w ciągu 10 sekund. (Wszystkie programy są mile widziane)
Na przykład program Alice może poradzić sobie z wartością do n = 15 w ciągu 10 sekund, podczas gdy program Boba może poradzić sobie z wartością do n = 20 w tym samym czasie. Bob wygrywa.
Platforma: Linux 2.7GHz @ 4 procesory
number
fastest-code
sequence
Agnishom Chattopadhyay
źródło
źródło
n>5
z rozwiązaniem innym niż forma[n-4, 2, 1, ..., 0, 0, 1, 0, 0, 0]
? Podniosłem wzrokn=20
i nie znalazłem żadnego, i zastanawiam się, czy popełniam błąd.Odpowiedzi:
Python, nr 10 8
Wykorzystuje to fakt, który udowodnię, że jedynymi magicznymi sekwencjami długości
n
są:[1, 2, 1, 0]
i[2, 0, 2, 0]
dlan=4
[2, 1, 2, 0, 0]
dlan=5
[n-4, 2, 1, 0, 0, ..., 0, 0, 1, 0, 0, 0]
dlan>=7
Tak więc,
n>=7
wystarczy zwrócić ogromną krotkę. Mogę to zrobić w przybliżeniun=10^8
na moim laptopie, co prawdopodobnie jest ograniczone pamięcią; i już się zawiesza. (Dzięki trichoplax za pomysł użycia krotek zamiast list.) Lub, jeśli zamiast tego można wydrukować słownik niezerowych wpisów,{0:n-4, 1:2, 2:1, (n-4):1}
można to zrobić dla ginormousn
.Udowadniam wyjątkowość
n>=7
; pozostałe można sprawdzić za pomocą brutalnej siły lub pracy w skrzynce.Suma wpisów
l
to łączna liczba wszystkich liczb na liście, czyli jej długośćn
. Lista mal[0]
zera, a więcn-l[0]
niezerowe wpisy. Ale z definicjil[0]
musi być niezerowa lub otrzymujemy sprzeczność, a każdy z niezerowych wpisów ma co najmniej 1. To już stanowi sumę zl[0] + (n-l[0]-1)*1 = n-1
ogólnej sumyn
. Więc nie liczącl[0]
, może być najwyżej jeden 2 i żaden wpis większy niż 2.Ale to oznacza, że jedynymi niezerowymi wpisami są
l[0], l[1], l[2], and l[l[0]]
, których wartości są co najwyżej,l[0]
i permutacja1,1,2
, co daje maksymalną sumęl[0]+4
. Ponieważ ta suma wynosin
co najmniej 7, mamyl[0]>=3
i takl[l[0]]=1
. Teraz jest co najmniej jeden1
, co oznaczal[1]>=1
, ale jeślil[1]==1
to inny1
, tol[1]>=2
znaczy, żel[1]
jest samotny2
. To dajel[2]=1
, a wszystkie pozostałe wpisy są0
, więcl[0]=n-4
, co uzupełnia rozwiązanie.źródło
Python 3, nr 40
Wykonuje pierwsze wyszukiwanie możliwych list, wypełniając wpisy od prawej do lewej, zatrzymując wyszukiwanie z sufiksem, jeśli nie jest prawdopodobne, co może się zdarzyć, jeśli:
n
(suma dla całej listy musi byćn
)i*l[i]
przyrostka przekraczan
(suma dla całej listy musi byćn
)Miałem oryginalne przetestowane prefiksy od lewej do prawej, ale poszło to wolniej.
Wyjścia do
n=30
to:Z wyjątkiem pierwszych trzech list
[1, 2, 1, 0], [2, 0, 2, 0], [2, 1, 2, 0, 0]
istnieje dokładnie jedna lista każdej długościn>6
i ma ona formę[n-4, 2, 1, ..., 0, 0, 1, 0, 0, 0]
. Ten wzór utrzymuje się co najmniejn=50
. Podejrzewam, że zachowuje się wiecznie, w takim przypadku generowanie ogromnej liczby z nich jest banalne. Nawet jeśli nie, matematyczne zrozumienie możliwych rozwiązań znacznie przyspieszy wyszukiwanie.źródło
n=0
. Tęskniłem za tym, że zwracamy wynik za jedenn
, nie licząc wynikówn
. To mnie podniecan=40
.Pyth - 15 bajtów
Używa brutalnej siły we wszystkich możliwych sekwencjach len,
n
a następnie filtruje.Pełne wyjaśnienie już wkrótce.
Wypróbuj tutaj online .
źródło
K, 26 bajtów
Podobnie jak podejście Maltysena, brutalna siła. Sercem programu jest predykat, który sprawdza, czy dany wektor jest „magiczny”:
Zbuduj wektor jota tak długo, jak wektor wejściowy (
!#x
), policz wystąpienia każdej cyfry ((+/x=)'
) i porównaj wynik z wektorem wejściowym (x~
). Jeśli jest dopasowanie, masz magiczną sekwencję.Niestety, ten pierwszy dźgnięcie wydaje się być dość powolny. Testowanie przy użyciu Kona na moim laptopie zajmuje około 12 sekund, aby obsłużyć n = 7. Muszę to przemyśleć.
źródło