x86-64-Maschinencode, 26 Byte
31 C9 8D 71 01 89 F8 FF C1 99 F7 F9 85 D2 75 03 0F AF F1 39 F9 7C EE 89 F0 C3
Der obige Code definiert eine Funktion, die einen einzelnen Parameter (den Eingabewert, eine positive Ganzzahl) in EDI
( gemäß der unter Gnu / Unix verwendeten AMD64-Aufrufkonvention von System V ) und ein einzelnes Ergebnis (das Produkt von Divisoren) in zurückgibt EAX
.
Intern berechnet es das Produkt von Divisoren mit einem (äußerst ineffizienten) iterativen Algorithmus, ähnlich wie der C-Submission pizzapants184 . Grundsätzlich verwendet es einen Zähler, um alle Werte zwischen 1 und dem Eingabewert zu durchlaufen und zu prüfen, ob der aktuelle Zählerwert ein Teiler der Eingabe ist. Wenn ja, multipliziert es dies mit dem laufenden Gesamtprodukt.
Ungolfed Assembler-Mnemonik:
; Parameter is passed in EDI (a positive integer)
ComputeProductOfDivisors:
xor ecx, ecx ; ECX <= 0 (our counter)
lea esi, [rcx + 1] ; ESI <= 1 (our running total)
.CheckCounter:
mov eax, edi ; put input value (parameter) in EAX
inc ecx ; increment counter
cdq ; sign-extend EAX to EDX:EAX
idiv ecx ; divide EDX:EAX by ECX
test edx, edx ; check the remainder to see if divided evenly
jnz .SkipThisOne ; if remainder!=0, skip the next instruction
imul esi, ecx ; if remainder==0, multiply running total by counter
.SkipThisOne:
cmp ecx, edi ; are we done yet? compare counter to input value
jl .CheckCounter ; if counter hasn't yet reached input value, keep looping
mov eax, esi ; put our running total in EAX so it gets returned
ret
Die Tatsache, dass der IDIV
Befehl hartcodierte Operanden für die Dividende verwendet, verkrampft meinen Stil ein wenig, aber ich denke, das ist ziemlich gut für eine Sprache, die keine eingebauten, sondern einfache arithmetische und bedingte Verzweigungen hat!