Der Euklidische Algorithmus ist ein weit verbreiteter Algorithmus zur Berechnung des größten gemeinsamen Divisors (GCD) zweier positiver Ganzzahlen.
Der Algorithmus
Für diese Herausforderung wird der Algorithmus wie folgt beschrieben:
Zeigen Sie die beiden Eingaben als benachbarte Zeilen eines bestimmten Zeichens an,
z. B. kann eine Eingabe von3,4
durch die benachbarten Zeilen000
und dargestellt werden0000
Verwandeln Sie die ersten
length(short_line)
Zeichen in der längeren Zeile in ein anderes Zeichen, sagen-
Sie , jetzt sieht es aus wie000
und---0
Beseitigen Sie die ersten
length(short_line)
Zeichen in der längeren Zeile.
jetzt000
,0
Wiederholen Sie Schritt 2 und 3 , bis die beiden gleich Länge haben, mit den kürzeren und längeren Linien nach jeder Iteration, beispielsweise
000
,0
-00
,0
00
,0
-0
,0
0
,0
- Sie können wählen, ob Sie hier anhalten oder die Iteration fortsetzen und eine der Zeilen in eine leere Zeile umwandeln möchten.
Jeder dieser Schritte sollte durch ein Intervall zwischen 0,3 und 1,5 Sekunden getrennt sein.
Die Herausforderung
Schreiben Sie ein Programm, das mit zwei natürlichen Zahlen als Eingabe eine Ausgabe erstellt, die genau so aussieht wie die Ausgabe des obigen Algorithmus. Sie können andere druckbare Nicht-Whitespace-ASCII-Zeichen als 0
und verwenden. Seien Sie -
jedoch konsistent und verwenden Sie nur zwei Zeichen. Sie können auch alternative Algorithmen verwenden, sofern die Ausgabe, einschließlich des Timings, genau so ist, wie dies mit dem obigen Algorithmus möglich wäre.
Beispiele
Dies ist ein Beispiel für eine Eingabe 24,35
, bei der es sich um Koprime handelt, sodass der GCD-Wert 1 ist.
Dies ist ein Beispiel mit Eingängen 16,42
, die den GCD 2 haben.
Regeln
- Dies ist ein Code-Golf , also gewinnt das kürzeste Byte
- Es gelten Standardlücken
- Sie können davon ausgehen, dass es sich bei der Eingabe um positive Dezimalzahlen handelt
Klarstellungen
- Die Zeilen, die die Zahlen darstellen, müssen in ihrer ursprünglichen Reihenfolge bleiben, dh die erste und die zweite Zeile des ersten angezeigten "Frames" müssen in allen nachfolgenden Frames die erste bzw. die zweite Zeile sein.
- Nach Beendigung des Algorithmus sollte keine weitere sichtbare Entität angezeigt werden. Dies bedeutet jedoch auch, dass es in Ordnung ist, die Zeilen auszublenden, wenn Sie sicherstellen, dass der letzte "Frame" mindestens so lange angezeigt wird wie alle anderen Frames vor dem Ausblenden.
:-)
Antworten:
Gelee , 29 Bytes
Probieren Sie es online!
Dies definiert eine Funktion
2Ŀ
(kein vollständiges Programm; der TIO-Link enthält eine Fußzeile, die eine Funktion in ein Programm konvertiert), die eine Liste von zwei Elementen als Eingabe verwendet und die Ausgabe auf dem Bildschirm anzeigt (eine unserer zulässigen E / A-Methoden) , und eine, die für diese Herausforderung irgendwie notwendig ist, weil es um das Erscheinen auf dem Bildschirm geht). Dies setzt voraus, dass das Programm auf einem Terminal ausgeführt wird, das dem ANSI-Standard entspricht (ich habe es verwendet,gnome-terminal
aber die meisten funktionieren), und dass das Terminal anfangs leer ist (was als die vernünftigste Standardeinstellung erscheint). Beachten Sie, dass es online versuchen! entspricht nicht diesen Annahmen und daher ist die Ausgabe dort verzerrt (ich habe das Programm lokal ausgeführt, um zu überprüfen, ob es wie erwartet animiert ist). Ich benutze,1
wo die Frage verwendet0
, und2
anstelle von-
.Erläuterung
Hilfsfunktion
1Ŀ
(gibt eine Liste mit zwei Ziffernlisten aus, gibt sie in der ersten und zweiten Zeile des Bildschirms aus und wartet dann 0,5 Sekunden; gibt ihre Eingabe zurück)Die Zeichenfolge "\ x1bc" wird beim Senden an ein ANSI-kompatibles Terminal als Steuercode zum Zurücksetzen des Terminals interpretiert. Dadurch wird der Bildschirm gelöscht und der Cursor in die linke obere Ecke bewegt (wodurch das Terminal für die nächste Ausgabe zurückgesetzt wird).
Die Hilfsfunktion heißt
1Ŀ
(Jelly generiert automatisch Namen dieser Form für Funktionen, und tatsächlich gibt es keine andere Möglichkeit, sie zu benennen), kann jedoch einfach alsÇ
aus dem Hauptprogramm bezeichnet werden (da die Sprache eine Kurzform für Funktionen mit benachbarten Zahlen hat) ).Hauptfunktion
2Ŀ
(implementiert die in der Frage angeforderte Aufgabe)quelle
JavaScript (ES6),
128124 Bytequelle
Python 2 ,
152146 BytesProbieren Sie es online!
Nimmt zwei durch Kommas getrennte Ganzzahlen als Eingabe
quelle
Javascript (ES6),
215 194...135 129127 BytesVerwendung
Dies nimmt Eingaben in eine Variation des Currys vor. Um es zu benutzen, weisen Sie zuerst die Funktion einer Variablen zu (zum Beispiel
G
) und rufen Sie es dann wie folgt auf:Erläuterung
Etwas rekursive Funktion, die sich nach 1 Sekunde selbst aufruft, solange der Algorithmus noch nicht beendet ist. Es verfolgt eine dritte Variable
c
, die festlegt, oba
undb
sollte geändert werden (wennc
ja1
, ist es Zeit für Änderungen).Zunächst schreibt die Funktion etwas in die Konsole. Wenn dies der Fall
c
ist0
, werden zwei Zeichenfolgen mit Nullen und dazwischen eine neue Zeile geschrieben. Dac
zu initialisiert wird0
, können wir dies nutzen und globale Variablen einrichtenf
undg
dass einige Saiten oft halten wir brauchen (wie0
undrepeat
).Andernfalls wird eine Zeichenfolge mit Nullen und Minuspunkten aufgebaut. Alle diese Zeichenfolgen bestehen aus zwei Teilen: erst einige
A
Minuspunkte (nennen Sie diesen Betrag ), dann einige (nennen Sie diesen BetragB
) Nullen, dann eine neue Zeile, dann einige Minuspunkte (nennen Sie diesen BetragD
) und zuletzt einige (nennen Sie diesen BetragE
) Nullen.Wenn der erste Eingang kleiner als der zweite Eingang ist, müssen wir Nullen aus dem zweiten Eingang entfernen. Ist also
A
Null,B
entspricht dem ersten Eingang,D
entspricht dem ersten Eingang undE
entspricht dem zweiten Eingang minus dem ersten Eingang. Wenn der erste Eingang nicht kleiner als der zweite Eingang ist, gilt das Gegenteil (A
ist der zweite Eingang,B
ist der erste Eingang minus dem zweiten Eingang usw.).Mit diesen neuen Werten für den Eingang und eine geschaltete Variable
c
soll die Funktion in1e3
Millisekunden, was einer Sekunde entspricht, erneut aufgerufen werden .Anmerkungen
alert
für die Ausgabe0
und-
, genau wie in den BeispielenProbieren Sie es online aus
Probieren Sie es hier aus!
quelle
Python 2 ,
208204194 Bytes-4 danke an @math_junkie für den hinterhältigen Trick mit
time.sleep
-10 danke an @busukxuan für die Klarstellung der "clear screen" -Regel.
Probieren Sie es online!
Ziemlich sicher, dass dies mehr Golf könnte. Es tut mir weh, die
print
und diefor
Schleife zu duplizieren , um die Pause zu erzeugen, aber ich kann es im Moment nicht umgehen.Anmerkungen
quelle
import time
,s=time.sleep
unds(1)
statt einer Schleife für die Verzögerungtime.sleep
aber diese verpasst. Ich werde es versuchen.Perl,
161149 Bytes... ohne Einrückungen und Zeilenumbrüche:
Lege es in eine Datei gcd.pl und starte wie folgt:
quelle
-M5.010
Flag für Perl ist kostenlos, sodass Sie mitsay
over ein paar Bytes sparen könnenprint…\n
. Ich bin mir außerdem ziemlich sicher, dass es schwieriger ist, Ihrem anonymen Unterprogramm einen Namen zu geben, als es in einer Variablen zu speichern.GNU Sed (mit
e
xec-Erweiterung), 88Die Punktzahl enthält +3 für
-zrf
Optionen aufsed
.Die Eingabe erfolgt als zwei durch Zeilenumbrüche getrennte ganze Zahlen, wobei Großbuchstaben
O
als Ziffern verwendet werden.Beispielsweise kann das Beispiel 16, 42 ausgeführt werden als:
Gemäß den neuesten Kommentaren lösche ich den Bildschirm zwischen den Iterationen nicht.
quelle
V ,
4744 BytesProbieren Sie es online!
Die Kopf- und Fußzeile von TIO werden nur so geändert
gs
, dass die aktuellen zwei Zeilen in den unteren Bildschirmbereich kopiert werden und die ersten beiden Zeilen am Ende gelöscht werden. Dies visualisiert die Operation für TIO, aber wenn Sie sie in V ausführen (ohne Kopf- und Fußzeile), würde sie zwischen jeder Operation nur eine Sekunde warten.quelle
ò
?