주요 요인 찾기


23

이 작업에서는 숫자의 소인수를 계산하는 프로그램을 작성해야합니다. 입력은 자연수 1 <n <2 ^ 32입니다. 출력은 다음 형식의 숫자의 주요 요소 목록입니다. 지수는 1 인 경우 생략해야합니다. 소수만 출력하십시오. (입력이 131784라고 가정) :

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

같은 양의 공백을 사용할 필요는 없습니다. 적절한 곳에 공백을 삽입 할 수 있습니다. 모든 입력에 대해 10 분 이내에 프로그램을 완료해야합니다. 문자 수가 가장 적은 프로그램이 승리합니다.


9
프로그램이 6857599914349403977654744967172758179904114264612947326127169976133296980951450542789808884504301075550786464802304019795402754670660318614966266413770127를 고려할 수있는 경우 보너스 포인트!
Joey Adams

@Joey Adams : 인수 분해는 17 * 71 * 113 * 997 * 313597로 시작합니다 ...
FUZxxl

3
@ FUZxxl : 번호를 잘못 복사 한 것 같습니다. 두 개의 큰 소수결과물입니다 .
Joey Adams

@Joey Shor의 알고리즘을 사용할 수 있습니까?
Mateen Ulhaq

23
@Joey 나는 실수로 내 양자 컴퓨터에 커피를 쏟았고, 친구는 "미국 정부를 해킹"하거나 중요하지 않은 것을 사용하고 있습니다. :(
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

펄 5.10, 73 88

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

표준 입력에서 입력 번호를 가져옵니다. 제공된 경우 여러 입력에 대한 계수를 계산합니다.

의 차이로 계산되었습니다 perl -e. \K정규식 메타 문자 에는 5.10이 필요합니다 .


사용하는 일 factor.
st0le

p옵션 을 세지 말아야합니까 ?
Joey

@Joey는 정말로해야한다. 미안합니다. 고정.
JB

이것을 테스트하지 않았지만 대신 split/\D/,~factor $_~;$_="@_";쓸 수 $_=~factor $_~;s/\D/ /g;있습니까? (물론 ~백틱으로 대체하십시오 .)
Timwi

당신은 의미 $_=`factor $_`;s/\D/ /g;합니까? 듀얼 백틱 엔케이 싱이 도움이됩니다.
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 = ()

(마지막 끝을 출력하는 것을 생략했습니다.) 재미있게, 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:]

I 출력이 좀 더 공간, 예를 들어 필요 생각 ' * %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

전형적인 J. 대부분의 작업을 수행 할 수있는 두 개의 문자,이를 나타내는 60 자.

편집 : 문자 수를 수정했습니다.


2
이것은 나에게 62 자처럼 보이지 않습니다. 161784입력이 있다고 가정하더라도 여전히 72 자입니다.
Ventero

더 짧지 |: __ q: y않습니까?
Eelvex

2
@ 벤 테로 : 전형적인 JB. 2 시간 동안 망가진 물건을 골프에 타기 위해 15 초가 걸렸다.
JB

5

J, 53 52 자

이 솔루션은 randomrarplc 의 솔루션 에서 트릭을 취하지 만 독창적 인 아이디어도 제공합니다.

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

비 암묵적인 표기법에서이 기능은

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

어디로 g정의

g =: 3 : 0
": {. y) , '^' , (": # y) , '*'
)
  • q: y소인수 의 벡터 입니다 y. 예를 들어 q: 60yields 2 2 3 5입니다.
  • x u/. yuy 입력 하는 데 적용됩니다 x. 즉, 의 항목 이 동일한 u요소의 벡터에 적용됩니다 . 이를 설명하기 위해 약간 복잡하지만, 특별한 경우 나 , 의 고유 벡터의 각 요소에 적용되는 각 구성 요소는 종종 나타나는 것처럼 반복된다 . 예를 들어 수확량yxy u/. yu/.~ yuyy</.~ 1 2 1 2 3 1 2 2 3

    ┌─────┬───────┬───┐
    │1 1 1│2 2 2 2│3 3│
    └─────┴───────┴───┘
    
  • # y는 IS 집계y이다, 항목의 수 y.

  • ": y y문자열로 형식화 합니다.
  • x , y 추가 x 하고 y.
  • {. y는 IS 머리 y 이며, 그 첫 번째 항목.
  • 따라서, 숫자 k(": {. y), '^' , (": # y) , '*'n 반복의 벡터를 k ^ n * 형식의 문자열로 포맷합니다 . 암묵적인 표기법으로 표현 된이 구절은 위에 언급 된 부사에 전달됩니다 .:@{.,'^','*',~":@#/.
  • x rplc y라이브러리 함수 는 문자를 대체합니다. y형식이 a ; b문자열의 모든 인스턴스 ax의해 대체된다 b. x여기서는 사용되기 전에 래블 링되고 (즉, 순위가 1이되도록 형태가 변경됨) 여기서 사용됩니다. 이 코드는 대체 ^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

파이썬 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

자바 스크립트, 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

펄, 78

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

^ 1을 제거하기 위해 Perl 5.14의 s /// r 기능을 사용합니다. 루프에서 실행할 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("", "*", "")

언 골프 :

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 자 x:

   x=.131784

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

이것을 암묵적 정의로 바꾸면 모든 따옴표를 피할 수 있습니다. 3 : 0정의를 사용할 수도 있습니다 .
FUZxxl

@FUZxxl 나는 3 : 0버전 에서 이스케이프 처리되지 않은 문자열을 넣을 수 있다고 예상 했지만 어떻게 든 작동하지 않았습니다. 그래도 나중에 암묵적으로 시도 할 수 있습니다. 이것은 내가 시도한 3 : 0입니다 : pastebin.com/rmTVAk4j .
randomra

작동해야합니다. 왜 그런지 모르겠습니다. y당신이해야 할대로 당신 의 주장의 이름을 말했습니까 ?
FUZxxl

@FUZxxl 이것은 시도한 3 : 0입니다 : pastebin.com/rmTVAk4j .
randomra

시도한 3 : 0이 제공 한 1 라이너와 정확히 일치하지 않습니다. 한곳에서 ''대신 사용 합니다 a:. 아마도 그 차이일까요?
FUZxxl

2

Java 10, 109 108 바이트 (람다 함수) (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);}}

