Titel sagt alles. Zwei positive 32-Bit-Ganzzahlen m, n >= 2
, Ausgabe gcd(m,n)
in Form einer Primfaktorisierung.
Eingang
Kommandozeilen-Argumente oder 1 Zeile Standard, was auch immer für das Golfen besser ist.
Ausgabe
Mit Exponenten begrenztes einzelnes Leerzeichen (keine zusätzlichen Leerzeichen). Gib nichts aus, wenn die Eingänge relativ prim sind.
Beispiele:
$ ./factorize 96 162
2^1 3^1
$ ./factorize 14 15
$ ./factorize 196 294
2^1 7^2
Regeln
- Sie dürfen keine externen Ressourcen, mathematischen Bibliotheken oder integrierten Funktionen für die Faktorisierung oder GCD verwenden. Beispiele: Java, nein
java.lang.Math
. Rubin, neinprime_division
, Perl, neinfactor
, etc.
gcd(n,m) == 1
?q:a+.b
oder__ q:a+.b
in J nicht verwendetexternal resources or math libraries
, aber ich werde es nicht posten, da es zu weit vom Geist der Frage entfernt ist. Ich dachte nur, ich würde es hier teilen.Antworten:
Python 3,
255250237226188180150142137136 ZeichenEs ist erstaunlich, wie sehr ich dies verkürzen könnte, indem ich nur Sachen überspringe (wie, wissen Sie, das Finden des GCD)! Außerdem könnte ich 10 Zeichen mehr reduzieren, indem ich dies zu einer Funktion mache, die wie einige andere Antworten 2 Zoll erwartet, anstatt von stdin zu lesen.
quelle
while g<a and g<b:
zuwhile(g<a)*(g<b):
a%g+b%g
Bit herauszufindenelse:g+=1
könnte nur seing+=1
, es sei denn mir fehlt etwas.Rubin -
16811711410110097Edit: Nachdem ich darüber nachgedacht hatte, wurde mir klar, dass ich das Sieb nicht brauchte, da die Primalität des Faktors in der Faktorisierungsschleife berücksichtigt wird. Wie aus den Antworten anderer hervorgeht ( Laindirs und Tals sind die, in denen ich es gesehen habe, obwohl es so aussieht, als hätten andere es auch getan), wurde die separate GCD-Berechnung entfernt, da dies auch in der Faktorisierung vorkommt.
Edit 2: Nicht brauchen
do
.Edit 3: Drücke es weiter runter.
Edit 4: Noch ein Leerzeichen herausgezogen.
Edit 5:
upto
statteach
;?^ == "^"
!Ausgabe (gleich nach der Bearbeitung):
Sicher könnte besser gemacht werden, aber nicht schlecht für meine erste.
quelle
map{|i|i.to_i}
zumap &:to_i
. Sie können ein 5. Byte entfernen, indem Sie den Zeilenumbruch am Ende der Datei nicht mitzählen. Ruby funktioniert ohne es.$*
anstelle von verwendenARGV
.Python 2 -
254252196185156151134126121Dolmetscher
repl.it
Beispiel Eingabe - stdin
Beispielausgabe - stdout
quelle
…`a`+'^'+`f.count(a)`…
?f.append(i)
gegenf+=[i]
, um 5 Zeichen zu speichern.f=''
noch da?)Java -
184175Dies ist inspiriert durch die Antwort von @Geobits (und ein wenig von @Tals Antwort), aber genug davon ist anders, dass ich beschlossen habe, meine eigene Antwort zu erstellen.
Ungolfed (Art) mit (menschlicher Überprüfung) Testgeschirr:
quelle
Gleichstrom, 96 Bytes
Es liest eine Zeile der Standardeingabe. Die Ausgabe endet nicht mit einem Zeilenumbruch. (BEARBEITEN: Es wird auch nach jeder Faktorisierung ein zusätzliches Leerzeichen ausgegeben. Einige der anderen Antworten kürzen das Leerzeichen, dieses jedoch nicht.)
Beispiel:
Code mit Kommentaren:
quelle
PowerShell - 82
quelle
2..$a
in eine Foreach-Object-Schleife%{...}
. Die Schleife sammelt die Werte vonif($p){"$_^$p"}
.JavaScript (ECMAScript 6 Draft) - 89 Zeichen
Konvertiert die ursprüngliche (iterative) Antwort unten in eine rekursive.
Erläuterung
Iterative Antwort: JavaScript (ECMASCript 6) -
108 (oder 121)98 ZeichenVersion 2:
Version 1:
Beantwortung der Frage wie ursprünglich gestellt:
Oder um die Regeländerungen nachträglich einzuhalten:
Erläuterung
Ausgabe
quelle
f(158,237)
bitte testen" 79^1"
filter()
telefonieren?Perl 6: 90 Zeichen, 94 Bytes
Etwas entgolft und kommentiert:
Die Verwendung ist wie folgt:
quelle
Perl,
1441331181149793Ungolfed-Version:
Ich habe gerade erst angefangen, Perl zu lernen, um diese Frage zu beantworten (dies ist mein erster Perl-Code überhaupt), und ich vermute, dass dies weiter verbessert werden kann.
quelle
foreach
immer gleichbedeutend mitfor
Perl 5, sodass 4 Zeichen abgeschnitten werden sollten :)Java:
247241Verfolgt die Faktoren in einem Array und druckt sie einfach in einer Schleife aus.
Anständige Größe für Java, so scheint es.
quelle
int
, dass Sie 4 an die verlieren,int
aber Sie gewinnen sie mitnew int[
-> zurücknew Integer[
, es ist also eine Wäsche.n%i<1&&m%i<1
haben%i+m%i<1
.()
. Wennn==m
ja, wird esm+1
sowieso standardmäßig verwendet .m/=i;i=1;
mitm/=i--;
schneller läuft auch :)for
Schleife notwendig?JavaScript (ECMAScript 5)
170164163113Ich konnte nicht widerstehen, MT0s Führung zu folgen. Ich hatte schon früher über Rekursion nachgedacht, aber es schien zu einfach, Fehler zu machen. Und das ist es wirklich. Die geringste Abweichung zerstört alles.
Es gibt eine Geige für diejenigen, die Geigen mögen.
Ungolfed:
Alte Version
Ungolfed:
Hier sind einige Tests:
quelle
f(301343045, 421880263);
wahrscheinlich fehlgeschlagen, weil mein Browser mich nicht so tief rekursiv arbeiten lässt. Dummer gebrochener Firefox!GolfScript, 68 Bytes
Beachten Sie, dass für diesen Ansatz O (b 2 ) Zeit und Platz für die Ganzzahlen „a“ und „b“ erforderlich sind .
Auf Kosten eines zusätzlichen Bytes sind "nur" O (b) Zeit und Raum erforderlich:
Wie es funktioniert
quelle
Python 3 (123)
Dies verwendet im Grunde die gleiche Struktur wie Tals Antwort .
Es reicht aus, bis zu p = a-1 zu schleifen, da wir sofort inkrementieren, um p = a und a> = min (a, b) zu erhalten. Wenn b> a ist, schadet es nicht, nutzlose Werte von p über a zu versuchen.
In 2.X, denke ich , dass wir Zeichen durch Drucken jedes Stück retten könnte , wie wir es bekommen , anstatt einen String Akkumulieren:
if c:print'%d^%d'%(p,c),
. Python 3 scheint leider keine kompakte Art zu haben, ohne eine nachgestellte Zeile zu drucken.quelle
PHP, 96
quelle
p=0;g+=1
zu einer Zeile zu kombinieren , indem Sieg
stattdessen bei 1 beginnen , was Sie danng<a
eher tun lassen alsg<=a
. Ich hoffe du wirst Python mögen.awk -
1151119685Neue Version kann nur eine Eingabezeile verarbeiten. Vielen Dank an durron597 für den Hinweis, dass ich nur dafür sorgen muss
i <= $1
.Ungolfed:
Zuvor konnten immer wieder Zahlenpaare genommen werden
Ungolfed:
quelle
&&i<=b
?i > b
, dannb % i != 0
... danke :)NF=0;
$ 1 und $ 2 nicht gelöscht werden können. Die Ausgabe vonecho 301343045 421880263 | awk -f factorize.awk | sed 's/ */ /g'
ist,5 7 1021^1 59029^1
weil $ 1 5 und $ 2 7 ist. Die Sed quetscht die zusätzlichen Leerzeichen, die beim Drucken von $ 1022, $ 1023, $ 1024, ..., $ 59028 als leere Zeichenfolgen entstehen, die durch Leerzeichen verbunden sind.$0=z;
$0=z;
ist die gleiche Anzahl von Zeichen wieNF=0;
. Wenn$0=z;
es länger wäre, würde ich dir sagen, dass du es behalten sollstNF=0;
.Pip , 41 Bytes
Keine konkurrierende Antwort, da die Sprache neuer ist als die Frage. Die GolfScript-Marke von 68 musste jedoch herabgesetzt werden.
Die Ausgabe endet in einem Leerzeichen. Wenn das ein Problem ist, ist die folgende Version auch 41 Bytes (einschließlich des
-s
Flags):Formatiert mit Erläuterungen:
Pip, im Gegensatz zu GolfScript, CJam et al. ist eine imperative Sprache mit Infix-Operatoren; Es lässt sich auch von Array-Programmiersprachen inspirieren. Diese Aufgabe zeigt gut beide Paradigmen bei der Arbeit.
(Beachten Sie, dass das 2015-4-20-Commit erforderlich ist, um dies auszuführen, da ich gerade ein paar Fehler behoben habe.)
quelle
Python 2 - 262 Bytes
Zeile 6 braucht Arbeit.
quelle
…`a`+'^'+`f.count(a)`…
?Groovy: 174 Zeichen
Dies ist eine Portierung der Geobits-Lösung für Groovy 2.2.1:
Hier ist die ungolfed Version:
quelle
R: 139
Mit Einrückungen:
Verwendung:
quelle