Dziwna liczba to liczba, w której suma właściwych dzielników jest większa niż sama liczba i żaden podzbiór właściwych dzielników nie sumuje się do tej liczby.
Przykłady:
70 jest liczbą dziwną, ponieważ jej właściwe dzielniki (1, 2, 5, 7, 10, 14 i 35) sumują się do 74, która jest większa niż 70, a brak kombinacji tych liczb wynosi 70.
18 nie jest liczbą dziwną, ponieważ jej właściwe dzielniki (1, 2, 3, 4, 6, 9) sumują się do 25, czyli więcej niż 18, ale 3, 6 i 9 sumują się do 18.
Twoim zadaniem jest napisanie najkrótszego programu, który wprowadza przez standardowe wejście dowolną liczbę n i oblicza i drukuje do pliku lub wyznacza pierwsze n dziwnych liczb z separacją nowego wiersza. Żadne kodowanie odpowiedzi na stałe nie jest dozwolone (przepraszam, że nie określiłem tego na początku).
Aby uzyskać więcej przykładów, zobacz tę stronę: http://mathworld.wolfram.com/WeirdNumber.html
Odpowiedzi:
Mathematica
999487Spacje nie są potrzebne. Powolny!:
Kosztem kilku znaków jest to szybsza wersja, która sprawdza tylko liczby parzyste i pomija wielokrotności
6
, które nigdy nie są dziwne:wciąż jest zbyt wolny, by mógł się przydać. Znajduje pierwsze dwa w ciągu kilku sekund, ale staje się coraz wolniejszy wraz ze wzrostem liczby dzielników.
źródło
Haskell - 129
Jestem pewien, że jest tu wiele do golfa, ale ponieważ konkurencja wydaje się na razie niska, wrzucę to.
Nie próbuj jednak tego uruchamiać, udało mi się poczekać tylko na dwa pierwsze elementy, trzeci zacznie zabierać minuty.
źródło
Python 2.7 (255 bajtów)
źródło
PHP, 267 bajtów
A oto oryginalny kod źródłowy:
Zauważysz, że wyprowadzenie liczb zajmuje trochę czasu, ponieważ wykonuje weryfikację siłową (jednak powinieneś dostać się do 70 dość szybko).
źródło
R, 164
Wersja bez gry w golfa:
To zajmuje trochę czasu z powodu brutalnej siły.
źródło
Rubin - 152
Ruby z ActiveSupport - 138
Naprawdę powoli i jestem prawie pewien, że jest jeszcze miejsce na grę w golfa ...
źródło
Smalltalk, 143
Wejście:
wynik:
źródło
SageMath:
143131 bajtówCo więcej, nawet nie gra w golfa, w kodzie i tak nie ma za dużo golfa. Najważniejsze jest to, że powinieneś najpierw wykonać test
2*x>=sum(l)
, dzięki czemu zaoszczędziłbyś dużo czasu obliczeniowego. Trzeba zdać sobie sprawę z tego, żemax
na booleanach jestor
druga rzecz, któraw(x)
dotyczyFalse
liczb dziwnych i liczbTrue
innych niż dziwne. Wersja bez golfa:źródło
C ++ - 458
To nie jest całe moje rozwiązanie, ponieważ musiałem poprosić SO o pomoc w obliczeniu sumy podzbiorów, ale wszystko inne jest moje:
Długa wersja:
Obecnie obliczył tylko pierwsze dwa (70 i 836). Potem to zabiłem.
źródło
Perl, 173
Pozwól mi dodać kolejne bezużyteczne rozwiązanie. To rozwiązanie jest tak wolne, że nie może nawet wypisać niczego poza pierwszą dziwną liczbą. Śmiem twierdzić, że jest to najwolniejsze ze wszystkich rozwiązań tutaj.
Próbny
Ten sam kod napisany w Javie (z którym czuję się bardziej komfortowo) nie może nawet rozpoznać drugiej dziwnej liczby (836), a już podałem numer bezpośrednio metodzie sprawdzania (zamiast zapętlania i sprawdzania każdej liczby).
Rdzeń tego rozwiązania leży w wyrażeniu regularnym:
I jak łańcuch jest ustawiony na 3-krotność liczby, którą sprawdzamy.
Długość łańcucha jest ustawiona na 3-krotność liczby, którą sprawdzamy
i
: pierwsze 2i
służy do dopasowania sumy czynników, a ostatnia 1i
jest zarezerwowana do sprawdzenia, czy liczba jest współczynnikiemi
.(?=(.+)\1{2}$)
służy do przechwytywania liczby, którą sprawdzamy.((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+
dopasowuje współczynniki liczby. Późniejsza iteracja będzie pasować do mniejszego współczynnika niż wcześniejsza iteracja.(.+)
i(?=.*(?=\1$)\3+$)
wybiera razem czynnik Number sprawdzane.(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))
upewnia się, że wybrany współczynnik jest mniejszy niż liczba sprawdzana w pierwszej iteracji i jest mniejszy niż poprzedni współczynnik w kolejnych iteracjach.Wyrażenie regularne próbuje dopasować jak najwięcej czynników liczby w zakresie 2
i
. Ale nie dbamy o rzeczywistą wartość sumy dzielników, dbamy tylko o to, czy liczba jest duża.Następnie 2. wyrażenie regularne, które jest pierwszym wyrażeniem regularnym z
\1{2}$
dodanym. W wyniku tego wyrażenie regularne upewnia się, że suma (niektórych) czynników sprawdzanej liczby jest równa samej liczbie:Dodane ograniczenie spowoduje, że silnik regex przeprowadzi wyszukiwanie wstecznego wszystkich możliwych podzbiorów czynników, więc będzie on bardzo wolny.
źródło
Perl,
176174 bajtówLiczba dziwnych liczb jest oczekiwana w STDIN, a znalezione liczby są drukowane do STDOUT.
Wersja bez golfa
Ograniczenia
źródło