Definicje
Pozwolić m
i n
być dodatnimi liczbami całkowitymi. Mówimy, że m
jest skręt dzielnik od n
jeśli istnieje liczby całkowite 1 < a ≤ b
takie, że n = a*b
i m = (a - 1)*(b + 1) + 1
. Jeśli m
może być uzyskane z n
stosując zero lub więcej skrętów dzielnik do niej, a następnie m
jest potomkiem z n
. Zauważ, że każda liczba jest własnym potomkiem.
Rozważmy na przykład n = 16
. Możemy wybrać a = 2
i b = 8
, ponieważ 2*8 = 16
. Następnie
(a - 1)*(b + 1) + 1 = 1*9 + 1 = 10
co pokazuje, że 10
jest to skręt dzielnika 16
. Za pomocą a = 2
i b = 5
widzimy, że 7
jest to zwrot dzielnika 10
. Zatem 7
jest potomkiem 16
.
Zadanie
Biorąc pod uwagę dodatnią liczbę całkowitą n
, oblicz potomków n
wymienionych w kolejności rosnącej, bez duplikatów.
Zasady
Nie wolno używać wbudowanych operacji obliczających dzielniki liczby.
Akceptowane są zarówno pełne programy, jak i funkcje, a zwracanie typu danych kolekcji (jak pewnego rodzaju zestawu) jest dozwolone, o ile jest ono posortowane i wolne od duplikatów. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.
Przypadki testowe
1 -> [1]
2 -> [2] (any prime number returns just itself)
4 -> [4]
16 -> [7, 10, 16]
28 -> [7, 10, 16, 25, 28]
51 -> [37, 51]
60 -> [7, 10, 11, 13, 15, 16, 17, 18, 23, 25, 28, 29, 30, 32, 43, 46, 49, 53, 55, 56, 60]
źródło
<
dla liczb naturalnych, za każdy n otrzymasz każdą liczbę mniejszą od niej, ale nie samą. Myślę, że to powinno być coś podobnego. W ten sposób myślę, że tylko 4 byłoby własnym potomkiem (choć nie jestem tego pewien).Odpowiedzi:
Python 2,
109988582 bajtówPonieważ
(a-1)*(b+1)+1 == a*b-(b-a)
ib >= a
potomkowie są zawsze mniejsi lub równi oryginalnej liczbie. Możemy więc zacząć od początkowej liczby i generować ściśle mniejszych potomków, dopóki ich nie pozostanie.Warunek
(n<x*x)>n%x
sprawdza dwie rzeczy w jednym - ton<x*x
in%x == 0
.(Dzięki @xnor za zdjęcie 3 bajtów ze skrzynki podstawowej)
Pyth, 32 bajty
Bezpośrednie tłumaczenie powyższego, z wyjątkiem faktu, że Pyth wydaje się dusić podczas próby sumowania (
s
) na pustej liście.Definiuje funkcję,
y
którą można wywołać dodający<number>
na końcu, tak jak to ( spróbuj online ):CJam,
4745 bajtówRównież przy użyciu tej samej metody, z kilkoma modyfikacjami. Chciałem wypróbować CJam do porównania, ale niestety jestem znacznie gorszy w CJam niż w Pyth / Python, więc prawdopodobnie jest dużo miejsca na ulepszenia.
Powyżej jest blok (w zasadzie wersja nienazwanych funkcji CJam), który przyjmuje int i zwraca listę. Możesz to przetestować w ten sposób ( wypróbuj online ):
źródło
set()
? Nie możesz po prostu zwrócić posortowanej listy?set()
ma usunąć duplikaty :)[n]+sum(...,[])
taksum(...,[n])
?[]
niż podstawowego przypadku do sumowania list, więc zupełnie zapomniałem!Java,
148146104 bajtówWersja golfowa:
Długa wersja:
Debiutuję więc na PPCG za pomocą tego programu, który wykorzystuje
TreeSet
(na szczęście automatycznie sortuje liczby) i rekurencję podobną do programu Geobitów, ale w inny sposób, sprawdzając wielokrotności n, a następnie używając ich w następna funkcja. Powiedziałbym, że jest to całkiem niezły wynik jak na pierwszy raz (szczególnie w Javie, która nie wydaje się być najlepszym językiem dla tego rodzaju rzeczy i pomocy Geobitów).źródło
a*b
sięn
na linii 9.c=n+a-b
środkaadd()
. Alternatywnie, możeszc
całkowicie się pozbyć i po prostu użyćn+a-b
w obu miejscach dla tych samych dwóch bajtów.add
dwa razy. Poczekaj chwilę ...a
, co dobrze dzielin
, to nie powinieneś zapętlać, aby znaleźćb
, to po prostun/a
. W tym momencie zaczyna się coraz bardziej zbliżać do mojego;)Java,
157121Oto funkcja rekurencyjna, która pobiera potomków każdego potomka
n
. Zwraca aTreeSet
, który jest domyślnie sortowany.Z pewnymi podziałami linii:
źródło
Oktawa,
10796Ładny druk:
źródło
end
zamiastendfor
iendfunction
. To zaoszczędzi Ci 11 bajtów.Haskell,
102100 bajtówZastosowanie:
p 16
które wyjścia[7,10,16]
Funkcja
d
rekurencyjnie oblicza wszystkich potomków, ale nie sprawdza duplikatów, więc wielu pojawia się więcej niż jeden raz, np.d [4]
Zwraca nieskończoną listę4
s. Funkcjep
pobierają pierwszen
elementy z tej listy, usuwają duplikaty i sortują listę. Voilà.źródło
CJam - 36
Wypróbuj online
Lub inna metoda:
Napisałem je prawie 2 dni temu, utknąłem w wieku 36 lat, byłem sfrustrowany i poszedłem spać bez wysyłania postów.
źródło