Finden Sie die Primfaktoren

23

In dieser Aufgabe müssen Sie ein Programm schreiben, das die Primfaktoren einer Zahl berechnet. Die Eingabe ist eine natürliche Zahl 1 <n <2 ^ 32. Die Ausgabe ist eine Liste der Primfaktoren der Zahl im folgenden Format. Exponenten müssen weggelassen werden, wenn sie 1 sind. Nur Primzahlen ausgeben. (Angenommen, die Eingabe ist 131784):

131784 = 2 ^ 3 * 3 * 17 ^ 2 * 19

Die Verwendung des gleichen Leerzeichens ist nicht erforderlich. Wo immer dies angebracht ist, kann ein Leerzeichen eingefügt werden. Ihr Programm sollte für jede Eingabe in weniger als 10 Minuten abgeschlossen sein. Das Programm mit der kürzesten Anzahl von Zeichen gewinnt.

FUZxxl
quelle
9
Bonuspunkte, wenn Ihr Programm den Faktor 6857599914349403977654744967172758179904114264612947326127169976133296980951450542789808884504301075550786464802304019795402754670660318614966266413
Joey Adams
@ Joey Adams: Die Faktorisierung beginnt mit 17 * 71 * 113 * 997 * 313597 ...
FUZxxl
3
@FUZxxl: Ich glaube, Sie haben einen Fehler beim Kopieren der Nummer gemacht. Es ist das Produkt von zwei großen Primzahlen .
Joey Adams
@ Joey Können wir Shors Algorithmus verwenden?
Mateen Ulhaq
23
@Joey Ich habe versehentlich Kaffee über meinen Quantencomputer verschüttet, und mein Freund benutzt seinen, um sich in die US-Regierung zu "hacken" oder etwas Unwichtiges, also nein. :(
Mateen Ulhaq

Antworten:

11

SageMath, 31 Bytes

N=input()
print N,"=",factor(N)

Testfall: 83891573479027823458394579234582347590825792034579235923475902312344444 Ausgänge:

83891573479027823458394579234582347590825792034579235923475902312344444 = 2^2 * 3^2 * 89395597 * 98966790508447596609239 * 263396636003096040031295425789508274613

12431234123412341234123
quelle
Herzlichen Glückwunsch zum Gewinn einer Herausforderung mit Ihrem ersten Beitrag, gute Arbeit! Und willkommen auf der Seite!
DJMcMayhem
8

Ruby 1.9, 74 70 Zeichen

#!ruby -plrmathn
$_+=?=+$_.to_i.prime_division.map{|a|a[0,a[1]]*?^}*?*

Bearbeitungen:

  • (74 -> 70) Verwenden Sie einfach den Exponenten als Slice-Länge, anstatt explizit nach zu suchen exponent > 1
Ventero
quelle
7

Perl 5.10, 73 88

perl -pe '$_=`factor $_`;s%( \d+)\K\1+%-1-length($&)/length$1%ge;y, -,*^,;s;\D+;=;'

Übernimmt die eingegebene Nummer aus der Standardeingabe. Berechnet die Faktoren für mehrere Eingaben, falls angegeben.

Gerechnet als Differenz zu perl -e. Für das \KRegex-Metazeichen wird 5.10 benötigt .

JB
quelle
+1 für die Verwendung factor.
st0le
Sollten Sie die pOption nicht mitzählen ?
Joey
@ Joey in der Tat sollte ich. Das tut mir leid. Festsetzung.
JB
Sie haben das noch nicht getestet, aber stattdessen split/\D/,~factor $_~;$_="@_";können Sie schreiben $_=~factor $_~;s/\D/ /g;? (Natürlich ~mit dem Backtick ersetzen .)
Timwi
Du meinst $_=`factor $_`;s/\D/ /g;? Duales Backtick-Encasing hilft.
aaaaaaaaaaa
5

OCaml, 201 Zeichen

Eine direkte zwingende Übersetzung des besten Python-Codes:

let(%)s d=if!d>1then Printf.printf"%s%d"s!d
let f n=let x,d,e,s=ref n,ref 1,ref 0,ref"="in""%x;while!d<65536do
incr d;e:=0;while!x mod!d=0do x:=!x/ !d;incr e
done;if!e>0then(!s%d;"^"%e;s:="*")done;!s%x

Beispielsweise,

# f 4294967292;;
4294967292=2^2*3^2*7*11*31*151*331- : unit = ()

(Beachten Sie, dass ich auf die Ausgabe der Endzeile verzichtet habe.) Nur zum Spaß, mit 213 Zeichen eine rein funktionale Version, die durch den freien Gebrauch von Operatoren gründlich verschleiert wurde:

let(%)s d=if d>1then Printf.printf"%s%d"s d
let f x=let s=ref"="in""%x;let rec(@)x d=if d=65536then!s%x else
let rec(^)x e=if x/d*d<x then x,e else x/d^e+1in
let x,e=x^0in if e>0then(!s%d;"^"%e;s:="*");x@d+1in x@2
Matías Giovannini
quelle
5

Python, 140 135 133 Zeichen

M=N=input()
s=''
f=1
while f<4**8:
 f+=1;e=0
 while N%f<1:e+=1;N/=f
 if e:s+='*%d'%f+'^%d'%e*(e>1)
print M,'=',(s+'*%d'%N*(N>1))[1:]
Keith Randall
quelle
Ich denke, die Ausgabe erfordert etwas mehr Leerzeichen, zB ' * %d'... Und zwei weitere Dinge 65536 == 4**8:; Zeile 7:if e:s+='*%d'%f+'^%d'%e*(e>1)
Oleh Prypin
@BlaXpirit: "Dieselbe Menge an Leerzeichen ist nicht erforderlich". Danke für die beiden anderen, ich werde sie einarbeiten.
Keith Randall
5

J, 72

(":*/f),'=',([,'*',])/(":"0~.f),.(('^',":)`(''"0)@.(=&1))"0+/(=/~.)f=.q:161784

Typisch J. Zwei Charaktere für den Großteil der Arbeit, sechzig Charaktere für die Präsentation.

Bearbeiten: Die Anzahl der Zeichen wurde korrigiert.

JB
quelle
2
Dies sieht für mich nicht nach 62 Zeichen aus. Selbst wenn Sie davon ausgehen, dass 161784Sie etwas eingegeben haben, sind es immer noch 72 Zeichen.
Ventero
Wäre es nicht kürzer mit |: __ q: y?
Eelvex
2
@Ventero: typisch JB. Zwei Stunden, um das verdammte Ding zu spielen, fünfzehn Sekunden, um die Anzahl der Charaktere zu vermasseln.
JB
5

J, 53 52 Zeichen

Diese Lösung basiert aufrplc der Zufallslösung, hat aber auch einige originelle Ideen.

":,'=',(":@{.,'^','*',~":@#)/.~@q:}:@rplc'^1*';'*'"_

In nicht stillschweigender Notation wird diese Funktion

f =: 3 : 0
(": y) , '=' , }: (g/.~ q: y) rplc '^1*' ; '*'
)

wo gist definiert als

g =: 3 : 0
": {. y) , '^' , (": # y) , '*'
)
  • q: yist der Vektor der Primfaktoren von y. Zum Beispiel q: 60Erträge 2 2 3 5.
  • x u/. ygilt ufür y keyed by x, dhu wird auf Vektoren von Elementen angewendet, yfür die die Einträge in xgleich sind. Dies ist ein wenig kompliziert zu erklären, aber in dem speziellen Fall , y u/. yoder u/.~ y, uauf jeden Vektor von verschiedenen Elementen in angewandt y, wobei jedes Element für so oft wiederholt wird , wie es erscheint in y. Zum Beispiel </.~ 1 2 1 2 3 1 2 2 3Erträge

    ┌─────┬───────┬───┐
    │1 1 1│2 2 2 2│3 3│
    └─────┴───────┴───┘
    
  • # yist die tally der y, dass die Anzahl der Elemente in ist y.

  • ": y Formate y als Zeichenfolge.
  • x , y hängt an x und y.
  • {. yist der Kopf y , das heißt sein erster Gegenstand.
  • Somit (": {. y), '^' , (": # y) , '*'formatiert einen Vektor von n Wiederholungen einer Zahl k in einen String der Form k ^ n *. Dieser Satz in stillschweigender Notation ist :@{.,'^','*',~":@#, den wir an das /.weiter oben beschriebene Adverb weitergeben.
  • x rplc yist die Bibliotheksfunktion zum Ersetzen von Zeichen. yhat die Form a ; bund jede Instanz von string ain xwird ersetzt durch b. xwird verwüstet (dh so umgeformt, dass es Rang 1 hat), bevor die Operation stattfindet, die hier verwendet wird. Dieser Code ersetzt ^1*mit *als mit dem Auftrag , Ausgabeformat entsprechen.
  • }: yist die Abkürzung von yallem, außer seinem letzten Gegenstand. Dies wird verwendet, um das Trailing zu entfernen *.
FUZxxl
quelle
Könnten Sie mit nicht viel Arbeit sparen __ q:?Probieren Sie es online!
Adám
@Adam Tatsächlich gute Idee!
FUZxxl
4

PHP, 112

echo$n=$_GET[0],'=';$c=0;for($i=2;;){if($n%$i<1){$c++;$n/=$i;}else{if($c){echo"$i^$c*";}$c=0;if(++$i>$n)break;}}

118

echo $n=$_GET[0],'=';for($i=2;;){if(!($n%$i)){++$a[$i];$n/=$i;}else{if($a[$i])echo "$i^$a[$i]*";$i++;if($i>$n)break;}}
zzzzBov
quelle
3

Python 119 Zeichen

M=N=input()
i=1
s=""
while N>1:
 i+=1;c=0
 while N%i<1:c+=1;N/=i
 if c:s+=" * %d"%i+['','^%d'%c][c>1]
print M,'=',s[3:]
fR0DDY
quelle
1
Das habe ich zuerst versucht, aber es ist zu langsam für große Primzahlen wie 4294967291.
Keith Randall
@ Keith Die Fragestunde dauert bis zu 10 Minuten. Dauert dies im schlimmsten Fall mehr als 10 Minuten?
FR0DDY
2
Es dauerte 32 Minuten auf meinem Computer für diese Nummer.
Keith Randall
3

JavaScript, 124 122 119

for(s='',i=2,o=p=prompt();i<o;i++){for(n=0;!(p%i);n++)p/=i;n?s+=i+(n-1?'^'+n:'')+'*':0}alert(s.substring(0,s.length-1))
Ry-
quelle
3

Perl, 78

use ntheory":all";say join" * ",map{(join"^",@$_)=~s/\^1$//r}factor_exp(shift)

Es verwendet die s /// r-Funktion von Perl 5.14, um die ^ 1s zu beseitigen. 81 Zeichen, die in einer Schleife ausgeführt werden sollen:

perl -Mntheory=:all -nE 'chomp;say join" * ",map{(join"^",@$_)=~s/\^1$//r}factor_exp($_);'
DanaJ
quelle
Sie können die Leerzeichen weglassen, wenn Sie möchten. Dies würde zwei Zeichen speichern. Schöne lösung!
FUZxxl
2

PHP, 236 Zeichen

$f[$n=$c=$argv[1]]++;echo"$n=";while($c){$c=0;foreach($f as$k=>$n)for($r=~~($k/2);$r>1;$r--){if($k%$r==0){unset($f[$k]);$f[$r]++;$f[$k/$r]++;$c=1;break;}}}foreach($f as$k=>$n)if(--$n)$f[$k]="$k^".++$n;else$f[$k]=$k;echo implode("*",$f);

Ausgabe für 131784: 2 ^ 3 * 3 * 17 ^ 2 * 19

Vervollständigt beim Testen alle Zahlen innerhalb weniger Sekunden.

4294967296=2^32
Time: 0.000168

Die Eingabe wurde nie angegeben, weshalb ich sie mit Befehlszeilenargumenten aufrief.

php factorize.php 4294967296
Kevin Brown
quelle
2

Scala 374:

def f(i:Int,c:Int=2):List[Int]=if(i==c)List(i)else 
if(i%c==0)c::f(i/c,c)else f(i,c+1)
val r=f(readInt)
class A(val v:Int,val c:Int,val l:List[(Int,Int)])
def g(a:A,i:Int)=if(a.v==i)new A(a.v,a.c+1,a.l)else new A(i,1,(a.v,a.c)::a.l)
val a=(new A(r.head,1,Nil:List[(Int,Int)])/:(r.tail:+0))((a,i)=>g(a,i))
a.l.map(p=>if(p._2==1)p._1 else p._1+"^"+p._2).mkString("", "*", "")

ungolfed:

def factorize (i: Int, c: Int = 2) : List [Int] = {
  if (i == c) List (i) else 
    if (i % c == 0) c :: f (i/c, c) else 
      f (i, c+1)
}
val r = factorize (readInt)
class A (val value: Int, val count: Int, val list: List [(Int, Int)])
def g (a: A, i: Int) = 
  if (a.value == i) 
    new A (a.value, a.count + 1, a.list) else 
    new A (i, 1, (a.value, a.count) :: a.list)
val a = (new A (r.head, 1, Nil: List[(Int,Int)]) /: (r.tail :+ 0)) ((a, i) => g (a, i))
a.l.map (p => if (p._2 == 1) p._1 else
  p._1 + "^" + p._2).mkString ("", "*", "")
Benutzer unbekannt
quelle
2

J 74 Zeichen

f=.3 :0
(":y),'=',' '-.~('^1 ';'')rplc~}:,,&' *'"1(,'^'&,)&":/"{|:__ q:y
)

   f 131784
131784=2^3*3*17^2*19

64 Zeichen mit Eingabe in Variable x:

   x=.131784

   (":x),'=',' '-.~('^1 ';'')rplc~}:,,&' *'"1(,'^'&,)&":/"{|:__ q:x
131784=2^3*3*17^2*19
randomra
quelle
Wenn Sie es schaffen, dies in eine implizite Definition umzuwandeln, können Sie vermeiden, alle Anführungszeichen zu umgehen. Sie könnten auch eine 3 : 0Definition verwenden.
FUZxxl,
@FUZxxl Ich habe erwartet, dass ich in der 3 : 0Version nur den ungekapselten String einfügen kann, aber es hat nicht funktioniert. Ich könnte es aber später stillschweigend versuchen. Dies ist das 3: 0, das ich versucht habe: pastebin.com/rmTVAk4j .
Randomra
Es sollte funktionieren. Ich verstehe nicht warum. Haben Sie Ihr Argument so genannt, ywie Sie es sollten?
FUZxxl,
@FUZxxl Dies ist das 3: 0, das ich versucht habe: pastebin.com/rmTVAk4j .
Randomra
Das 3: 0, das Sie ausprobiert haben, stimmt nicht genau mit dem von Ihnen angegebenen Einzeiler überein. Es verwendet ''statt a:an einem Ort. Vielleicht ist das der Unterschied?
FUZxxl
2

Java 10, 109 108 Bytes (Lambda-Funktion) (nicht konkurrierend auf Anfrage von OP)

n->{var r=n+"=";for(int i=1,f;i++<n;r+=f<1?"":(f<2?i:i+"^"+f)+(n>1?"*":""))for(f=0;n%i<1;n/=i)f++;return r;}

Probieren Sie es online aus.

Java 6+, 181 Bytes (volles Programm)

class M{public static void main(String[]a){long n=new Long(a[0]),i=1,f;String r=n+"=";for(;i++<n;r+=f<1?"":(f<2?i:i+"^"+f)+(n>1?"*":""))for(f=0;n%i<1;n/=i)f++;System.out.print(r);}}

Probieren Sie es online aus.

-1 Byte dank @ceilingcat .

Erläuterung:

n->{                // Method with integer parameter and String return-type
  var r=n+"=";      //  Result-String, starting at the input with an appended "="
  for(int i=1,f;i++<n;
                    //  Loop in the range [2, n]
      r+=           //    After every iteration: append the following to the result-String:
        f<1?        //     If the factor `f` is 0:
         ""         //      Append nothing
        :           //     Else:
         (f<2?      //      If the factor `f` is 1:
           i        //       Append the current prime `i`
          :         //      Else:
           i+"^"+f) //       Append the current prime `i` with it's factor `f`
         +(n>1?     //      And if we're not done yet:
            "*"     //       Also append a "*"
           :        //      Else:
            ""))    //       Append nothing more
    for(f=0;        //   Reset the factor `f` to 0
        n%i<1;      //   Loop as long as `n` is divisible by `i`
      n/=i)         //    Divide `n` by `i`
      f++;          //    Increase the factor `f` by 1
  return r;}        //  Return the result-String
Kevin Cruijssen
quelle
@ceilingcat Danke!
Kevin Cruijssen
Disqualifiziert, da Java 10 erstellt wurde, nachdem diese Aufgabe veröffentlicht wurde.
FUZxxl
@FUZxxl Ich habe das Java 10 Lambda als nicht konkurrierend markiert und ein Java 6-Programm hinzugefügt, das im Dezember 2006 veröffentlicht wurde .
Kevin Cruijssen
Okay, cool. Das ist für mich in Ordnung!
FUZxxl
2

Japt , 28 27 26 Bytes

-1 Byte dank Shaggy

+'=+Uk ü ®ÊÉ?ZÌ+'^+Zl:ZÃq*

Versuch es

Oliver
quelle
Disqualifiziert, da Ihre Sprache erstellt wurde, nachdem diese Aufgabe veröffentlicht wurde.
FUZxxl
Es war nicht erlaubt, zurückzukehren, als die Herausforderung veröffentlicht wurde. Ich halte es für unfair, die Regeln einer Herausforderung zu ändern, nachdem die Herausforderung veröffentlicht wurde, sodass Sprachen, die nach dieser Herausforderung veröffentlicht wurden, weiterhin illegal sind.
FUZxxl
1
@FUZxxl Sie müssen meine Antwort nicht akzeptieren, aber ich darf sie trotzdem beantworten.
Oliver,
1
24 Bytes
Shaggy
1

Powershell, 113 97 Bytes

Inspiriert von Joeys Antwort . Es ist langsam, aber kurz.

param($x)(2..$x|%{for(;!($x%$_)){$_
$x/=$_}}|group|%{$_.Name+"^"+$_.Count-replace'\^1$'})-join'*'

Erklärtes Testskript:

$f = {

param($x)               # let $x stores a input number > 0
(2..$x|%{               # loop from 2 to initial input number
    for(;!($x%$_)){     # loop while remainder is 0
        $_              # push a current value to a pipe
        $x/=$_          # let $x is $x/$_ (new $x uses in for condition only)
    }
}|group|%{              # group all values
    $_.Name+"^"+$_.Count-replace'\^1$'  # format and remove last ^1
})-join'*'              # make string with *

}

&$f 2
&$f 126
&$f 129
&$f 86240
#&$f 7775460

Ausgabe:

2
2*3^2*7
3*43
2^5*5*7^2*11
mazzy
quelle
1

Jelly , 16 Bytes (nicht konkurrierend auf Anfrage von OP)

³”=³ÆFḟ€1j€”^j”*

Eine meiner ersten Gelee-Antworten, kann also definitiv (besonders ³”=³) golfen werden ..

Probieren Sie es online aus.

Erläuterung:

³                 # Push the first argument
 ”=               # Push string "="
   ³ÆF            # Get the prime factor-exponent pairs of the first argument
      ḟ€1         # Remove all 1s from each pair
         j€”^     # Join each pair by "^"
             j”*  # Join the pair of strings by "*"
                  # (implicitly join the entire 'stack' together)
                  # (which is output implicitly as result)
Kevin Cruijssen
quelle
Disqualifiziert, da Ihre Sprache erstellt wurde, nachdem diese Aufgabe veröffentlicht wurde.
FUZxxl
@FUZxxl Seit Mitte 2017 ist das Nicht-Konkurrieren nicht mehr im Meta enthalten , es sei denn, die Herausforderung besagt ausdrücklich, dass Sprachen älter sein sollten als der Zeitpunkt der Veröffentlichung. Wenn Sie als derjenige, der die Herausforderung veröffentlicht hat, jedoch keine Sprachen zulassen, die neuer sind als das Datum Ihrer Herausforderung, bearbeite ich meine Antworten, um die explizite hinzuzufügen (non-competing). :)
Kevin Cruijssen
Ich bin der Meinung, dass der Website-Konsens, der zum Zeitpunkt der Veröffentlichung dieser Herausforderung bestand, die Regeln für Antworten festlegen sollte. Alles andere (dh Regeln, die sich ändern, nachdem die Herausforderung veröffentlicht wurde) wäre unfair. Bitte kennzeichnen Sie Ihre Antworten als nicht konkurrierend.
FUZxxl
@FUZxxl Ich habe meine Antworten als nicht konkurrierend markiert, wie angefordert.
Kevin Cruijssen
Danke für deine Hilfe.
FUZxxl
1

05AB1E , 22 20 Bytes (nicht konkurrierend auf Anfrage von OP)

ÐfsÓ0Køε1K'^ý}'*ý'=ý

-2 Bytes dank @Emigna .

Probieren Sie es online aus.

Erläuterung:

Ð                # Triplicate the (implicit) input-integer
 f               # Pop and push all prime factors (without counting duplicates)
  s              # Swap to take the input again
   Ó             # Get all prime exponents
    0K           # Remove all 0s from the exponents list
      ø          # Zip it with the prime factors, creating pairs
       ε         # Map each pair to:
        1K       #  Remove all 1s from the pair
        '^ý     '#  And then join by "^"
       }'*ý     '# After the map: join the string/integers by "*"
           '=ý  '# And join the stack by "=" (with the input we triplicated at the start)
                 # (after which the result is output implicitly)
Kevin Cruijssen
quelle
1Kstatt funktionieren soll `≠ iy in der Schleife.
Emigna
@Emigna Ah lol .. Ich mache das tatsächlich in meiner Gelee-Antwort, die ich gerade gepostet habe . Ich bin nicht sicher, warum ich hier nicht früher darüber nachgedacht habe. :)
Kevin Cruijssen
Disqualifiziert, da Ihre Sprache erstellt wurde, nachdem diese Aufgabe veröffentlicht wurde.
FUZxxl
1

