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.
$n=<>;$i=2;while($n){$b=qr/^(?=(.+)\1{2}$)((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+/;$_='x'x3x$i;if(/$b/&&($+[0]>$i)&&!/$b\1{2}$/){print"$i\n";$n--}$i++}
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:
^(?=(.+)\1{2}$)((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+
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 2 isłuży do dopasowania sumy czynników, a ostatnia 1 ijest zarezerwowana do sprawdzenia, czy liczba jest współczynnikiem i.
(?=(.+)\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.
- Widzimy, że te 2 części
(.+)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:
^(?=(.+)\1{2}$)((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+\1{2}$
Dodane ograniczenie spowoduje, że silnik regex przeprowadzi wyszukiwanie wstecznego wszystkich możliwych podzbiorów czynników, więc będzie on bardzo wolny.