Перл, 173
Дозвольте додати ще одне марне рішення. Це рішення настільки повільне, що він навіть не може вивести нічого, що минає за першим дивним числом. Смію сказати, що це найповільніше з усіх рішень тут.
$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++}
Демо
Той самий код, написаний на Java (з яким мені зручніше), навіть не може розпізнати 2 дивне число (836), і я вже подав номер безпосередньо до способу перевірки (замість того, щоб циклічно перевіряти та перевіряти кожне число).
Суть цього рішення лежить в регулярній виразці:
^(?=(.+)\1{2}$)((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+
І як встановлено рядок в 3 рази більше числа, яке ми перевіряємо.
Довжина рядка встановлюється в 3 рази більше числа, яке ми перевіряємо i
: перші 2 i
призначені для узгодження підсумків факторів, а останній 1 i
призначений для перевірки, чи є число коефіцієнтом i
.
(?=(.+)\1{2}$)
використовується для фіксації числа, яке ми перевіряємо.
((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+
відповідає коефіцієнтам чисельності. Пізніша ітерація буде відповідати меншому фактору, ніж попередня ітерація.
- Ми можемо бачити, що ці 2 частини
(.+)
і (?=.*(?=\1$)\3+$)
разом вибирають коефіцієнт кількості, що перевіряється.
(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))
гарантує, що вибраний коефіцієнт менший за кількість, що перевіряється в першій ітерації, і менший за попередній коефіцієнт у наступних ітераціях.
Режекс намагається зіставити якомога більше факторів кількості, що може, в межах 2 i
. Але нас не хвилює фактична величина суми дільників, нас цікавить лише чи велика кількість.
Потім 2-й регекс, який є першим регексом з \1{2}$
доданим. У результаті регекс гарантує, що сума (деяких) факторів числа, що перевіряється, дорівнює самому числу:
^(?=(.+)\1{2}$)((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+\1{2}$
Додане обмеження призведе до того, що двигун регулярних викидів здійснюватиме зворотний пошук за всіма можливими підмножинами факторів, тому це буде дуже повільним.