Eingang:
Eine positive ganze Zahl n ist 1 <= n <= 25000
.
Ausgabe:
- In dieser Reihenfolge beginnen wir mit der Dezimalzahl 1 / n .
- Dann nehmen wir die Summe der Ziffern bis zur n -ten Stelle nach dem Komma (1-indiziert); gefolgt von der Summe der Ziffern bis zum ( n- 1) -ten, dann ( n-2 ) -ten usw. Fahren Sie fort, bis n 1 ist.
- Die Ausgabe ist die Summe aller dieser Werte.
Beispielsweise:
n = 7
1/7 = 0.1428571428...
7th digit-sum = 1+4+2+8+5+7+1 = 28
6th digit-sum = 1+4+2+8+5+7 = 27
5th digit-sum = 1+4+2+8+5 = 20
4th digit-sum = 1+4+2+8 = 15
3rd digit-sum = 1+4+2 = 7
2nd digit-sum = 1+4 = 5
1st digit = 1
Output = 28+27+20+15+7+5+1 = 103
Herausforderungsregeln:
- Wenn die Dezimalstelle von 1 / n keine n Stellen nach dem Komma enthält, werden die fehlenden als 0 (dh
1/2 = 0.50 => (5+0) + (5) = 10
) gezählt. - Sie nehmen die Ziffern ohne Rundung (dh die Ziffern von
1/6
sind166666
und nicht166667
)
Allgemeine Regeln:
- Für Ihre Antwort gelten Standardregeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methode mit den richtigen Parametern und vollständige Programme verwenden. Ihr Anruf.
- Standardlücken sind verboten.
- Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu.
- Fügen Sie ggf. auch eine Erklärung hinzu.
Erste 1 - 50 in der Sequenz:
0, 10, 18, 23, 10, 96, 103, 52, 45, 10, 270, 253, 402, 403, 630, 183, 660, 765, 819, 95, 975, 1034, 1221, 1500, 96, 1479, 1197, 1658, 1953, 1305, 1674, 321, 816, 2490, 2704, 4235, 2022, 3242, 2295, 268, 2944, 3787, 3874, 4097, 1980, 4380, 4968, 3424, 4854, 98
Letzte 24990 - 25000 in der Reihenfolge:
1405098782, 1417995426, 1364392256, 1404501980, 1408005544, 1377273489, 1395684561, 1405849947, 1406216741, 1142066735, 99984
code-golf
sequence
number-theory
Kevin Cruijssen
quelle
quelle
Antworten:
Gelee , 9 Bytes
Ziemlich langsam, aber kurz. Probieren Sie es online! oder überprüfen Sie die ersten 50 Testfälle .
Wie es funktioniert
quelle
Mathematica, 42 Bytes
oder
oder
Erläuterung
Nehmen Sie das Beispiel aus der Herausforderungsspezifikation. Wir wollen berechnen:
Neu anordnen, das ist:
wo
.
ist das Skalarprodukt von zwei Vektoren.Das ist so ziemlich die ganze Lösung.
Dadurch erhalten wir die ersten
N
Dezimalstellen von1/N
(der#&@@
extrahiert das erste Element desRealDigits
Ergebnisses, da dies auch den Versatz der ersten Stelle zurückgibt, der uns egal ist).Dann erhalten wir die Liste von
N
unten bis1
entweder mit(#-Range@#+1)
oderRange[#,1,-1]
, die beide kürzer als sindReverse@Range@#
, und nehmen das Skalarprodukt.Die alternative Lösung
Accumulate
berechnet stattdessen eine Liste aller Präfixsummen und addiert diese Präfixsummen mitTr
.Da dies auch für große Eingaben sehr schnell ist, finden Sie hier eine Streudiagramm der Sequenz bis zu
N = 100,000
(es dauerte jedoch eine Weile , bis alle erstellt und geplottet wurden):Klicken Sie für eine größere Version.
Die blaue Linie ist die naive Obergrenze von
9 N (N+1) / 2
(wenn alle Dezimalstellen vorhanden wären9
) und die orange Linie ist genau die Hälfte davon. Es ist nicht überraschend, dass dies direkt im Hauptzweig des Diagramms liegt, da wir statistisch gesehen eine durchschnittliche Ziffer von 4,5 erwarten würden.Die dünne Linie der Diagrammpunkte, die Sie unter dem Hauptast sehen, sind Brüche, die enden
...3333...
, da sie alle sehr nahe beieinander liegen3 N (N+1) / 2
.quelle
05AB1E ,
1211 BytesProbieren Sie es online! oder eine Testsuite für die ersten 50 Nummern.
Erläuterung
Eine effizientere Version, um große Zahlen mit TIO auszuprobieren
Der Unterschied zur kürzeren Version besteht darin, dass wir hier das Produkt der Ziffern und die Umkehrung ihres 1-basierten Index summieren, anstatt die Ziffern in Präfixen zu summieren.
Probieren Sie es online!
quelle
Java 8,
181169166153142 BytesErläuterung:
Probieren Sie es hier aus.
quelle
PHP,
6665 BytesAngepasst an diese Antwort (auch von mir): Aufteilung von nicht ganz so kleinen Zahlen und Jörg Hülsermanns Änderungsvorschlag dazu. Verwenden Sie wie:
edit: korrigierte einen Fehler um +1 Bytes und faltete die Zuweisung von $ a in $ argv [1] für -2 Bytes für ein netto 1 Byte weniger.
quelle
Scala, 84 Bytes
Ungolfed:
Erläuterung:
Ich könnte ein paar Bytes einsparen, indem ich die Art und Weise ausnütze, wie der Compiler Token verwendet: Durch Aufrufen des Arguments
&
können Sie1 to&map
anstelle von schreiben1 to n map
. Die gleiche Regel gilt fürdef?
.quelle
Jelly , 11 Bytes
TryItOnline
Erste 50
Zu langsam für die großen Testfälle.
Wie?
quelle
R⁵*
Äquivalent von links nach rechts gesetzt, aber dann die schöne gerade Linie gesehen :)PHP, 76 Bytes
(Edit -1 Byte - Danke user59178 - Deine Lösung ist noch besser)
quelle
$c=blah
in den ersten Teil vonfor(;;)
MATL, 19 Bytes
Probieren Sie es online!
Erläuterung
quelle
Groovy, 87 Bytes
Dies war weniger schmerzhaft als erwartet und basiert auf meiner Antwort hier :
Erläuterung
1.0g
- Verwenden Sie für die eine die BigDecimal-Notation..divide(n, n, 1)+""
- Mit n-Genauigkeit durch n teilen (nur BigDecimal-Funktion) und in str konvertieren.(...)[2..x+1].getChars()
- Ermittelt den Teilstring der aktuellen Iteration als Array von Zeichen..sum()-48*(x)
- Summieren Sie die ASCII-Werte der Zeichen und reduzieren Sie sie für jedes Element um 48. Dadurch wird der Wert von einer ASCII-Ziffer in eine Ganzzahl umgewandelt, wodurch im Wesentlichen Byte eingespart werden*.toInteger()
.(1..n).collect{...}.sum()
- Durchlaufen Sie jede der Ziffern in der Division, indem Sie diese Funktion ausführen, und erhalten Sie sie alle in einem einzigen Array und einer Summe.2 Bytes gespart und Effizienz geopfert ...
Dies ist eine effizientere Version, bei der BigDecimal nicht bei jeder Iteration neu berechnet wird.
quelle
J, 27 Bytes
Verwendung
Die Eingabe ist eine erweiterte Ganzzahl.
Die Leistung ist gut und benötigt nur ca. 3 Sekunden, um die großen Testfälle zu berechnen.
Erläuterung
quelle
Gelee , 10 Bytes
Nicht der kürzeste Ansatz , aber ziemlich effizient. Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
Python 2, 90 Bytes
Nicht hübsch, aber durch Float-Dividieren, Konvertieren in einen String und anschließende iterative Auswahl des String-Index, um das Dreieck der Zahlen zu erhalten, dann das Listenverständnis durchzuführen und jedes Zeichen in ein int zu konvertieren und schließlich alle zu summieren.
quelle
JavaScript (ES6), 47 Byte
Wie es funktioniert
Diese Antwort zeigt eine Methode zur Berechnung der c- Dezimalstellen von a / b :
Dies ist ein hervorragender Ausgangspunkt für diese Herausforderung. Zuerst können wir es leicht ändern, so dass es b Dezimalstellen von 1 / b berechnet , indem wir die Parameter neu ordnen und die Standardeinstellungen festlegen:
Als nächstes können wir dies so ändern, dass es die Summe der ersten b Dezimalstellen berechnet , anstatt sie zu verketten (dies beseitigt den
d
Parameter):Wir sind fast an einer Lösung; Jetzt müssen wir nur noch jede Ziffer mit c + 1 multiplizieren :
Hmm, das scheint ein bisschen lang zu sein. Was ist, wenn wir c zunächst um 1 erhöhen?
Das spart ein Byte. Und hier ist eine Möglichkeit, eine weitere zu sparen:
Und jetzt haben wir unsere Antwort.
f(7)
ist 103,f(11)
ist 270,f(1)
ist ... 2? Oh, wir haben vergessen, den Fall zu berücksichtigen, in dem a / b bei der ersten Iteration 1 ist (d. H 1 ist b ist 1). Machen wir etwas dagegen:1 mod b ist immer 1 , außer b ist 1 , in diesem Fall ist es 0 . Unser Programm ist jetzt für alle Eingaben mit 47 Bytes korrekt .
quelle
Python 2, 49 Bytes
Teste es auf Ideone .
quelle
C 53 Bytes
Unterhalb der Haupt für einige Test zu tun ...
quelle
f(n,i,x,s){while(i)x=10*(x%n),s+=i--*(x/n);return s;}
ist nur 53 Bytes lang.