0. BEGRIFFSBESTIMMUNGEN
Eine Sequenz ist eine Liste von Zahlen.
Eine Reihe ist die Summe einer Liste von Zahlen.
Die Menge der natürlichen Zahlen enthält alle "nicht negativen ganzen Zahlen größer als Null".
Ein Teiler (in diesem Zusammenhang) einer natürlichen Zahl j ist eine natürliche Zahl i , so dass j ÷ i auch eine natürliche Zahl ist.
1. PRÄAMBEL
Einige andere Fragen auf dieser Seite erwähnen das Konzept des Aliquots oder die Folge von Teilern einer natürlichen Zahl a, die kleiner als a sind . Das Bestimmen von gütlichen Zahlen umfasst das Berechnen der Summe dieser Teiler, die als Aliquotsumme oder Aliquotserie bezeichnet wird. Jede natürliche Zahl hat ihre eigene aliquote Summe, obwohl der Wert der aliquoten Summe einer Zahl nicht unbedingt für diese Zahl eindeutig ist. ( Exempli gratia , jede Primzahl hat eine aliquote Summe von 1.)
2. HERAUSFORDERUNG
Geben Sie bei einer natürlichen Zahl n
die n
dritte Ziffer der Folge von Aliquotsummen zurück. Die ersten Serien in der Sequenz, beginnend mit der Serie für 1, sind:
{0, 1, 1, 3, 1, 6, 1, 7, 4, 8, 1, 16, 1, 10, 9, 15, 1, 21, 1, 22, 11, 14, 1, 36, 6, 16, 13}
Verkettet sehen diese so aus:
0113161748116110915121122111413661613
Die Eingabe kann je nach Wunsch null- oder einindexiert sein. Lösungen müssen Programme oder Funktionen sein, die die 10.000ste Ziffer zurückgeben können (Eingabe bis 9999
oder 10000
). Die kürzeste funktionierende Lösung gewinnt.
3. TESTFÄLLE
Die korrekten Eingabe-Ausgabe-Paare sollten Folgendes umfassen, sind jedoch nicht darauf beschränkt:
0 or 1 -> 0
4 or 5 -> 1
12 or 13 -> 6
9999 or 10000 -> 7
Die Zahl vor dem "oder" ist 0-indiziert. Die folgende Nummer ist 1-indiziert.
Weitere Testfälle können auf Anfrage zur Verfügung gestellt werden.
4. Referenzen
OEIS hat eine Liste von Zahlen und deren aliquoten Summen.
Antworten:
05AB1E ,
141110 BytesBerechnen Sie n = 9999 in ungefähr 15 Sekunden. Code:
Erläuterung:
Verwendet die CP-1252- Codierung. Probieren Sie es online! .
quelle
Mathematica, 51 Bytes
Eine unbenannte Funktion, die eine Ganzzahl annimmt und zurückgibt und eine 1-basierte Indizierung verwendet. Verarbeitet die Eingabe
10000
sofort.Erläuterung
Dies ist eine sehr einfache Implementierung der Definition, die die Tatsache
n
ausnutzt , dass die ersten Divisorsummen immer ausreichen, um dien
dritte Ziffer zu bestimmen . Wie immer ist die Lesereihenfolge von Mathematica ein bisschen komisch:Dies erzeugt eine Liste mit allen Ergebnissen der Anwendung der unbenannten Funktion auf alle Werte
i
von1
bisn
einschließlich.Wir beginnen damit, die Teiler von zu berechnen
i
, sie zu summierenTr
und sichi
selbst zu subtrahieren , sodass es sich nur um die Summe der Teiler handelt, die kleiner sind alsi
.Dadurch wird das Ergebnis in eine Liste der Dezimalstellen umgewandelt.
Und dies entfernt den "Listen" -Kopf, so dass alle Ziffernlisten im Ergebnis von automatisch verkettet werden
Array
. Weitere Informationen zur Funktionsweise##
finden Sie im Abschnitt "Folgen von Argumenten" in diesem Beitrag .Schließlich wählen wir die
n
dritte Ziffer aus dem Ergebnis aus.quelle
Brachylog , 40 Bytes
Dies ist 1-indiziert, dauert etwa 0,15 Sekunden für
N = 100
, 15 Sekunden fürN = 1000
. IchN = 10000
laufe zurzeit für . Ich melde die Laufzeit, sobald sie endet. (Wenn meine Schätzung korrekt ist, sollte es ungefähr 8 Stunden dauern.)Bearbeiten : Durch Beheben der Ausbreitung vorzeitiger Einschränkungen in Brachylog dauert es jetzt (bei einem 3 Byte längeren Code) ungefähr
2.5
Minuten,10000
aber es wird einout of global stack
Fehler zurückgegeben.Erläuterung
Hauptprädikat:
Input = N
Prädikat 1: berechnet die Summe der Teiler
Prädikat 2: Vereinheitlicht die Ausgabe mit einem Teiler der Eingabe
quelle
-G
Option können Sie mehr globalen Stapel zuweisen . Der Standard ist nur128M
. Sie können zum Beispiel verwenden:swipl -G2G
um 2 GO zu verwenden.Pyth,
26212015 BytesProbieren Sie es online aus. Testsuite.
Verwendet eine 0-basierte Indizierung. Das Programm ist O (n²) und ist für n = 9999 in ungefähr 14 Minuten auf meiner 2008-Maschine beendet.
quelle
f!%dTr1d
ist viel kürzer (aber auch langsamer)f!%TYtUT
ist das, was ich früher hatte.Jelly,
131110 Bytes2 Bytes dank @Adnan und 1 dank @Dennis.
Probieren Sie es online!
Verwendet 1-basierte Indizierung. Wird für n = 10000 in weniger als 2 Sekunden online ausgeführt.
quelle
ÆDṖSDµ€Fị@
Speichert ein Byte.€
die gesamte erste Kette?€
angewendetchain.pop() if chain else chains.pop()
. Die neu gestartete Kette ist leer, daher wird stattdessen die zuletzt beendete Kette verwendet.PHP, 90 Bytes
0 indiziert
Absolut nicht subtil oder mit einer geschickten Herangehensweise.
Außerdem werden wie üblich drei Meldungen erzeugt, die ignoriert werden.
quelle
J , 34 Bytes
Dies ist nullindexiert und verwendet die folgende Formel, um die Divisorsummen zu berechnen.
Erläuterung
quelle
MATL ,
1615 BytesDie Indizierung basiert auf 1.
Im Online-Compiler tritt eine Zeitüberschreitung des letzten Testfalls auf, aber mit dem Offline-Compiler wird in etwa 15 Sekunden das richtige Ergebnis erzielt.
Probieren Sie es online!
quelle
Haskell, 52 Bytes
Anwendungsbeispiel:
(([1..]>>= \n->show$sum[m|m<-[1..n-1],mod n m<1])!!) 12
->6
.Es ist eine direkte Implementierung der Definition: foreach
n
sum it divisors und konvertieren Sie es in eine Zeichenfolge. Verketten Sie alle diese Zeichenfolgen und wählen Sie das Element am gewünschten Index aus. Haskells Faulheit nimmt nur so vieln
s von der unendlichen Liste[1..]
wie nötig.quelle
Python 3.5,
1039392 Bytes:Ziemlich unkomplizierte Implementierung der im Beitrag beschriebenen Methode.
Probieren Sie es online! (Ideone)
Wird im Online-Compiler nicht innerhalb der zugewiesenen 5 Sekunden für die Eingabe beendet
10000
, wird aber auf meinem Computer für dieselbe Eingabe innerhalb von ca. 8,5 Sekunden beendet.quelle
Oktave, 71 Bytes
Dieser ist nur Oktave. In MATLAB funktioniert es nicht. Es wird eine virtuelle Funktion erstellt, die mit 1-indizierten Zahlen arbeitet. Es kann wahrscheinlich ein bisschen weiter vereinfacht werden. Werde heute abend mal schauen.
Sie können es hier online versuchen .
Führen Sie einfach den obigen Befehl mit dem Präfix
a=
oder was auch immer aus (nur damit Sie ihn mehrmals verwenden können) und führen Sie danna(10000)
oder was auch immer aus. Es dauert ungefähr 7 Sekunden, um zu berechnen, dass die 10000ste Ziffer eine 7 ist.quelle
Java 8, 220 Bytes
Zumindest ist es schnell. Es dauert durchschnittlich 0,3 Sekunden, um das 9999/10000-te Element auf meinem Computer zu erhalten. Es werden nur so viele Aliquotsummen generiert, wie Sie im Index angegeben haben. Dies bedeutet, dass die Zeichenfolge in den meisten Fällen etwas länger als Ihr Index ist, da einige Aliquotsummen 2 oder mehr Stellen haben, aber zum größten Teil nur so lange Zeichenfolgen generiert werden, wie wir benötigen.
Verwendung:
Ungolfed:
quelle