Gewinner: Ian D. Scotts Antwort um ein Byte (48 Bytes)! Hervorragend!
Ihr Programm muss Eingaben von einem Bruchteil akzeptieren, der vereinfacht werden kann, und ihn dann vereinfachen.
Regeln:
- Wenn der Bruch bereits in seiner einfachsten Form vorliegt, müssen Sie den Benutzer informieren
- Keine eingebauten Funktionen, um dies zu tun
- Der Benutzer muss die Nummer irgendwann eingeben, die Methode, die das Programm liest, spielt jedoch keine Rolle. Dies kann mit stdin, console.readline usw. geschehen. Solange der Benutzer
9/18
(zum Beispiel) irgendwann eingibt, ist es gültig - Die Ausgabe muss mit stdout, console.writeline usw. erfolgen.
- Der Bruch wird als eingegeben
x/y
und muss als ausgegeben werdena/b
- Der Bruch muss die einfachste Form ausgeben. Zum Beispiel ist 8/12 -> 6/9 nicht gültig , die einzig gültige Lösung ist 2/3.
- Dieser Wettbewerb endet am 9. August 2014 (7 Tage nach Veröffentlichung)
- Dies ist eine Code-Golf- Frage, daher gewinnt der kürzeste Code
Antworten:
Python -
6948Das erste, was Sie tun müssen, ist, es im nativen Python-Format zum Speichern von Brüchen darzustellen, nämlich in der Bruchklasse.
Jetzt vereinfachen wir ... aber schau! Es ist bereits vereinfacht.
Zählt dies als Verwendung einer eingebauten Funktion? Es ist nicht speziell zur Vereinfachung gedacht, und Bruch ist sowieso eine Klasse, keine Funktion.
Ich habe keine Vereinfachungsfunktion aufgerufen, daher ist es nicht meine Schuld, wenn Python beschließt, dies selbst zu tun.
quelle
type(fractions.Fraction.__init__)
gibtwrapper_descriptor
eher zurück alsfunction
, also könnte man sagen, dass es keine Funktion ist. Das bedeutet eigentlich nur, dass es in c implementiert ist, aber alles, was nicht in der Klassenfunktion ist, ist keine Funktion, oder?> <> (92)
Ich weiß, dass ich das niedriger machen kann, ich werde es morgen früh ein bisschen mehr spielen.
Grundlegende Erklärung: Die ersten beiden Zeilen und die zweite Hälfte der dritten Zeile dienen zum Lesen von Zahlen. Leider hat> <> keine Möglichkeit, dies zu tun, sodass das Parsen die Hälfte des Programms in Anspruch nimmt.
Die 4. Zeile ist eine einfache iterative GCD-Berechnung. Ich bin überrascht, wie gut> <> die Anzahl der Bytes für den tatsächlichen Algorithmus war. Wenn es nicht das schreckliche I / O gäbe, könnte es tatsächlich eine vernünftige Golfsprache sein.
Die letzten beiden Zeilen dienen nur zum Drucken des Ergebnisses und zum Teilen der ursprünglichen Zahlen durch die GCD.
quelle
GolfScript, 49 Zeichen
Führen Sie die beiden Testfälle hier aus :
quelle
JavaScript 101
Ausnahmsweise eine Lösung, die EcmaScript 6 nicht verwendet
Aber mit E6 könnte 93 sein
quelle
for([a,b]=[c,d]=prompt().split('/');b;[a,b]=[b,a%b]);alert(a-1?c/a+'/'+d/a:'Reduced');
86 Ich hoffe, es ist mathematisch korrekt ...Python 2.7, 124
Sehr einfache Lösung, obwohl ich weiß, dass sie in vielen anderen Sprachen kürzer wäre.
Ich habe einen importierten verwendet,
gcd
aber wenn er als eingebauter Fraktionsreduzierer zählt, kann er direkt implementiert werden.quelle
Python 2 (82)
Druckt anschließend einen Booleschen Wert, um festzustellen, ob das Original in der einfachsten Form vorliegt. Tut einfach den üblichen GCD-Algorithmus. Die meisten Zeichen werden für die Eingabe / Ausgabe ausgegeben.
quelle
input()
?print
, dasmap
entpackt wird und vielleicht eher eine Ganzzahl als eine Float-Division.map
mit Auspacken?a,b=map(int,...)
erfordert keine zusätzlichen Zeichen, daa,b=...
es automatisch entpackt wird. Das Problem, auf das Sie manchmal mit Python 3 stoßen, ist, dassmap
keine Liste erstellt wird, sondern ein Kartenobjekt, das in eine Liste umgewandelt werden muss, bevor Sie so etwas wie Slice It ausführen können. Ein Ausdruck wie*l,=map(...)
wird benötigt, uml
stattdessen als Liste zuzuweisen .PHP> = 7,1, 76 Bytes (nicht konkurrierend)
Online Version
quelle
C 94
Nur Brute Force erraten und prüfen, ob die GCD bei a | b bis 1 beginnt.
quelle
c;d;f(a,b){b?f(b,a%b):printf("%d/%d",c/a,d/a);}main(){scanf("%d/%d",&c,&d);f(c,d);}
Rebmu (104 Zeichen)
Unmushed:
quelle
PHP 156
meh.
Lauf:
Hier ist eine ungolfed Version mit einigen Tests (modifiziert in Funktionsform):
quelle
Java,
361349329 (danke @Sieg für denint
Tipp)Ich weiß, dass es nicht kurz ist, aber ich bin einfach fasziniert von dem, was ich getan habe.
Um es zu verwenden, kompilieren Sie den Code und führen Sie ihn aus, indem Sie die Argumente über die Befehlszeile übergeben.
doubles
und die Aufgabe erfordert es nicht).Ungolfed (wenn jemand dieses Durcheinander sehen will):
quelle
int
statt verwendenInteger
, auch im Produktionscode. Int wird vom Stapel zugewiesen, während Integer vom Heap stammt.new Integer(str)
hat das gleiche Ergebnis wieInteger.parseInt(str)
. Warum nichtString f=""
(immer) verwenden?new Integer(str)
dasInteger
aus einem String entsteht, aber nichtInteger.parseInt(str)
das Gleiche tut? Und die Sache mitString f=""
, ich weiß, dass ich esString f=new String()
Integer.parseInt
macht zwar das gleiche, aber mit einigen zwischengespeicherten Werten für eine schnellere Suche.Ruby - 112 Zeichen
g
ist ein Helfer-Lambda, das die GCD von zwei ganzen Zahlen berechnet.f
Nimmt beispielsweise einen Bruch als Zeichenfolge'42/14'
und gibt den reduzierten Bruch aus odersimplest
wenn Zähler und Nenner relativ prim sind.Einige Testfälle:
Ausgabe:
Beachten Sie, dass Ruby
Rational
Unterstützung hat, obwohl dies gegen die Regeln verstößt, sodass wir dies tun könnenquelle
JavaScript
(91)(73)Gibt '/' zurück, wenn der Bruch bereits in seiner einfachsten Form vorliegt. Die Funktion g berechnet die gcd. Übrigens: Gibt es einen kürzeren Weg für '1 == etwas', wo etwas eine nicht negative ganze Zahl ist?
function s(f){[n,m]=f.split(b='/');g=(u,v)=>v?g(v,u%v):u;return 1==(c=g(n,m))?b:n/c+b+m/c;}
Vielen Dank an @bebe für eine noch kürzere Version:
quelle
s=f=>...
und weisen Sie g zu, wenn Sie sie verwenden.(g=...)(n,m)
Übergeben Sie sie dann an c und testen Sie, ob sie gleich 1 ist,c-1?not_equals:equals
und versuchen Sie, die Verwendung von return zu vermeiden. Ergebnis:s=f=>([n,m]=f.split(b='/'),c=(g=(u,v)=>v?g(v,u%v):u)(n,m))-1?n/c+b+m/c:f;
73 (gibt die einfachste Form (f) zurück, wenn sie nicht reduziert werden kann)function
und verwendetreturn
. Und danke für die-1
=)Lua -
130115 Zeichen10/10 habe ich wirklich versucht
Ich habe Luas Fähigkeit, eine Zeichenfolge automatisch in eine Zahl umzuwandeln, voll ausgenutzt, wenn ich arithmetische Operationen an einer Zeichenfolge ausgeführt habe. Ich musste "+0" anstelle von tonumber für einen Vergleichscode hinzufügen.
Entschuldigung, ich habe keine ungolfed Version, das obige ist eigentlich so, wie ich es geschrieben habe
quelle
Charge - 198
Die Eingabe wird aufgeteilt als
a/b
, dann prüfen wir für jedenc
inb,b-1,...1
, oba
undb
durch teilbar sindc
, und teilen sie durch,c
ob sie teilbar sind. Dann kehren wir zurücka/b
quelle
Befunge 93 (192)
quelle
C 135
Akzeptiert Eingaben für 2 durch Leerzeichen getrennte Ganzzahlen. Teilt durch mindestens a & b bis 1, um GCD zu finden.
quelle
Java (200)
Die bisher beste Lösung in Java hatte noch> 300 Bytes, diese hat 200:
Dies verwendet das (schnellere) Modulo, um die gcd zu bestimmen, anstatt alle Zahlen zu iterieren.
quelle
class M