Eine seltsame Zahl ist eine Zahl, bei der die Summe der richtigen Teiler größer ist als die Zahl selbst und bei der keine Teilmenge der richtigen Teiler zu dieser Zahl addiert wird.
Beispiele:
70 ist eine seltsame Zahl, weil ihre richtigen Teiler (1, 2, 5, 7, 10, 14 und 35) 74 ergeben, was größer als 70 ist, und keine Kombination dieser Zahlen 70 ergibt.
18 ist keine seltsame Zahl, weil ihre richtigen Teiler (1, 2, 3, 4, 6, 9) zu 25 summieren, was größer als 18 ist, aber 3, 6 und 9 zu 18 summieren.
Ihre Aufgabe ist es, das kürzeste Programm zu schreiben, das über std-in eine beliebige Anzahl n eingibt und die ersten n seltsamen Zahlen mit Zeilenumbruch berechnet und in eine Datei druckt oder ausgibt. Es ist keine harte Kodierung der Antworten erlaubt (Entschuldigung, dass Sie dies nicht am Anfang angegeben haben).
Weitere Beispiele finden Sie auf dieser Seite: http://mathworld.wolfram.com/WeirdNumber.html
Antworten:
Mathematica
999487Leerzeichen werden nicht benötigt. Schleppend!:
Auf Kosten einiger Zeichen ist dies eine schnellere Version, die nur gerade Zahlen prüft und ein Vielfaches davon überspringt
6
, was niemals seltsam ist:es ist immer noch zu langsam für einen nützlichen Zweck. Findet die ersten beiden in wenigen Sekunden, wird aber mit zunehmender Anzahl von Teilern immer langsamer.
quelle
Haskell - 129
Ich bin mir sicher, dass es hier viel zu Golfen gibt, aber da die Konkurrenz vorerst gering zu sein scheint, werde ich mich darum kümmern.
Versuchen Sie nicht, dies auszuführen. Ich habe es geschafft, nur die beiden ersten Elemente abzuwarten. Das dritte wird einige Minuten dauern.
quelle
Python 2.7 (255 Byte)
quelle
PHP, 267 Bytes
Und hier ist der ursprüngliche Quellcode:
Sie werden feststellen, dass die Ausgabe der Zahlen einige Zeit in Anspruch nimmt, da eine Brute-Force-Überprüfung durchgeführt wird (Sie sollten jedoch ziemlich schnell auf 70 kommen).
quelle
R 164
Ungolf-Version:
Dies kann aufgrund von Brute-Force einige Zeit in Anspruch nehmen.
quelle
Rubin - 152
Ruby mit ActiveSupport - 138
Wirklich langsam und ich bin mir fast sicher, dass es noch Platz zum Golfen gibt ...
quelle
Smalltalk, 143
Eingang:
Ausgabe:
quelle
SageMath:
143131 BytesEs ist außerdem nicht einmal Golf, es gibt sowieso nicht zu viel im Code, um Golf zu spielen. Das größte Problem ist, dass Sie den Test
2*x>=sum(l)
zuerst durchführen sollten, da dies eine Menge Rechenzeit einsparen würde. Man muss erkennen, dassmax
auf Booleschen Zahlen dasor
zweite ist,w(x)
wasFalse
für seltsame Zahlen undTrue
für nicht-seltsame Zahlen gilt. Ungolfed-Version:quelle
C ++ - 458
Dies ist nicht meine Lösung, da ich SO um Hilfe bei der Berechnung der Summe der Teilmengen bitten musste, aber alles andere ist meine:
Lange Version:
Derzeit wurden nur die ersten beiden (70 und 836) berechnet. Ich habe es danach getötet.
quelle
Perl, 173
Lassen Sie mich eine weitere nutzlose Lösung hinzufügen. Diese Lösung ist so langsam, dass sie nicht einmal mehr nach der ersten seltsamen Zahl ausgeben kann. Ich wage zu sagen, es ist hier die langsamste aller Lösungen.
Demo
Derselbe in Java geschriebene Code (mit dem ich mich besser auskenne) kann nicht einmal die 2. seltsame Nummer (836) erkennen, und ich habe die Nummer bereits direkt in die Prüfmethode eingegeben (anstatt jede Nummer zu durchlaufen und zu prüfen).
Der Kern dieser Lösung liegt in der Regex:
Und wie der String so eingestellt ist, dass er das Dreifache der Zahl ist, die wir überprüfen.
Die Länge des Strings ist so eingestellt, dass sie das Dreifache der Zahl ist, die wir überprüfen
i
: Die erste 2i
dient zur übereinstimmenden Summierung von Faktoren, und die letzte 1i
dient zur Überprüfung, ob eine Zahl ein Faktor von isti
.(?=(.+)\1{2}$)
wird verwendet, um die Nummer zu erfassen, die wir überprüfen.((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+
stimmt mit den Faktoren der Zahl überein. Eine spätere Iteration entspricht einem kleineren Faktor als eine frühere Iteration.(.+)
und(?=.*(?=\1$)\3+$)
zusammen einen Faktor der zu überprüfenden Zahl auswählen.(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))
Stellt sicher, dass der ausgewählte Faktor kleiner als die Zahl ist, die in der ersten Iteration überprüft wird, und kleiner als der vorherige Faktor in nachfolgenden Iterationen.Der reguläre Ausdruck versucht, so viele Faktoren der Zahl wie möglich innerhalb der Grenze von 2 zuzuordnen
i
. Aber wir kümmern uns nicht um den tatsächlichen Wert der Summe der Teiler, wir kümmern uns nur darum, ob die Anzahl reichlich vorhanden ist.Dann wird die 2. Regex, die die erste mit Regex ist,
\1{2}$
hinzugefügt. Infolgedessen stellt der reguläre Ausdruck sicher, dass die Summe (einiger) Faktoren der zu überprüfenden Zahl mit der Zahl selbst übereinstimmt:Die hinzugefügte Einschränkung veranlasst die Regex-Engine, eine Rückverfolgungssuche für alle möglichen Teilmengen von Faktoren durchzuführen, sodass sie extrem langsam sein wird.
quelle
Perl,
176174 BytesDie Anzahl der seltsamen Zahlen wird in STDIN erwartet und die gefundenen Zahlen werden in STDOUT ausgegeben.
Ungolfed-Version
Einschränkungen
quelle