APL (NARS), 66 Zeichen, 132 Byte

{(⍕⍵),'=',3↓∊{m←' * ',⍕↑⍵⋄1=w←2⊃⍵:m⋄m,'^',⍕w}¨v,¨+/¨{k=⍵}¨v←∪k←π⍵}

Test und Kommentar:

  f←{(⍕⍵),'=',3↓∊{m←' * ',⍕↑⍵⋄1=w←2⊃⍵:m⋄m,'^',⍕w}¨v,¨+/¨{k=⍵}¨v←∪k←π⍵}
  f 131784
131784=2^3 * 3 * 17^2 * 19
  f 2
2=2
  f (2*32)
4294967296=2^32

{(⍕⍵),'=',3↓∊{m←' * ',⍕↑⍵⋄1=w←2⊃⍵:m⋄m,'^',⍕w}¨v,¨+/¨{k=⍵}¨v←∪k←π⍵}
k←π⍵      find the factors with repetition of ⍵ and assign that array to k example for 12 k is 2 2 3
v←∪       gets from k unique elements and put them in array v
+/¨{k=⍵}¨ for each element of v count how many time it appear in k (it is array exponents)
v,¨       make array of couples from element of v (factors unique) and the array above (exponents unique)
∊{m←' * ',⍕↑⍵⋄1=w←2⊃⍵:m⋄m,'^',⍕w}¨ pretty print the array of couples factor exponent as array chars
3↓                                 but not the first 3 chars
(⍕⍵),'='  but print first the argument and '=' in char format