온라인으로 사용해보십시오.

@ceilingcat 덕분에 -1 바이트 .

설명:

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 Java 10 람다를 비경쟁으로 표시하고 2006 년 12 월릴리스 된 Java 6 프로그램을 추가했습니다 .
Kevin Cruijssen

좋아. 그것은 나를 위해 작동합니다!
FUZxxl

2

apt , 28 27 26 바이트

Shaggy 덕분에 -1 바이트

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

시도 해봐


이 작업이 게시 된 후 언어가 생성되어 실격되었습니다.
FUZxxl


챌린지가 게시 될 때 다시 허용되지 않았습니다. 챌린지가 게시 된 후에 챌린지 규칙을 수정하는 것은 불공평 한 것으로 간주되므로이 챌린지 후에 게시 된 언어는 여전히 불법입니다.
FUZxxl

1
@FUZxxl 당신은 나의 대답을 받아 들일 필요는 없지만, 나는 그것에 관계없이 대답 할 수 있습니다.
올리버


1

파워 쉘, 113 97 바이트

Joey의 답변에서 영감을 얻었습니다 . 느리지 만 짧습니다.

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

Jelly , 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 년 중반 이래로 언어가 게시 시점보다 오래되어야한다고 명시 적으로 언급하지 않는 한 비경쟁은 더 이상 메타 에 있지 않습니다 . 그러나 챌린지를 게시 한 사람이 챌린지 날짜 이후의 새로운 언어를 허용하지 않기로 선택한 경우, 답변을 편집하여 명시 적을 추가합니다 (non-competing). :)
Kevin Cruijssen

이 챌린지가 게시 될 때 진행된 사이트 합의가 답변 규칙을 정의해야한다고 생각합니다. 다른 모든 것 (즉, 챌린지가 게시 된 후 변경되는 규칙)은 불공평합니다. 답변을 비경쟁으로 표시하십시오.
FUZxxl

@FUZxxl 요청에 따라 답변을 비경쟁으로 표시했습니다.
Kevin Cruijssen

도와 주셔서 감사합니다.
FUZxxl

1

05AB1E , 22 20 바이트 (OP 요청시 비경쟁)

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

@Emigna 덕분에 -2 바이트 .

온라인으로 사용해보십시오.

설명:

Ð                # 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 Ah lol .. 실제로 제 젤리 답변으로 방금 게시했습니다 . 내가 왜 여기에서 생각하지 않았는지 모르겠습니다. :)
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

자바 스크립트, 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
*출력 이 후행 이고 지수가 1 인 경우에도 지수를 인쇄합니다.
Ventero

공감할 필요가 없습니다. 지수가 1이면 지수를 인쇄 할 수 없다고 말한 곳이 없습니다. 또한 후행에는을 *곱한 것으로 가정합니다 1. 그렇게 큰 문제라면 해결하겠습니다.
zzzzBov

1
작업 설명에서»다음 형식으로«는 지수 1가 인쇄되지 않아야 함을 의미합니다 . 그리고, 후행 *도 반대입니다. 출력 형식을 자유롭게 선택할 수 있다면 factor(1)가장 쉬운 방법으로 셸을 만들 수 있습니다. 답이 모두 같은 문제를 해결하는 경우에만 답을 합리적으로 비교할 수 있습니다.
Joey

3
이 작업을 만든 사람으로서, 1과 소수만 요소가 될 수 있다면 지수는 생략해야한다고 말합니다.
FUZxxl


0

PHP, 93 바이트

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

PHP 5.5 (또는 이상)로 89 바이트를 할 수 있지만 2 년이 넘게 도전 과제가 있습니다.

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

파이프로 실행 -nF하거나 온라인으로 사용해보십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.