Die Herausforderung
Schriebe ein Programm oder eine Funktion , die zwei Eingänge ganze Zahlen erfolgt, i
und j
und gibt ihren größten gemeinsamen Teiler; berechnet mit dem euklidischen Algorithmus (siehe unten).
Eingang
Die Eingabe kann als durch Leerzeichen getrennte Zeichenfolgendarstellung von i
und j
oder als zwei separate Ganzzahlen erfolgen. Sie können davon ausgehen, dass ganze Zahlen kleiner oder gleich 10.000 sind. Sie können auch davon ausgehen, dass die Eingabe-Ganzzahlen keine Primzahlen zueinander sind.
Euklidischer Zusammenbruch
Die größere Zahl zwischen i
und j
wird so oft wie möglich durch die kleinere geteilt. Dann wird der Rest hinzugefügt. Dieser Vorgang wird mit dem Rest und der vorherigen Nummer wiederholt, bis der Rest wird 0
.
Zum Beispiel, wenn die Eingabe war 1599 650
:
1599 = (650 * 2) + 299
650 = (299 * 2) + 52
299 = (52 * 5) + 39
52 = (39 * 1) + 13
39 = (13 * 3) + 0
Die letzte Zahl 13
ist der größte gemeinsame Teiler der beiden Eingabe-Ganzzahlen. Es kann so visualisiert werden:
Ausgabe
Ihre Ausgabe muss die Aufschlüsselung in der obigen Form sein, gefolgt von einem Zeilenumbruch und der GCD. Es kann über jedes Medium ausgegeben werden.
Beispiele
Eingänge
18 27
50 20
447 501
9894 2628
Ausgänge
27 = (18 * 1) + 9
18 = (9 * 2) + 0
9
50 = (20 * 2) + 10
20 = (10 * 2) + 0
10
501 = (447 * 1) + 54
447 = (54 * 8) + 15
54 = (15 * 3) + 9
15 = (9 * 1) + 6
9 = (6 * 1) + 3
6 = (3 * 2) + 0
3
9894 = (2628 * 3) + 2010
2628 = (2010 * 1) + 618
2010 = (618 * 3) + 156
618 = (156 * 3) + 150
156 = (150 * 1) + 6
150 = (6 * 25) + 0
6
Hinweis: Die Ausgänge müssen nicht wie oben angeordnet sein. Der Abstand dient nur der Übersichtlichkeit. Klammern sind erforderlich.
Bonus
Wenn Ihre Ausgabe wie oben angegeben verteilt ist, können Sie Ihrer Punktzahl einen Bonus von -10% hinzufügen.
Antworten:
Pyth, 33 Bytes
Probieren Sie es online aus: Demo oder Test Suite
Erläuterung:
quelle
CJam,
464339 BytesProbieren Sie es online im CJam-Interpreter aus .
Wie es funktioniert
quelle
Python 2, 70
Eine rekursive Funktion, die eine mehrzeilige Zeichenfolge zurückgibt. Die Funktion erstellt die erste Zeile und hängt sie dann mit dem nächsten Zahlenpaar im euklidischen Algorithmus an das rekursive Ergebnis an. Sobald die zweite Zahl Null ist, nehmen wir die Zeichenfolge der anderen Zahl als Basisfall, sodass sie am Ende in einer eigenen Zeile gedruckt wird.
Die Formatierung erfolgt durch Zeichenfolgensubstitution unter Verwendung einer Ganzzahldivision, um den Multiplikanden zu erhalten.
Ein Schluckauf muss mit der größeren Zahl beginnen, die mod der kleineren Zahl genommen wird. Wenn sich die Zahlen in der falschen Reihenfolge befinden, werden sie zweckmäßigerweise im ersten Schritt des Euklidian-Algorithmus umgedreht. Um zu verhindern, dass dieser Schritt angezeigt wird, fügen Sie die aktuelle Zeile nur hinzu, wenn die erste Zahl mindestens die zweite ist (Gleichheit ist beispielsweise erforderlich für
f(9,9)
).quelle
awk,
7877Das Sortieren der Eingabe nach Größe erfordert viele Bytes
:
Ausgabe
Nur zum Spaß habe ich auch eine Version mit dem richtigen Abstand erstellt, die eine Punktzahl von 233 * 0,9 == 209,7 Bytes ergibt.
Update Ich konnte dies von 285 Bytes verkürzen und jetzt funktioniert es für beliebig lange Nummern, wenn gawk4 mit der
-M
Option aufgerufen wird .Aber ich hatte immer noch das Gefühl, dass ich dort irgendwo auf eine mentale Blockade gestoßen bin ...
Ausgang (mit gawk4 aufgerufen
awk -M -f code.awk
)Einige Zeilenumbrüche und Tabulatoren hinzugefügt
Ich kann die Längen der Anfangswerte für x, y und x% y am Anfang speichern, weil sie bei jedem Schritt nur kürzer werden können. Aber für den Faktor muss ich die maximale Länge bestimmen, bevor ich etwas drucke, da die Länge variieren kann. Ich benutze es hier
$i
als Array, weil es zwei Zeichen speichert, verglichen mit der Verwendung eines [i] jedes Mal.quelle
C ++, GCC-Compiler, 171 Bytes (-10%, also 154 Bytes)
Okay, also mein erster Versuch.
Tipps zum Code Golf geschätzt.
PS Müssen bei Verwendung von c ++ die Bytes der Standardheaderdateien und von int main gezählt werden? Ausgenommen, es reduziert 50 Bytes
quelle
T-SQL (2012+), 268 Byte
Implementiert als Inline-Tabellenfunktion, die einen rekursiven CTE ausführt. Es könnte sich lohnen, den 10% -Bonus zu formatieren, aber das muss warten.
Erklärung und Verwendung:
quelle
Rev. 1: Ruby, 86
Rekursiver Algorithmus dank Tipp von Doorknob.
Rev. 0: Ruby, 93
Das hat wirklich nicht gut geklappt. Die
while
Schleife nimmt zu viele Zeichen auf, insbesondere beiend
. Ich kann keinen Weg finden, dies zu vermeiden. Eine Rekursion würde eine benannte Funktion anstelle eines Lambdas erfordern, was auch viele Zeichen verschlingen würde.Nenne es so:
quelle
a=->i,j{...}
und den Aufrufa
über verwenden. Sie sind jedocha[1,2]
nicht sicher, ob Sie dadurch Zeichen sparen würden.f.call
.) Sie ist tatsächlich ein bisschen kürzer, aber dennoch weit von Python entfernt.PowerShell, 84
Ein rekursiver Codeblock, der in einer Variablen gespeichert ist. Rufen Sie es auf mit
& $e num1 num2
zB:In einer besser lesbaren Form macht es Folgendes (zur Verdeutlichung des Codes habe ich die vollständigen Commandlet-Namen und mehr Leerzeichen in die Zeichenfolge eingefügt und die Pipeline-Ausgabebefehle explizit gemacht):
Ein Ärger aus Codegolf-Sicht; PoSh hat keine Ganzzahldivision, 10/3 gibt ein Double zurück, wandelt das Ergebnis jedoch in eine Ganzzahl um und rundet nicht immer ab, sondern rundet N.5 auf die nächste gerade Zahl - auf oder ab. Also
[int](99/2) == 50
.Das lässt zwei schwierige Entscheidungen:
Deshalb muss ich einige Charaktere brennen, um:
Abgesehen davon ist es die Anzahl der
Ich habe auch eine iterative Version, die auch 84 Zeichen enthält:
Vollständig anonymer Codeblock, also starte ihn mit
quelle
PHP, 118 Bytes
Probieren Sie es online!
PHP, 131 Bytes
Probieren Sie es online!
-4 Bytes ersetzen
list(,$n,$m)=$argv
bei[,$n,$m]=$argv
Bedarf PHP> = 7.1quelle
Japt ,
434241 BytesMeine neu entdeckten Japt "Skills" scheinen sich zu verschlechtern, nicht zu verbessern!
Probieren Sie es online aus
quelle
JavaScript (ES6),
7450626155 ByteVersuch es
Erläuterung
quelle
JS, 151
quelle
C 83 Bytes
Test und Ergebnisse
quelle
Java 133
Es funktioniert nicht mit dem regulären euklidischen Algorithmus. Stattdessen wird das Modul verwendet und die zweite Zahl berechnet, mit der beim Ausdruck multipliziert wird. Sie können dies auch verkürzen, indem Sie es in einen Lambda-Ausdruck umwandeln, aber ich bin mir nicht sicher, wie.
quelle
public
, das zweiteprintln
inprint
und das ändernd!=0
ind>0
. Außerdem wird derzeit eine falsche Ausgabe für die ersten Zeilen ausgegeben. Dies kann durch Hinzufügenif(d!=i)
von vor behoben werdenSystem.out.println(i+"=("+j+"*"+((i-d)/j)+")+"+d);
. Insgesamt also:void z(int i,int j){for(int d=1;d>0;i=j,j=d){d=i%j;if(d!=i)System.out.println(i+"=("+j+"*"+((i-d)/j)+")+"+d);}System.out.print(i);}
( 131 Bytes & Bugfix)