ค้นหาปัจจัยสำคัญ


23

ในงานนี้คุณต้องเขียนโปรแกรมที่คำนวณปัจจัยสำคัญของตัวเลข อินพุตเป็นตัวเลขธรรมชาติ 1 <n <2 ^ 32 ผลลัพธ์คือรายการของตัวประกอบสำคัญของตัวเลขในรูปแบบต่อไปนี้ ต้องละเว้นเลขยกกำลังหากเป็น 1 เฉพาะจำนวนเฉพาะ (สมมติว่าอินพุตคือ 131784):

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

ไม่จำเป็นต้องใช้ช่องว่างในจำนวนที่เท่ากัน ช่องว่างอาจถูกแทรกตามความเหมาะสม โปรแกรมของคุณควรเสร็จสิ้นภายในเวลาไม่เกิน 10 นาทีสำหรับอินพุตใด ๆ โปรแกรมที่มีจำนวนอักขระสั้นที่สุดชนะ


9
คะแนนโบนัสหากโปรแกรมของคุณสามารถแยกปัจจัยได้ 68575999143494039776547449671727581799041142646129473261274770670770770770770770770770770707070707075757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575909090909090 คะแนนที่ได้รับคะแนนโบนัสหากโปรแกรมของคุณสามารถแยกปัจจัย
Joey Adams

@Joey Adams: การแยกตัวประกอบเริ่มด้วย 17 * 71 * 113 * 997 * 313597 ...
FUZxxl

3
@FUZxxl: ฉันคิดว่าคุณทำผิดพลาดในการคัดลอกหมายเลข มันเป็นผลิตภัณฑ์สองจำนวนเฉพาะที่มีขนาดใหญ่
Joey Adams

@ โจอี้เราสามารถใช้อัลกอริทึมของชอร์ได้หรือไม่?
Mateen Ulhaq

23
@ โจอี้ฉันบังเอิญดื่มกาแฟผ่านคอมพิวเตอร์ควอนตัมของฉันโดยไม่ตั้งใจและเพื่อนของฉันใช้เขาเพื่อ "แฮ็คเข้าสู่รัฐบาลสหรัฐฯ" หรือบางสิ่งที่ไม่สำคัญดังนั้นไม่ :(
Mateen Ulhaq

คำตอบ:


11

SageMath, 31 ไบต์

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

กรณีทดสอบ: 83891573479027823458394579234582347590825792034579235923475902312344444 เอาท์พุท:

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


ขอแสดงความยินดีกับการชนะการท้าทายด้วยโพสต์แรกของคุณทำงานดีมาก! และยินดีต้อนรับสู่เว็บไซต์!
DJMcMayhem

8

ทับทิม 1.9 74 70 ตัวอักษร

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

การแก้ไข:

  • (74 -> 70) เพียงใช้เลขชี้กำลังเป็นความยาวส่วนแทนที่จะตรวจสอบอย่างชัดเจน exponent > 1

7

Perl 5.10, 73 88

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

ใช้หมายเลขอินพุตจากอินพุตมาตรฐาน จะคำนวณปัจจัยสำหรับอินพุตหลายรายการหากระบุไว้

perl -eนับเป็นความแตกต่างไป 5.10 เป็นสิ่งจำเป็นสำหรับตัว\Kบ่งชี้ regex


+1 factorสำหรับใช้
st0le

คุณไม่ควรนับ pตัวเลือก?
Joey

@ โจอี้แน่นอนฉันควร ขอโทษสำหรับเรื่องนั้น. แก้ไข
JB

ยังไม่ได้ทดสอบสิ่งนี้ แต่แทนที่จะsplit/\D/,~factor $_~;$_="@_";เขียนได้$_=~factor $_~;s/\D/ /g;ไหม (แน่นอนแทนที่~ด้วย backtick.)
Timwi

คุณหมายถึง$_=`factor $_`;s/\D/ /g;อะไร การเข้ารหัส backtick คู่ช่วย
aaaaaaaaaaaa

5

OCaml, 201 ตัวอักษร

การแปลโดยตรงของรหัส Python ที่ดีที่สุด:

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

ตัวอย่างเช่น,

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

(หมายเหตุที่ผมเคยมองข้ามเอาท์พุท endline สุดท้าย.) เพียงเพื่อความสนุกสนานที่ 213 ตัวอักษรเป็นอย่างหมดจดรุ่นที่ทำงาน, ที่ยุ่งเหยิงอย่างทั่วถึงผ่านการใช้เสรีนิยมของผู้ประกอบการ:

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

5

งูหลาม, 140 135 133 ตัวอักษร

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:]

