Rzeczy, które warto wiedzieć:
Po pierwsze, szczęśliwe liczby.
Szczęśliwe liczby są generowane w następujący sposób:
Weź wszystkie liczby naturalne:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20...
Następnie usuń co drugi numer.
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39...
Teraz 3
jest bezpieczny.
Usuń co trzeci numer:
1, 3, 7, 9, 13, 15, 19, 21, 25, 27, 31, 33, 37, 39, 43, 45, 49, 51, 55, 59...
Teraz 7
jest bezpieczny.
Usuń co 7 liczbę.
Kontynuuj i usuwaj każdy n
numer, gdzie n
jest pierwszy bezpieczny numer po eliminacji.
Ostateczna lista bezpiecznych liczb to szczęśliwe liczby.
Pechowe liczby składają się z osobnych list liczb, które są [U1, U2, U3... Un]
.
U1
to pierwszy zestaw liczb usunięty ze szczęśliwych „kandydatów”, więc są to:
2, 4, 6, 8, 10, 12, 14, 16, 18, 20...
U2
jest usunięty drugi zestaw liczb:
5, 11, 17, 23, 29, 35, 41, 47, 53, 59...
I tak dalej itd. ( U3
Jest trzecią listą, U4
czwartą itd.)
Wyzwanie:
Twoim zadaniem jest, po otrzymaniu dwóch danych wejściowych m
i n
wygenerowanie m
th liczby na liście Un
.
Przykładowe dane wejściowe i wyjściowe:
(5, 2) -> 29
(10, 1) -> 20
Okular:
- Twój program musi działać
m
do1e6
, an
nawet do100
.- Masz gwarancję, że zarówno
m
in
są dodatnimi liczbami całkowitymi. - Jeśli jesteś ciekawy,
U(1e6, 100)
=5,333,213,163
. (Dziękuję @pacholik!)
- Masz gwarancję, że zarówno
- Twój program musi to obliczyć w ciągu 1 dnia na rozsądnym nowoczesnym komputerze.
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach!
PS: Byłoby miło, gdyby ktoś wymyślił ogólną formułę ich generowania. Jeśli masz formułę, podaj ją w swojej odpowiedzi!
(1e6,1e6)
?n=1
przypadku? Ponieważ jest to wyjątkowe - dla wszystkich innych przypadków, indeks następnej szczęśliwej liczby oparty na 0n-1
.Odpowiedzi:
CJam , 74 bajty
Wypróbuj online! Przekroczą limit czasu dla większych przypadków, więcej na temat ograniczeń czasowych poniżej.
Wyjaśnienie:
Nasz program bezwstydnie pożycza kod aditsu, aby wygenerować listę N szczęśliwych liczb, a zamiana 1 na 2 daje przyrost w każdej fazie sita. Pozostałe kody zmniejszają się na każdym elemencie, aż do znalezienia zera (przez krojenie i dołączanie nieodkresowanego ogona) i skutecznie zlicza kroki w każdej z N faz sita jednocześnie.
Wyczucie czasu:
Jeśli absolutnie musisz uruchomić program w przeglądarce dla większych liczb, możesz użyć tego interpretera i pozwolić skryptowi na kontynuowanie, jeśli pojawi się monit, ale może to być zbyt wolne, aby się zakwalifikować. Użycie ( M , N ) = (100,100) zajmuje ~ 247 sekund. Iteracja programów jest względnie liniowa pod względem M , więc obliczenia (1e6,100) mogą zająć ~ 29 dni.
Za pomocą interpretera powłoki na komputerze program oblicza (100,100) w ~ 6s i oblicza (1e4,100) w ~ 463s. Program powinien być w stanie obliczyć (1e6,100) w ~ 13-17 godzin. W takim przypadku założę, że program się kwalifikuje.
Uwaga: wszystkie czasy zostały zaokrąglone w górę zarówno w pomiarach, jak i obliczeniach.
źródło
Perl,
87858281 bajtówObejmuje +4 za
-pX
Podaj dane wejściowe STDIN jako jedną linię z n jako pierwszą (zauważ, że jest to odwrotność kolejności sugerowanej w wyzwaniu). Aby obliczyć
U(1000000, 100)
:Algorytm oparty na aditsu „s szczęśliwe liczby odpowiedzieć Złożoność czas jest
O(n^2)
więc to raczej szybko do wymaganego zakresu. Obudowa100, 1000000
daje5333213163
w 0,7 sekundy. Z powodu problemów, jakie ma perl zdo$0
rekurencją bazową, zużywa dużo pamięci. Przepisanie go jako funkcji spowodowałoby użycie pamięci,O(n)
ale jest o kilka bajtów dłuższeunlucky.pl
:Działa to tak, jak pokazano, ale użyj literału,
^S
aby uzyskać wynik.Nie wiem o żadnym wcześniejszym użyciu
$^S
w Perlgolf.źródło
(1e6,100)
?do$0
to jest zasadniczo nieosiągalny na żadnym realistycznym komputerze. Ale jeśli tyle pamięci istniało około 2 lat. Tak naprawdę nie napisałem i nie przetestowałem normalnej wersji opartej na podprogramach, ale spodziewałbym się, że skończy się za kilka miesięcy i będzie działał nawet na komputerach z bardzo małą pamięcią. Dobrze, że te wartości nie mieszczą się w wymaganym zakresie dla tego wyzwania.(1e6,100)
ciągu jednego dnia? Co masz na myśli mówiąc, że te wartości nie są wymagane?n
im
są podane w odwrotnej kolejności. Dane100 1000000
wejściowe obliczają sięU(1000000, 100)
i dają5,333,213,163
w 0,7 sekundy. Jest to zdecydowanie najszybszy z obecnie opublikowanych(100,1e6)
się, że będę znacznie szybszy(1e6,100)
i pomyślałem, że to wytłumaczenie błyskawicy 0,7 sekundy!Python 3, 170
Funkcja L generuje rząd możliwych szczęśliwych liczb (jeśli k to Prawda) lub Un (jeśli Fałsz). Ocenione leniwie (więc nie muszę generować nieskończonych list n-1, jeśli chcę Un ).
Uruchomić funkcję U .
Prędkość
Uruchomienie U (1 000 000; 100) na moim komputerze z PyPy zajmuje około 1h 45min. Podejrzewam, że jakieś cztery godziny z CPython. (Tak, dokładnie 4 godz. 20 min.)
Gdybym użył listy zamiast generatorów, mógłbym zyskać trochę prędkości, ale potrzebowałbym listy o większym rozmiarze niż pozwala mi Python. A jeśli tak, potrzebowałby dziesiątek gigabajtów pamięci RAM.
Tak, a U (1 000 000; 100) = 5 333 213 163 .
źródło
Haskell
Nie można obliczyć dla n = 1:
175160 bajtówPo kompilacji komputer potrzebował 2h 35m na obliczenie danych wejściowych
(1000000,100)
użycia:Próbowałem pozbyć się
where
modułów, ale wydaje się, że wpływają one na szybkość i nie jestem pewien, dlaczego ... Ale myślę, że można tu zrobić więcej przycinania.Metodą do zastosowania jest
m?n
zapytanie o odpowiedź na pytaniem
in
.Nie golfił
Myślę, że możliwe jest połączenie funkcji „skipeverynth” i „everynth” w jedną funkcję, która zwraca parę.
Użyłem kodu tego rodzaju osoby do pominięcia każdego n-tego elementu. Zrobiłem to sam kilka razy, ale zawsze było to znacznie bardziej nieefektywne i nie mogłem zrozumieć, dlaczego.
Możliwość obliczenia dla wszystkich n: 170 bajtów
Jest to w zasadzie to samo, ale
max
trzeba było wrzucić kilka funkcji, aby obsłużyć specjalny przypadekn=1
.źródło
R 82 bajty
Stosowanie
Musi mieć wystarczająco duży wektor, aby zacząć, więc jest wystarczająco dużo liczb, aby zwrócić wartość. Utworzony wektor ma już około 800 Mb, a funkcja może obsłużyć do m = 1e4 i n = 100, więc wciąż znacznie poniżej celu.
Aby utworzyć wystarczająco duży wektor do obliczenia f (1e6,100), trzeba wziąć wektor początkowy 1: 2e10. Z powodu procedur alokacji danych Rs tworzy to wektor> 70 Gb, którego nie można uruchomić na żadnym komputerze, który znam, chociaż kod by się uruchomił.
Dla porównania f (1e4,100) działa w około około 30 sekund. Na tej podstawie i kilku mniejszych testach f (1e6,100) zajęłoby około godziny.
źródło
Rakieta 332 bajty
Wersja bez golfa:
Testowanie:
Wydajność:
źródło
Clojure, 221 bajtów
Mighty długo ale uchwyty sprawa
(f 1)
. Bez tego specjalnego przypadku było to 183 bajty. To był zbyt wielki wysiłek, aby go nie opublikować.Przykładowe wyniki:
1000000 100 przypadków zostało obliczonych w ciągu około 4,7 godzin, przynajmniej się nie zawiesiło.
źródło