Perl, 173
Vorrei aggiungere un'altra soluzione inutile. Questa soluzione è così lenta che non può nemmeno produrre nulla oltre il primo numero strano. Oserei dire che è la più lenta di tutte le soluzioni qui.
$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++}
dimostrazione
Lo stesso codice scritto in Java (di cui mi sento più a mio agio) non è nemmeno in grado di riconoscere il 2o numero strano (836) e ho già inserito il numero direttamente nel metodo di verifica (invece di eseguire il ciclo e controllare ogni numero).
Il nucleo di questa soluzione sta nella regex:
^(?=(.+)\1{2}$)((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+
E come la stringa è impostata per essere 3 volte il numero che stiamo controllando.
La lunghezza della stringa è impostata per essere 3 volte il numero che stiamo controllando i: il primo 2 iserve per abbinare la somma dei fattori e l'ultimo 1 iè riservato per verificare se un numero è un fattore di i.
(?=(.+)\1{2}$) viene utilizzato per acquisire il numero che stiamo verificando.
((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+corrisponde ai fattori del numero. L'iterazione successiva corrisponderà a un fattore inferiore rispetto a un'iterazione precedente.
- Possiamo vedere che queste 2 parti
(.+)e (?=.*(?=\1$)\3+$)insieme selezionano un fattore del numero da controllare.
(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$)) si assicura che il fattore selezionato sia più piccolo del numero che viene controllato nella prima iterazione e sia più piccolo del fattore precedente nelle iterazioni successive.
Il regex cerca di far corrispondere quanti più fattori del numero può entro il limite di 2 i. Ma non ci interessa il valore effettivo della somma dei divisori, ci importa solo se il numero è abbondante.
Quindi la seconda regex, che è la prima regex con \1{2}$aggiunta. Di conseguenza, regex si assicura che la somma di (alcuni) fattori del numero da verificare sia uguale al numero stesso:
^(?=(.+)\1{2}$)((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+\1{2}$
Il vincolo aggiunto farà sì che il motore regex esegua una ricerca di backtracking su tutti i possibili sottogruppi di fattori, quindi sarà estremamente lento.