Schreiben Sie ein Programm, das die Summe der Teiler einer vom Benutzer eingegebenen Zahl (1 ≤ N ≤ 100) im Bereich von 1 bis N auf dem Bildschirm anzeigt.
Dies ist OEIS A000203 .
Beispiele:
Eingabe : 7
7 / 1 = 7
7 / 7 = 1
7 + 1 = 8
Ausgabe: 8
Eingabe: 15
15 / 1 = 15
15 / 3 = 5
15 / 5 = 3
15 / 15 = 1
15 + 5 + 3 + 1 = 24
Ausgabe: 24
Eingabe: 20
20 / 1 = 20
20 / 2 = 10
20 / 4 = 5
20 / 5 = 4
20 / 10 = 2
20 / 20 = 1
20 + 10 + 5 + 4 + 2 + 1 = 42
Ausgabe: 42
Eingabe: 1
1 / 1 = 1
Ausgang: 1
Eingabe: 5
5 / 1 = 5
5 / 5 = 1
5 + 1 = 6
Ausgabe: 6
Antworten:
05AB1E , 2 Bytes
Probieren Sie es online!
Wie?
quelle
ÑO
- Die Herausforderung ablehnen und gleichzeitig gewinnen. Das ist ziemlich schlimm.x86-64-Maschinencode, 23 Byte
Die obigen Codebytes definieren eine Funktion, die eine einzelne Ganzzahl N akzeptiert und als Ergebnis die Summe ihrer Vielfachen zurückgibt.
Der einzelne Parameter wird im
EDI
Register übergeben, und zwar in Übereinstimmung mit dem System V AMD64 ABI (wie es auf * nix-artigen Systemen verwendet wird). Das Ergebnis wirdEAX
wie bei allen x86-Aufrufkonventionen im Register zurückgegeben.Der Algorithmus ist sehr einfach, ähnlich wie bei vielen anderen Einsendungen in anderen Sprachen. Wir schleifen N-mal, jedes Mal, wenn wir das Modulo berechnen und das zu unserer laufenden Summe addieren.
Ungolfed Assembler-Mnemonik:
Probieren Sie es online!
Es scheint sicher, dass es einen Weg geben sollte, dies zu verkürzen, aber ich kann es nicht sehen. Das Berechnen von Modulo auf x86 erfordert eine Menge Code, da Sie dafür die Anweisung
DIV
(oderIDIV
) verwenden und beide feste Eingaberegister (EDX
undEAX
) verwenden, deren Werte überladen werden (weil sie die Ergebnisse, den Rest und die Informationen erhalten) Quotient).Die einzigen echten Tricks sind die üblichen Golf-Tricks:
LOOP
Anweisung verwenden kann, die im Grunde genommen nur eine Kombination vonDEC
+JNZ
mit demECX
Register als implizitem Operanden ist.XCHG
am Ende statt,MOV
weil der erstere eine spezielle 1-Byte-Codierung hat, wennEAX
einer der Operanden ist.CDQ
zurEDX
Vorbereitung der Division Nullen, obwohl Sie für eine Division ohne Vorzeichen normalerweise nur Nullen verwenden würden, wenn Sie a verwendenXOR
. Es sind jedochXOR
immer 2 Bytes, währendCDQ
es nur 1 Byte sind. Ich benutzeCDQ
wieder ein zweites Mal innerhalb der Schleife auf NullEDX
, vor derCMOVZ
Anweisung. Dies funktioniert , weil ich kann garantiert werden , dass der Quotient der Division (inEAX
) immer nicht unterzeichnet, so eine Zeichen-Erweiterung inEDX
festgelegt wirdEDX
gleich 0.quelle
C (gcc), 45 Bytes
Probieren Sie es online!
quelle
Japt , 3 Bytes
Probieren Sie es online!
quelle
â x
-x
könnte es ein Byte seinBrachylog , 2 Bytes
Probieren Sie es online!
Erläuterung
quelle
Mathematica, 14 Bytes
oder eine Antwort von @Loki
Mathematica, 17 Bytes
quelle
Tr@Divisors@#&
noch besser ;-)f=
die eine Eingabe f nimmt [x], deshalb habe ich es in diesem way.Welcome zu PPCG präsentierenTr@*Divisors
, um ein Byte zu rasieren.C, C ++, C #, D, Java,
6562 BytesDies funktioniert in allen 5 Programmiersprachen aufgrund von Ähnlichkeiten.
C-, C ++ - und D-Optimierung:
62 bis60 ByteIn C ++ und D werden Ganzzahlen implizit in Boolesche Werte konvertiert (Zero => false, Not Zero => true), sodass Sie das nicht benötigen
!=0
D-Optimierung: Golf-Template-System, 55 Bytes
Code zum Testen :
C:
C ++:
C #:
D:
Java:
quelle
n%i
/n%i!=0
in einer der Sprachen brauchen . Zweitens sollte Ihre erste Lösung in der Lage sein,n%i>0
statt zu habenn%i!=0
. Drittens kann die LösungT d(T)(T n){T s,i=1;for(;i<=n;++i)s+=n%i?0:i;return s;}
von D darin bestehen, das Vorlagensystem und die Standardwerte zu missbrauchen.Shnap ,
4443 Bytes-1 Tschüss, danke an Mr. Xcoder (lol ich war in meiner eigenen Sprache überfordert)
Dies ist eine Funktion (
$
startet eine Funktion in Shnap).Probieren Sie es online!
Erläuterung:
Nicht konkurrierend, 19 Bytes
Nach vielen Sprachupdates kann dies nun auf schlappe 19 Bytes reduziert werden:
Probieren Sie es online!
quelle
==0
ist<1
( 43 Bytes )Python, 44 Bytes
quelle
J, 23 Bytes
Probieren Sie es online!
Für J-Fans gibt es eine clevere 13-Byte-Lösung :
>:@#.~/.~&.q:
Da es aber nicht meine Erfindung war, werde ich sie nicht als meine offizielle Antwort veröffentlichen.Meine eigene Lösung filtert einfach 1..n, findet Teiler und summiert sie dann. Der springende Punkt ist die dyadische Gabel
Beachten Sie, dass in diesem Kontext
]
1..n und[
n selbst ist. Daher]|[
sind die Reste, wenn Sie jedes Element von 1..n in n teilen und=&0
Ihnen mitteilen, ob sie gleich 0 sind.quelle
+1#.i.*0=i.|]
i.|]
eine große Verbesserung meines Ansatzes. Ich verstehe diesen Teil allerdings nicht ganz:+1#.i.
- Könnten Sie es erklären?1#.
ist die Basis 1-Konvertierung, die äquivalent zu ist+/"1
. Zuersti.|]
die Reste abrufen, dann0=
die gleich 0 (die Divisoren) finden, danni.*
die Nicht-Divisoren im Bereich auf Null setzen, dann mit1#.
summieren und+
sich dann selbst addieren , da diesi.
ein exklusiver Bereich ist.Java (OpenJDK 8) ,
5351 BytesProbieren Sie es online!
quelle
Haskell , 30 Bytes
Probieren Sie es online!
quelle
MATL , 6 Bytes
Probieren Sie es online!
-4 Bytes dank @LuisMendo
10 Bytes
Meine bisherige Lösung mit einer Schleife
Probieren Sie es online!
3 Bytes
Verwendung der eingebauten
Probieren Sie es online!
quelle
Javascript,
5444 BytesDank Shaggy 10 Bytes gespart
Probieren Sie es online!
quelle
Brain-Flak , 96 Bytes
Probieren Sie es online!
Erläuterung:
Jetzt überholt von Verbesserungen.
Das Herzstück des Algorithmus ist das Folgende:
Das ist eine Modifikation von Mod, die uns gibt,
M
wenn es ein Faktor vonN
und0
anders ist. Vollständiger Code ist unten.quelle
R ,
3126 BytesProbieren Sie es online!
Gibt eine
1x1
Matrix zurück.Berechnet
!N%%x
Karten Elemented
von1:N
durch:d->(1 if d divides N, 0 otherwise)
Dann
x%*%x!N%%x
ist das Matrixprodukt, aus1:N
dem sich die Summe ergibt,x
wo!N%%x
ist1
. Ordentlich! Technisch gesehen eine Portierung von Luis Mendos Oktavantwort, aber das habe ich erst gesehen, nachdem ich darüber nachgedacht hatte.R + Zahlen, 14 Bytes
Probieren Sie es online!
quelle
N=scan();
numbers::Sigma(N)
? Auf diese Weise wird der Quellcode der Funktion ausgegebenSigma
.JavaScript, 31 bytes
quelle
Pari/GP, 5 bytes
Try it online!
quelle
Python 2, 41 bytes
Try it online!
quelle
VBA (Excel), 73 bytes
quelle
Sub Y
...End Sub
to get the 85 Byte solutionSub y
A=Cells(1,1)
x=1
While x<=A
If A Mod x=0 Then b=b+x
x=x+1
Wend
MsgBox b
End Sub
Sub y
While x<=[A1]
x=x+1
If [A1]Mod x=0Then b=b+x
Wend
Debug.?b
End Sub
which assumes that it is run in a clean module (x = default int value,0
) and outputs to the VBE immediate window (?
autoformats toPrint
)While x<=[A1]:x=x+1:b=IIf([A1]Mod x,b,b+x):Wend:?b
which assumes thatx
,b
are the default value of 0 and outputs to the VBE immediate window (from the VBE immediate window?
is equivalent toDebug.Print
)Pyth, 6 bytes
Try it here!
Pyth doesn't have a built-in for divisors, so I think this is reasonable.
Explanation
Given
20
, for instance, this is what our program does after each instruction:P
:[2, 2, 5]
.y
:[[], [2], [2], [5], [2, 2], [2, 5], [2, 5], [2, 2, 5]]
.{
:[[], [2], [5], [2, 2], [2, 5], [2, 2, 5]]
.*M
:[1, 2, 5, 4, 10, 20]
.s
:42
.quelle
Ohm v2, 2 bytes
Try it online!
This is pretty straight-forwad:
quelle
Husk, 5 bytes
Try it online!
How?
Thanks to Zgarb for the suggestions in chat!
quelle
Octave, 20 bytes
Try it online!
quelle
RProgN 2, 2 bytes
Explained
Trivial, but felt it needed to be posted.
Try it online!
quelle
Perl 5, 35 + 1 (-p) = 36 bytes
Try it online!
quelle
Bash + GNU utilities, 36
Try it online.
Pure Bash, 41
Try it online.
I first tried a fancy bash expansion answer, but it ended up being longer than the simple loop above:
quelle
Add++, 9 bytes
Try it online!
I clearly got here too late. This defines a function that gets the factors, then sums them.
quelle
QBIC, 17 bytes
Explanation
quelle
Gaia, 2 bytes
Try it online!
Pretty straight-forward:
quelle