Perl, 173
Başka bir işe yaramaz çözüm ekleyeyim. Bu çözüm o kadar yavaş ki, ilk garip sayıyı aşan bir şey bile üretemiyor. Buradaki tüm çözümlerin en yavaşı olduğunu söylemeye cesaret ediyorum.
$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++}
gösteri
Java ile yazılmış aynı kod (ki daha rahatım) 2. garip numarayı bile (836) tanıyamıyor ve numarayı zaten doğrudan kontrol yöntemine (döngü ve her sayıyı kontrol etmek yerine) besledim.
Bu çözümün özü normal ifadede yatmaktadır:
^(?=(.+)\1{2}$)((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+
Ve dizenin nasıl kontrol ettiğimiz sayının 3 katı olacağı.
Dizenin uzunluğu, kontrol ettiğimiz sayının 3 katı olacak şekilde ayarlanır i: ilk 2 i, faktörlerin toplamını eşleştirmek içindir ve son 1 i, bir sayının faktör olup olmadığını kontrol etmek için ayrılmıştır i.
(?=(.+)\1{2}$) kontrol ettiğimiz sayıyı yakalamak için kullanılır.
((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+sayının faktörlerini eşleştirir. Daha sonraki yineleme, önceki yinelemeden daha küçük bir faktörle eşleşecektir.
- Bu 2 parçanın
(.+)ve (?=.*(?=\1$)\3+$)birlikte kontrol edilen sayının bir faktörünü seçtiğini görebiliriz .
(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$)) seçilen faktörün ilk yinelemede kontrol edilen sayıdan daha küçük ve sonraki yinelemelerde önceki faktörden daha küçük olmasını sağlar.
Normal ifade, sayının 2 sınırı dahilinde olabildiğince çok faktörü eşleştirmeye çalışır i. Ancak bölenlerin toplamının gerçek değerini umursamıyoruz, sadece sayının bol olup olmadığını önemsiyoruz.
Sonra \1{2}$eklenen ilk normal ifade olan 2. normal ifade . Sonuç olarak, normal ifade, kontrol edilen sayının (bazı) faktörlerinin toplamının sayının kendisine eşit olmasını sağlar:
^(?=(.+)\1{2}$)((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+\1{2}$
Eklenen kısıtlama, normal ifade motorunun olası tüm faktör alt kümelerinde geri izleme araması yapmasına neden olacaktır, bu nedenle son derece yavaş olacaktır.