ฉันคิดว่าเอาต์พุตต้องการช่องว่างเพิ่มเติมเช่น' * %d'... และอีกสองสิ่ง: 65536 == 4**8; บรรทัดที่ 7:if e:s+='*%d'%f+'^%d'%e*(e>1)
Oleh Prypin

@BlaXpirit: "ไม่จำเป็นต้องใช้ช่องว่างในจำนวนเดียวกัน" ขอบคุณสำหรับอีกสองฉันจะรวมพวกเขา
Keith Randall

5

J, 72

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

โดยทั่วไปเจตัวละครสองตัวที่จะทำส่วนใหญ่ทำงานหกสิบตัวเพื่อนำเสนอ

แก้ไข:แก้ไขจำนวนตัวอักษร


2
ดูเหมือนฉันจะไม่เหมือน 62 ตัวอักษร แม้จะสมมติว่า161784เป็นอินพุตของคุณ แต่ก็ยังมีอักขระ 72 ตัว
Ventero

มันจะสั้นลง|: __ q: yไหม?
Eelvex

2
@Ventero: JB ทั่วไป สองชั่วโมงในการตีสิ่งที่สาปแช่งสิบห้าวินาทีในการนับตัวละคร
JB

5

J, 53 52 ตัวอักษร

โซลูชันนี้ใช้rplcเคล็ดลับจากโซลูชันของrandomraแต่เกิดขึ้นกับแนวคิดดั้งเดิมบางอย่างเช่นกัน

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

ในรูปแบบที่ไม่ใช่โดยนัยฟังก์ชันนี้จะกลายเป็น

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

โดยgนิยามว่าเป็น

g =: 3 : 0
": {. y) , '^' , (": # y) , '*'
)
  • q: yเป็นเวกเตอร์ของปัจจัยสำคัญyของ ยกตัวอย่างเช่นอัตราผลตอบแทนq: 602 2 3 5
  • x u/. yนำuไปใช้กับy คีย์โดยxนั่นคือuถูกนำไปใช้กับเวกเตอร์ขององค์ประกอบyที่มีรายการxเท่ากัน นี้เป็นบิตที่ซับซ้อนที่จะอธิบาย แต่ในกรณีพิเศษy u/. yหรือu/.~ y, uถูกนำไปใช้เวกเตอร์ขององค์ประกอบที่แตกต่างกันในแต่ละที่แต่ละองค์ประกอบซ้ำได้บ่อยตามที่ปรากฏในy yตัวอย่างเช่น</.~ 1 2 1 2 3 1 2 2 3ผลผลิต

    ┌─────┬───────┬───┐
    │1 1 1│2 2 2 2│3 3│
    └─────┴───────┴───┘
    
  • # yเป็นคะแนนของy, ที่อยู่, yหมายเลขของสินค้าใน

  • ": y รูปแบบ yเป็นสตริง
  • x , y ผนวก xและy.
  • {. yเป็นหัวหน้า yนั่นคือรายการแรกของมัน
  • ดังนั้นจัด(": {. y), '^' , (": # y) , '*'รูปแบบเวกเตอร์ของการทำซ้ำnของตัวเลขkเป็นสตริงของรูปแบบk ^ n * วลีนี้เป็นสัญลักษณ์โดยปริยาย:@{.,'^','*',~":@#ซึ่งเราส่งผ่านไปยังคำวิเศษณ์ที่/.อธิบายไว้ข้างต้น
  • x rplc yฟังก์ชั่นห้องสมุดแทนที่ตัวละคร yมีรูปแบบa ; bและตัวอย่างของสตริงทุกaในจะถูกแทนที่ด้วยx ถูก ravelled (นั่นคือถูกเปลี่ยนโฉมใหม่เช่นที่มีอันดับ 1) ก่อนที่จะดำเนินการซึ่งจะใช้ที่นี่ รหัสนี้จะแทนที่ด้วยเพื่อให้สอดคล้องกับรูปแบบผลลัพธ์ที่ได้รับคำสั่งbx^1**
  • }: yคือการกำจัดของyนั่นคือทั้งหมดยกเว้นรายการสุดท้าย *นี้จะใช้ในการลบต่อท้าย

คุณไม่สามารถบันทึกงานจำนวนมากโดยใช้__ q:หรือไม่ ลองออนไลน์!
Adám

@ Adámแน่นอนความคิดที่ดี!
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;}}

3

Python 119 ตัวอักษร

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:]

1
นั่นคือสิ่งที่ฉันพยายามก่อน แต่มันช้าเกินไปสำหรับช่วงเวลาที่ยิ่งใหญ่เช่น 4294967291
Keith Randall

