Twoim zadaniem jest zaimplementowanie sekwencji liczb całkowitych A130826 :
n jest najmniejszą dodatnią liczbą całkowitą, tak że n - n jest cały wielokrotnością 3 i dwa razy liczbę dzielników (A n - n) / 3 daje n th określenie w pierwszych różnice sekwencji wytwarzanych przez Flawiusza Sito Józefa Flawiusza.
Zgubiłeś już? Cóż, w rzeczywistości jest to dość łatwe.
Józef Flawiusz sita określa sekwencję całkowitą w następujący sposób.
Zacznij od sekwencji dodatnich liczb całkowitych i ustaw k = 2 .
Usuń każdą k- tą liczbę całkowitą sekwencji, zaczynając od k- tej .
Zwiększ wartość k i wróć do kroku 2.
f n jest n- tą liczbą całkowitą (indeksowaną 1), która nigdy nie zostanie usunięta.
Jeżeli - jak zwykle - σ 0 (k) oznacza liczbę dodatnich dzielników liczby całkowitej K , można określić z n jak najmniejszej liczby całkowitej w taki sposób, 2σ 0 ((a n - n) / 3) = f n + 1 - f n .
Wyzwanie
Napisać program lub funkcji, które ma dodatnią liczbę całkowitą N wejściu i nadrukami lub powraca do n .
Obowiązują standardowe zasady gry w golfa . Niech wygra najkrótszy kod!
Sprawdzone przykłady
Jeśli usuniemy co drugi element dodatnich liczb całkowitych, pozostaje nam
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 ...
Po usunięciu co trzeciego elementu pozostałej części otrzymujemy
1 3 7 9 13 15 19 21 25 27 31 33 37 39 ...
Teraz usuwamy co czwarty, potem piąty, a następnie szósty element
1 3 7 13 15 19 25 27 31 37 39 ...
1 3 7 13 19 25 27 31 39 ...
1 3 7 13 19 27 31 39 ...
1 3 7 13 19 27 39 ...
Ostatni wiersz pokazuje warunki od f 1 do f 7 .
Różnice między kolejnymi elementami tych warunków są
2 4 6 6 8 12
Dzieląc te różnice w przód przez 2 , otrzymujemy
1 2 3 3 4 6
Są to liczby dzielników docelowych.
- 4 jest pierwszą liczbą całkowitą k taką, że σ 0 ((k - 1) / 3) = 1 . W rzeczywistości σ 0 (1) = 1 .
- 8 jest pierwszą liczbą całkowitą k taką, że σ 0 ((k - 2) / 3) = 2 . W rzeczywistości σ 0 (2) = 2 .
- 15 jest pierwszą liczbą całkowitą k taką, że σ 0 ((k - 3) / 3) = 3 . W rzeczywistości σ 0 (4) = 3 .
- 16 jest pierwszą liczbą całkowitą k taką, że σ 0 ((k - 4) / 3) = 3 . W rzeczywistości σ 0 (4) = 3 .
- 23 jest pierwszą liczbą całkowitą k taką, że σ 0 ((k - 5) / 3) = 4 . W rzeczywistości σ 0 (6) = 4 .
- 42 jest pierwszą liczbą całkowitą k taką, że σ 0 ((k - 6) / 3) = 6 . W rzeczywistości σ 0 (12) = 6 .
Przypadki testowe
n a(n)
1 4
2 8
3 15
4 16
5 23
6 42
7 55
8 200
9 81
10 46
11 119
12 192
13 205
14 196622
15 12303
16 88
17 449
18 558
19 127
20 1748
21 786453
22 58
23 2183
24 3096
25 1105
26 786458
27 12582939
28 568
29 2189
30 2730
źródło
Odpowiedzi:
Galaretka,
30292725 bajtówZaoszczędziłem 2 bajty dzięki powiadomieniu @Dennis
Æd
i kolejnym 2 bajtom na połączenie dwóch łańcuchów.Wypróbuj online!
To była prawdopodobnie najlepsza zabawa, jaką kiedykolwiek miałem z Jelly. Zacząłem od drugiej linii, która oblicza f n od n za pomocą wzoru na OEIS i jest dość piękna.
Wyjaśnienie
źródło
Python 2 ,
121119118 bajtówCzas działania powinien wynosić mniej więcej O (16 n ) przy zużyciu pamięci O (4 n ) . Zastąpienie
4**n
przez5<<n
- co moim zdaniem jest wystarczające - poprawiłoby to radykalnie, ale nie jestem przekonany, że działa on na dowolnie duże wartości n .Wypróbuj online!
Zachowanie asymptotyczne i górne granice n
Zdefiniuj b n jako (a n - n) / 3 , tj. Najmniejszą dodatnią liczbę całkowitą k taką, że σ 0 (k) = ½ (f n + 1 - f n ) .
Jak zauważono na stronie OEIS, f n ~ ¼πn 2 , więc f n + 1 - f n ~ ¼π (n + 1) 2 - ¼πn 2 = ¼π (2n + 1) ~ ½πn .
W ten sposób ½ (f n + 1 - f n ) ~ ¼πn . Jeżeli rzeczywista liczba jest pierwsza s , najmniejszą liczbą dodatnią z p dzielników jest 2 p 1 , dlatego b n może być przybliżony przez 2 c n , gdzie c n ~ ¼πn .
Dlatego b n <4 n będzie utrzymywać wystarczająco duże n , a biorąc pod uwagę, że 2 ¼πn <2 n << (2 n ) 2 = 4 n , jestem pewien, że nie ma żadnych kontrprzykładów.
Jak to działa
To ustanawia kilka referencji dla naszego iteracyjnego procesu.
n to dane wejściowe użytkownika: dodatnia liczba całkowita.
r jest listą [1, ..., 4 n - 1] .
s jest kopią r .
Jednokrotne powtórzenie listy
r*1
tworzy płytką kopię, więc modyfikacja s nie zmieni r .d jest inicjalizowane jako krotki ( krotki ) .
Ta pierwsza wartość nie jest ważna. Wszystkie pozostałe będą zawierać liczby dzielników dodatnich liczb całkowitych.
Dla każdej liczby całkowitej k od 1 do 4 n - 1 wykonujemy następujące czynności.
del s[k::k+1]
każdy zajmuje (k + 1) th całkowitą w s - wychodząc z (k + 1) XX - i usuwa ten plaster z s .Jest to prosty sposób przechowywania początkowego odstępu sita Flavius Josephus w s . Będzie obliczał znacznie więcej niż wymagane warunki początkowe n + 1 , ale użycie pojedynczej
for
pętli do zaktualizowania zarówno s, jak i d pozwala zaoszczędzić niektóre bajty.d+=sum(k%j<1for j in r)*2,
zlicza, ile elementów r dzieli k równomiernie i dodaje 2σ 0 (k) do d .Ponieważ d zostało zainicjowane jako krotka singleton, 2σ 0 (k) jest przechowywany pod indeksem k .
Znajduje to pierwszy wskaźnik f n + 1 - f n w D , który jest najmniejszym , k , tak że 2σ 0 (k) = f n + 1 - f n , a następnie oblicza się N jako 3k + 1 i drukuje wyniki.
źródło
Java 8,
336,305,303,287,283279 bajtów57 bajtów usuniętych dzięki Kritixi Lithos
Grał w golfa
Bez golfa
źródło
int
jest krótsze niż używaniejava.util.Scanner
. Ale nawet jeśli używasz skanera, możesz zrobićSystem.out.print(h(new java.util.Scanner().nextInt()))
i usunąć poprzednią linięint h()
możesz to zmienić naint v = (g(k,k)-g(k,k-1))/2,u = 0,t = 1;
. Możesz zmienić swoją instrukcję if (czyli wewnątrz pętli for) zif(t%i==0)
naif(t%i<1)
g
aby powrócić za pomocą operatorów trójskładnikowych coś w rodzajureturn s==0?N+1:g(s-1,N+N/2)
-ishMathematica,
130116106103 bajtówlub
Skończyło się prawie identycznym kodem Jelly @ Pietu1998 ...
Wyjaśnienie
Catch
cokolwiek jestThrow
-ed (wyrzucone).Nieskończona pętla;
k
zaczyna się1
i zwiększa każdą iterację.Przypisz
f
:Znajdź
{1, 2, ... , n}
. Odwróć to.Funkcja wysyłająca pułap (n1 / n2 + 1) * n2
Przypisz
f
funkcję, która rekurencyjnie stosuje powyższą funkcję do listy z dwóch powyższych kroków, używając każdego wyjścia jako pierwszego wejścia i każdego elementu listy jako drugiego wejścia. Początkowe „wyjście” (pierwsze wejście) jest pierwszym elementem listy.Sprawdź, czy dwukrotna liczba dzielników
k
jest równa f (n + 1) - f (n).Jeśli warunek jest spełniony
True
,Throw
wartośćk
. Jeśli nie, kontynuuj zapętlanie.Pomnóż wynik przez 3 i dodaj n.
Wersja 130 bajtów
źródło
Perl 6 ,
154149136107 bajtówNie golfowany:
źródło
05AB1E ,
353439 bajtówWygląda okropnie, podobnie jak wydajność środowiska uruchomieniowego. Dane wejściowe, które dają małe wartości, wymagają kilku sekund. Nie próbuj liczb takich jak 14; ostatecznie znajdzie wynik, ale zajęłoby wieki.
Wyjaśnienie
Działa jako 2 kolejno nazywane programy. Pierwszy oblicza F n + 1 - F N i druga określa się n w oparciu o jego definicji, z wykorzystaniem podejścia Bruteforce.
F n + 1 - F n jest obliczane dla każdej iteracji, nawet jeśli jest niezmienna w pętli. To sprawia, że czas kodu jest nieefektywny, ale sprawia, że kod jest krótszy.
Wypróbuj online!
źródło
žHL
), a następnie odfiltrowuje wartości, które nie spełniają ograniczeń sita. Myślę, że pierwsza część tego programu powinna zostać całkowicie przepisana z zupełnie innym podejściem, aby umożliwić grę w golfa.given enough time and memory
, ponieważ widziałem już kilka odpowiedzi na inne pytania, które działały tak wolno, że prawie niemożliwe było stwierdzenie, czy dały one właściwy wynik, czy nie. Z tego powodu odłożyłem obliczenia sita poza pętlę i kosztowało mnie to 2 bajty.