Wenn jemand viel Zeit mit diesen Primitiven hat, kenne sie sehr gut. Für mich ist es möglich, dass der Code klarer von Kommentaren ist. Also ist der Code klarer als Kommentare, Kommentare unbrauchbar.

RosLuP
quelle
0

JavaScript, 107

n=prompt()
s=n+'='
c=0
for(i=2;;){if(n%i<1){c++
n/=i}else{if(c)s+=i+'^'+c+'*'
c=0
if(++i>n)break}}
alert(s)

120

n=prompt()
o={2:0}
for(i=2,c=n;i<=c;)!(c%i)?++o[i]?c/=i:0:o[++i]=0
s=n+'='
for(i in o)s+=o[i]?i+'^'+o[i]+'*':''
alert(s)
zzzzBov
quelle
1
Hat einen Fehler *in der Ausgabe und gibt den Exponenten aus, auch wenn es 1 ist.
Ventero
Sie müssen nicht abstimmen. Es gibt nirgends etwas, das besagt, dass der Exponent nicht gedruckt werden kann, wenn er 1 ist. Außerdem wird beim Nachziehen *davon ausgegangen, dass er mit multipliziert wird 1. Wenn es ein so großes Problem ist, werde ich es beheben.
zzzzBov
1
»Im folgenden Format« in der Aufgabenbeschreibung impliziert ziemlich genau, dass ein Exponent von 1nicht gedruckt werden sollte. Und nein, ein Trailing *ist auch dagegen. Wenn man das Ausgabeformat so frei wählen könnte, dann factor(1)wäre es am einfachsten , wenn man es herausschält . Antworten können nur sinnvoll verglichen werden, wenn sie alle das gleiche Problem lösen.
Joey
3
Als Urheber dieser Aufgabe sage ich, dass die Exponenten weggelassen werden müssen, wenn 1 und nur Primzahlen Faktoren sein können.
FUZxxl
0

PHP , 112 Bytes

<?=$a=$argn,"=";for($i=2;1<$a;)$a%$i?$i++:$a/=$i+!++$r[$i];foreach($r as$k=>$v)echo$t?"*":!++$t,$v<2?$k:"$k^$v";

Probieren Sie es online!

Jörg Hülsermann
quelle
0

PHP, 93 Bytes

<?=$n=$argn;for($i=2;$n>1;$k&&$p=print($p?"*":"=")."$i^$k",$i++)for($k=0;$n%$i<1;$n/=$i)$k++;

Ich könnte 89 Bytes mit PHP 5.5 (oder neuer) machen, aber das verzögert die Herausforderung um mehr als 2 Jahre:

<?=$n=$argn;for($i=2;$n>1;$k&&$p=print"=*"[$p]."$i^$k",$i++)for($k=0;$n%$i<1;$n/=$i)$k++;

Laufen Sie als Pipe mit -nFoder probieren Sie sie online aus .

Titus
quelle