@ Keith คำถามนี้ใช้เวลาไม่เกิน 10 นาที กรณีนี้จะใช้เวลานานกว่า 10 นาทีหรือไม่
fR0DDY

2
หมายเลขนั้นใช้เวลา 32 นาทีในเครื่องของฉัน
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))

3

Perl, 78

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

มันใช้คุณสมบัติ s /// r ของ Perl 5.14 เพื่อกำจัด ^ 1s 81 ตัวอักษรที่จะใช้ในการวนซ้ำ:

perl -Mntheory=:all -nE 'chomp;say join" * ",map{(join"^",@$_)=~s/\^1$//r}factor_exp($_);'

คุณสามารถเว้นช่องว่างได้หากต้องการ วิธีนี้จะช่วยประหยัดอักขระสองตัว ทางออกที่ดี!
FUZxxl

2

PHP, 236 ตัวอักษร

$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);

เอาต์พุตสำหรับ 131784: 2 ^ 3 * 3 * 17 ^ 2 * 19

เสร็จสิ้นตัวเลขทั้งหมดภายในไม่กี่วินาทีในขณะที่การทดสอบ

4294967296=2^32
Time: 0.000168

อินพุตไม่เคยถูกระบุดังนั้นฉันเลือกที่จะเรียกมันโดยใช้อาร์กิวเมนต์บรรทัดคำสั่ง

php factorize.php 4294967296

2

สกาลา 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 ("", "*", "")

2

J, 74 ตัวอักษร

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

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

64 chars พร้อมอินพุตในตัวแปร x :

   x=.131784

   (":x),'=',' '-.~('^1 ';'')rplc~}:,,&' *'"1(,'^'&,)&":/"{|:__ q:x
131784=2^3*3*17^2*19

หากคุณจัดการที่จะทำให้สิ่งนี้กลายเป็นคำนิยามโดยปริยายคุณสามารถหลีกเลี่ยงการหลีกเลี่ยงการพูดทั้งหมด คุณยังสามารถใช้การ3 : 0กำหนด
FUZxxl

@FZZxxl ฉันคาดว่าฉันสามารถใส่สตริงที่ไม่ใช้ค่า Escape ใน3 : 0เวอร์ชัน แต่ไม่ได้ผลเลย ฉันอาจลองโดยปริยายภายหลัง นี้เป็น 3: 0 ฉันพยายาม: pastebin.com/rmTVAk4j
randomra

มันควรจะทำงาน ฉันไม่เห็นว่าทำไม คุณตั้งชื่อข้อโต้แย้งของคุณyตามที่ควรจะเป็นหรือไม่?
FUZxxl

@FUZxxl นี้เป็น 3: 0 ฉันพยายาม: pastebin.com/rmTVAk4j
Randomra

3: 0 ที่คุณพยายามไม่ตรงกับสายการบินเดียวที่คุณให้ มันใช้''แทนa:ในที่เดียว อาจจะเป็นความแตกต่าง?
FUZxxl

2

Java 10, 109 108 bytes (ฟังก์ชั่นแลมบ์ดา) (ไม่สามารถแข่งขันกับการร้องขอของ 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;}

ลองออนไลน์

Java 6+, 181 ไบต์ (โปรแกรมเต็มรูปแบบ)

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);}}

ลองออนไลน์

-1 ไบต์ขอบคุณ@ceilingcat @ceilingcat

คำอธิบาย:

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

@ceilingcat ขอบคุณ!
Kevin Cruijssen

ตัดสิทธิ์เนื่องจาก Java 10 ถูกสร้างขึ้นหลังจากงานนี้ถูกเผยแพร่
FUZxxl

@FUZxxl ฉันได้ทำเครื่องหมายชวา 10 แลมบ์ดาเป็นที่ไม่ใช่การแข่งขันและเพิ่ม Java 6 โปรแกรมซึ่งได้รับการปล่อยตัวในธันวาคม 2006
Kevin Cruijssen

โอเคเยี่ยมเลย นั่นเหมาะกับฉัน!
FUZxxl

2

Japt , 28 27 26 ไบต์

-1 ไบต์ขอบคุณ Shaggy

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

ลองมัน


ตัดสิทธิ์เนื่องจากภาษาของคุณถูกสร้างขึ้นหลังจากเผยแพร่งานนี้แล้ว
FUZxxl


ไม่อนุญาตให้ย้อนกลับเมื่อมีการโพสต์ความท้าทาย ฉันคิดว่ามันไม่ยุติธรรมที่จะแก้ไขกฎของความท้าทายหลังจากโพสต์ความท้าทายดังนั้นภาษาที่เผยแพร่หลังจากความท้าทายนี้ยังคงผิดกฎหมาย
FUZxxl

1
@FUZxxl คุณไม่ต้องยอมรับคำตอบของฉัน แต่ฉันได้รับอนุญาตให้ตอบโดยไม่คำนึงถึง
Oliver


1

Powershell, 113 97 ไบต์

แรงบันดาลใจจากโจอี้ คำตอบ มันช้า แต่สั้น

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

สคริปต์ทดสอบที่อธิบาย:

$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

เอาท์พุท:

2
2*3^2*7
3*43
2^5*5*7^2*11

1

เยลลี่ขนาด 16 ไบต์ (ไม่ใช่แบบแข่งขันสำหรับการขอ OP)

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

หนึ่งในคำตอบสำหรับเยลลี่แรกของฉันดังนั้นสามารถเล่นกอล์ฟได้อย่างแน่นอน (โดยเฉพาะ³”=³)

ลองออนไลน์

คำอธิบาย:

³                 # 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)

ตัดสิทธิ์เนื่องจากภาษาของคุณถูกสร้างขึ้นหลังจากงานนี้ถูกเผยแพร่
FUZxxl

@FUZxxl ตั้งแต่กลางปี ​​2017 การแข่งขันที่ไม่ได้อยู่ในเมตาอีกต่อไปเว้นแต่ความท้าทายอย่างชัดเจนระบุว่าภาษาควรจะเก่ากว่าเวลาโพสต์ แต่ถ้าคุณเป็นคนหนึ่งที่โพสต์ Chooses (non-competing)ความท้าทายที่จะไม่อนุญาตให้มีภาษาใหม่กว่าความท้าทายที่โพสต์วันที่ของคุณผมจะแก้ไขคำตอบของฉันที่จะเพิ่มอย่างชัดเจน :)
Kevin Cruijssen

ฉันเชื่อว่าฉันทามติเว็บไซต์ที่เกิดขึ้นเมื่อมีการโพสต์ความท้าทายนี้ควรกำหนดกฎสำหรับคำตอบ ทุกอย่างอื่น (เช่นกฎที่เปลี่ยนแปลงหลังจากการโพสต์ความท้าทาย) จะไม่ยุติธรรม โปรดทำเครื่องหมายคำตอบของคุณว่าไม่ใช่การแข่งขัน
FUZxxl

@FUZxxl ฉันทำเครื่องหมายคำตอบของฉันว่าไม่ใช่การแข่งขันตามที่ร้องขอ
Kevin Cruijssen

ขอขอบคุณสำหรับความช่วยเหลือของคุณ.
FUZxxl

1

05AB1E , 22 20 ไบต์ (ไม่ใช่การแข่งขันตามคำขอของ OP)

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

-2 ไบต์ขอบคุณที่@Emigna

ลองออนไลน์

คำอธิบาย:

Ð                # 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)

1Kควรทำงานแทน`≠ iyในลูป
Emigna

@Emigna อาฮ่า ๆ .. ฉันทำจริงว่าในคำตอบของวุ้นของฉันฉันเพิ่งโพสต์ ไม่แน่ใจว่าทำไมฉันไม่คิดเรื่องนี้ก่อนหน้านี้ :)
Kevin Cruijssen

ตัดสิทธิ์เนื่องจากภาษาของคุณถูกสร้างขึ้นหลังจากงานนี้ถูกเผยแพร่
FUZxxl

1

APL (NARS), 66 ตัวอักษร, 132 ไบต์

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

ทดสอบและแสดงความคิดเห็น:

  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

หากใครบางคนมีเวลากับดั้งเดิมเหล่านี้รู้ว่าพวกเขาเป็นอย่างดีสำหรับฉันมันเป็นไปได้ว่ารหัสเป็นที่ชัดเจนของความคิดเห็น ... ดังนั้นรหัสที่ชัดเจนมากขึ้นกว่าความคิดเห็นแสดงความคิดเห็นไม่สมควร ...


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)

1
Has a trailing * in the output and prints the exponent even if it's 1.
Ventero

no need to downvote. There's nowhere that said that it couldn't print the exponent if it's 1. Also, the trailing * assumes multiplying by 1. If it's that big an issue, I'll fix it.
zzzzBov

1
»in the following format« in the task description pretty much implies that an exponent of 1 should not be printed. And no, a trailing * is also against that. If one could choose the output format that freely, then shelling out to factor(1) would be the easiest one. Answers can only reasonably compared if they all solve the same problem.
Joey

3
As the creator of this task, I say, that the exponents have to be omitted if 1 and only prime-numbers can be factors.
FUZxxl


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++;

I could do 89 bytes with PHP 5.5 (or later), but that postdates the challenge by more than 2 years:

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

Run as pipe with -nF or try them online.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.