두 수의 최대 공약수의 소인수 분해를 인쇄합니다


17

제목은 모든 것을 말합니다. 2 개의 입력 32 비트 양의 정수 로 소수 인수 형태로 m, n >= 2출력 gcd(m,n)됩니다.

입력

골프에 더 좋은 것은 명령 줄 args 또는 stdin의 1 줄입니다.

산출

지수로 구분 된 단일 공백 ​​(추가 공백 없음). 입력이 상대적으로 소수이면 아무것도 출력하지 않습니다.

예 :

$ ./factorize 96 162
2^1 3^1

$ ./factorize 14 15


$ ./factorize 196 294
2^1 7^2

규칙

  • 인수 분해 또는 GCD에 외부 리소스, 수학 라이브러리 또는 내장 함수를 사용할 수 없습니다. 예 : 자바, 아니 java.lang.Math. 루비, 아니오 prime_division, 펄, 아니오 factor

1
어떤 결과를 찾고 gcd(n,m) == 1있습니까?
undergroundmonorail

예외로 종료해도 괜찮습니까? 몇 바이트를 절약 할 수 있습니다.
undergroundmonorail

사실, 나는 접근 방식을 변경했으며 예외없이 종료 할 필요가 없습니다. 그러나 다른 사람들은 알고 싶어 할 것입니다.
undergroundmonorail

예외없이 종료하지 마십시오. 아무것도 출력하지 :)
durron597

기술적으로 q:a+.b또는 __ q:a+.bJ에서는 no를 사용 external resources or math libraries하지만 질문의 정신에서 너무 멀기 때문에 게시하지 않습니다. 방금 공유하겠다고 생각했습니다.
ɐɔıʇǝɥʇuʎs

답변:


10

파이썬 3 255 250 237 226 188 180 개 150 142 137 136 문자

a,b=map(int,input().split())
t,g='',1
while g<a:
 g,p=g+1,0
 if a%g+b%g<1:
  while a%g+b%g<1:a/=g;b/=g;p+=1
  t+='%d^%d '%(g,p)
print(t)

물건을 건너 뛰는 것만 으로이 길이를 얼마나 줄일 수 있는지 놀랍습니다 (gcd 찾기). 또한 stdin에서 읽는 대신 다른 답변과 같이 2 개의 정수를 기대하는 함수로 만들어 10 문자를 더 줄일 수 있습니다.


이것은 강렬하다! 나는 당신의 편집 내용을보고 당신을 이길려고 많은 것을 배우고 있습니다. 나는 당신이 이것을 가지고 있다고 생각합니다 (Python 답변 중)
Rainbolt

1
당신은 변경하여 1 개 문자를 저장할 수 while g<a and g<b:while(g<a)*(g<b):
Rainbolt

@Rusher 고마워 친구! 당신의 대답은 더 열심히이 :)에 또한 당신이 알아낼 내게 영감을 추천 트릭 일을 나에게 동기를 부여하는 일입니다 a%g+b%g비트

else 절이 필요하다고 생각하지 않습니다. 내가 빠진 것이 아니라면 else:g+=1그냥 될 수 있습니다 g+=1.
isaacg

@isaacg 당신이 옳은 것 같습니다, 감사합니다!
Tal

8

루비- 168 117 114 101 100 97

편집 : 그것에 대해 생각한 후, 요인의 우선 성이 인수 분해 루프에서 처리되기 때문에 체가 필요하지 않다는 것을 깨달았습니다. 또한 다른 사람들의 답변 ( laindirTal 은 내가 본 것 중 하나이지만 다른 사람들도 그렇게 한 것처럼 보임)에 의해 알 수 있듯이 별도의 gcd 계산이 제거되었습니다.
편집 2 : 필요하지 않습니다 do.
편집 3 : 더 짜내십시오.
편집 4 : 하나 이상의 공간을 꺼 냈습니다.
편집 5 : upto대신 each; ?^ == "^"!

a,b=ARGV.map{|i|i.to_i}
2.upto(a){|d|c=0
[c+=1,a/=d,b/=d]while a%d+b%d<1
print d,?^,c," "if c>0}

출력 (편집 후 동일) :

$ ruby factorize.rb 96 162
2^1 3^1 
$ ruby factorize.rb 14 15

$ ruby factorize.rb 196 294
2^1 7^2 

확실히 더 나아질 수는 있지만 첫 번째 것은 나쁘지 않습니다.


로 변경 map{|i|i.to_i}하여 4 바이트를 제거 할 수 있습니다 map &:to_i. 파일 끝에서 줄 바꿈을 계산하지 않으면 5 번째 바이트를 제거 할 수 있습니다. 루비는 그것없이 작동합니다.
kernigh

또한 $*대신에 사용할 수 있습니다 ARGV.
daniero

6

파이썬 2 - 254 252 196 185 156 151 134 126 121

i=1
a,b=map(int,raw_input().split())
while b:a,b=b,a%b
while~-a:
 i+=1;j=0
 while a%i<1:j+=1;a/=i
 if j:print`i`+'^'+`j`,

통역사

반복

입력 예-stdin

100 50

출력 예-stdout

2 ^ 1 5 ^ 2


1
무엇에 대해 …`a`+'^'+`f.count(a)`…?
Ry-

꽤 깨끗합니다. 좋아요
qwr

@qwr 감사합니다. 다른 Python 답변 String 형식을 이해하고 몇 가지 문자를 면도 할 수 있기를 바랍니다.
Rainbolt

스왑 f.append(i)에 대한 f+=[i]5 개 문자를 저장합니다.
Nolen Royalty

1
그리고 지금 당신은 전혀 f를 사용할 필요가 없습니다 : p (왜 f=''여전히 거기에 있습니까?)
Nolen Royalty

4

자바- 184 (175)

이것은 @Geobits (및 약간의 @Tal의 답변) 답변에서 영감을 얻었지만 내 답변을 만들기로 결정한 것은 다릅니다.

class G{public static void main(String[]a){for(Integer i=1,q,n=i.valueOf(a[0]),m=i.valueOf(a[1]);m>=++i;System.out.print(q>0?i+"^"+q+" ":""))for(q=0;n%i+m%i<1;n/=i,m/=i)q++;}}

(인간 검증) 테스트 하네스가 포함 된 언 골프 (정렬) :

class G {
    public static void mainMethod(String[] a) {
        for (Integer i = 1, q, n = i.valueOf(a[0]), m = i.valueOf(a[1]); m >= ++i;
                 System.out.print(q > 0 ? i + "^" + q + " " : ""))
            for (q = 0; n % i + m % i < 1; n /= i, m /= i)
                q++;
    }

    public static void main(String[] a) {
        m(3, 3);
        m(196, 294);
        m(294, 196);
        m(14, 15);
        m(15, 14);
        m(96, 162);
        m(162, 96);
        m(300, 400);
        m(400, 300);
        m(100, 100);
        m(7, 7);
        m(4, 8);
    }

    public static void m(int one, int two) {
        mainMethod(new String[] { String.valueOf(one), String.valueOf(two) });
        System.out.println();
    }
}

4

dc, 96 바이트

?sbsa2sf[q]sk[lalf~lblf~szrlz+0<ksbsale1+selsx]ss[lfn[^]Plen[ ]P]sp[0selsxle0<plf1+dsflb!<w]dswx

한 줄의 표준 입력을 읽습니다. 출력은 개행으로 끝나지 않습니다. (편집 : 모든 인수 분해 후에 여분의 공간을 출력합니다. 다른 답변 중 일부는 공간을 자르지 만 그렇지 않습니다.)

예:

$ echo 301343045 421880263 | dc factorize.dc
1021^1 59029^1 $ 

주석이있는 코드 :

# dc(1) is a stack language, like Forth. Programs push values on the
# stack, then operate on them. For example, to calculate
#  (2 + 3) * (9 - 4)
# the dc code is
#  [2 3 + 9 4 - *]

# [?] reads a line of input.  We expect two integers >= 2.
# [sb sa] stores the integers in variables.
? sb sa     # a, b = two integers from input

# This program sucks common factors from a and b, looping for
# f = 2, 3, 4, 5, and so on.  This method only sucks prime factors,
# but wastes time when f is not prime.
2 sf        # f = 2

# Code in [...] does not run until the program calls it.

# k = code to break a loop
[
 q           # [q] breaks two levels of [...]
] sk        # k = break

# s = loop to suck factor f from a and b
#  This loop increments e, the exponent for factor f.
#  Please set e = 0 before entering this loop.
[
 # [la lf] puts ( a f ) on the stack.
 # [~] does division and remainder.
             # STACK:
 la lf ~     # ( a/f a%f )
 lb lf ~     # ( a/f a%f b/f b%f )

 # [r] swaps the top two stack values.
 # Hold z = b%f and swap a%f with b/f.
             # STACK:
 sz r lz     # ( a/f b/f a%f b%f )

 # f is a common factor if a%f and b%f are zero.  Because a and b are
 # non-negative, a%f and b%f are zero only if a%f+b%f is zero.
             # STACK:
 +           # ( a/f b/f a%f+b%f )

 # Call k to break loop unless a%f+b%f is zero.  [<k] conditionally
 # calls k if the comparison is true.  Comparisons in dc are
 # backwards, so [3 0 <k] would check 0 < 3.  Because a%f+b%f is never
 # negative, [0 <k] is golf for [0 !=k].
             # STACK:
 0 <k        # ( a/f b/f )

 # f is a common factor, so suck it!
 sb sa       # a = a/f, b = b/f, STACK: ( )
 le 1 + se   # increment e, the exponent for this factor
 ls x        # continue loop, [x] executes s
] ss        # s = loop

# p = code to print "f^e "
[
 # [n] prints a number without a newline.
 # [P] prints a string.
 lf n [^]P
 le n [ ]P

 # DEBUG: Uncomment to print a and b.
 #[(a = ]P la n [, b = ]P lb n [)]P 10P
] sp        # p = print

# w = loop to iterate factors
[
 # Call s loop to suck factor f from a and b, and set exponent e.
 0 se        # e = 0
 ls x        # call s loop

 # DEBUG: Uncomment [c] to clear the stack.  Loop s leaves two junk
 # values ( a/f b/f ) on the stack.  Deleting [c] for code golf saves
 # 1 byte but leaks junk on the stack.
 #c

 # Print "f^e " if 0 < e.  Comparisons in dc are backwards, so
 # [0 le <p] would check e < 0, [le 0 <p] checks 0 < e.
 le 0 <p

 # Increment f.  [d] duplicates top value on stack.
             # STACK:
 lf 1 +      # ( f+1 )
 d           # ( f+1 f+1 )
 sf          # ( f ) as f+1 becomes f

 # Continue loop if b >= f.  This is golf for f <= a and f <= b, as
 # extra iterations of the loop cause no harm.
             # STACK:
 lb          # ( f b )
 !<w         # ( ), continue loop if not b < f
] d sw      # w = loop; STACK: ( w )
x           # enter loop unconditionally; STACK: ( ) at entrance

3

PowerShell-82

$a,$b=$args
2..$a|%{$p=0;while(!($a%$_+$b%$_)){$a/=$_;$b/=$_;$p++}if($p){"$_^$p"}}

이것은 짧고 읽기 쉽습니다. 범위 2..$a를 Foreach-Object 루프로 파이프합니다 %{...}. 루프는의 값을 수집합니다 if($p){"$_^$p"}.
kernigh

3

JavaScript (ECMAScript 6 초안)-89 자

f=(m,n,i=2,k=0)=>(m%i|n%i?(k?i+'^'+k+' ':'')+(i>m?'':f(m,n,i+1)):f(m/i,n/i,i,k+1)).trim()

아래의 원래 (반복적) 답변을 재귀 답변으로 변환합니다.

설명

f=(m,n,i=2,k=0)=>           // A function with arguments m and n and optional arguments
                            // i (defaults to 2) and k (defaults to 0)
  (
    m%i|n%i                 // if i is not a divisor of m or n then:
      ?(k?i+'^'+k+' '       //   if k is non-zero append  "i^k " to the output
         :'')               //   else append nothing
        +(i>m?''            //   if i>m then terminate
             :f(m,n,i+1))   //   else increment i and reset k to 0
      :f(m/i,n/i,i,k+1)     // else divide m and n by i and increment k
  ).trim()                  // finally strip any extra spaces from the output.

반복 답변 : JavaScript (ECMASCript 6) -108 (또는 121) 98 자

버전 2 :

f=(m,n)=>{for(s='',i=1;++i<=m;s+=k?' '+i+'^'+k:'')for(k=0;m%i+n%i<1;k++)m/=i,n/=i;return s.trim()}

버전 1 :

원래 요청한대로 질문에 대답 :

f=(m,n)=>{for(o=[],i=2;i<=m;)m%i|n%i?i++:(m/=i,n/=i,o[i]=(o[i]|0)+1);return o.map((x,i)=>i+"^"+x).join(' ')}

또는 사실 후에 규칙 변경 사항을 준수하려면 다음을 수행하십시오.

f=(m,n)=>{for(o=[],i=2;i<=m;)m%i|n%i?i++:(m/=i,n/=i,o[i]=(o[i]|0)+1);return o.map((x,i)=>i+"^"+x).filter(x=>x).join(' ')}

설명

f=(m,n)=>                        // Create a function f with arguments m and n
{
  o=[]                           // Initialise an empty array for the output
  i=2                            // Start with a divisor of 2
  for(;i<=m;)                    // Loop while the divisor is not greater than m
    m%i|n%i                      // Test the bitwise OR of m%i and n%1 (i.e. whether
                                 // at least one is non-zero)
      ?i++                       // If m%i>0 or n%i>0 then increment i
      :(m/=i,                    // Otherwise: divide m by i;
        n/=i,                    //                   n by i;
        o[i]=(o[i]|0)+1);        // and add 1 to the i-th element of o
  return o.map((x,i)=>i+"^"+x)   // finally map the sparse array o to a sparse array
                                 // of the strings (index+"^"+value)
          .filter(x=>x)          // turn sparse array into non-sparse array
          .join(' ')             // then concatenate and return.
}

산출

f(96,162)
"2^1 3^1"

f(14,15)
""

f(80, 80)
"2^4 5^1"

f(196,294)
"2^1 7^2"

이봐, 당신은 테스트를 시도 할 수 있습니다 f(158,237)하십시오
durron597

지수로 구분 된 공간입니다 (많은 공간이 " 79^1"
MT0

다른 솔루션에는 해당 기능이 없으며 예제도 마찬가지입니다. 수정하십시오 :)
durron597

원래의 질문에 따르면, 공백이 얼마나 많이 허용되는지 또는 허용되지 않는지 정의하는 것은 없습니다. 그러나, 당신은 가서 규칙을 바꾸려고하지 않습니까?
MT0

2
기존 규칙에 따르면이 구현에서 "입력이 상대적으로 소수이면 출력 없음"요구 사항을 생략한다고 말할 수 있습니다. 여전히 너무 귀여워 보이는 골프 코드를 손상시키는 것은 여전히 ​​잘못된 것 같습니다. 얼마나 간단하게 filter()전화를 걸 수 있습니까?
Keen

3

Perl 6 : 90 자, 94 바이트

sub MAIN(*@n){@n.any%$_||(my$p=$p⊎$_;@n»/=»$_;redo)for
2..@n[0];$p.pairs.fmt("%d^%d").say}

다소 골퍼 해제 및 의견 :

sub MAIN (*@n) { # accept any number of input numbers as @n
    (
        # $p is a Bag, e.g., it holds the primes and the number of times each was added
        my $p = $p ⊎ $_; # Add the prime to the bag
        @n »/=» $_; # Divide all the input numbers by the prime

        redo # Redo the loop iteration with the same prime, in case
             # the numbers can be divided by it multiple times
    )
    if @n.all %% $_ # Do the above only if all of @n are divisible by $_
    for 2..@n[0];   # Do the above for all numbers from 2 .. @n[0]

    $p.pairs.fmt("%d^%d").say # Print join " ", "$prime^$count"
}

사용법은 다음과 같습니다.

$ perl6 -e'sub MAIN(*@n){@n.any%$_||(my$p=$p⊎$_;@n»/=»$_;redo)for
2..@n[0];$p.pairs.fmt("%d^%d").say}' 51 153
3^1 17^1

per는 펄의 상징입니까? 나는 몰랐다.
durron597

@ durron597 Only Perl 6 :)
Mouq

3

144 133 118 114 97 93

($a,$b)=<>=~/\d+/g;for(2..$a){for($n=0;$a%$_+$b%$_<1;$n++,$a/=$_,$b/=$_){}$n&&print"$_^$n ";}

언 골프 버전 :

($a,$b)=<>=~/\d+/g;
for(2..$a){
    for($n=0 ; $a%$_+$b%$_<1 ; $n++,$a/=$_,$b/=$_) {}
    $n&&print"$_^$n ";
}

나는 문자 그대로이 질문에 답하기 위해 Perl을 배우기 시작했습니다 (이것은 내 첫 번째 Perl 코드입니다).


예, 코드를 자세히 살펴 foreachfor
보지는 않았지만

@Mouq 나는 너무 많은 중복을 가진 언어를 본 적이 없다 ... 감사합니다 :)
Tal

2

자바 : 247 (241)

배열의 요소를 추적하고 루프로 인쇄합니다.

Java에 알맞은 크기입니다.

class G{public static void main(String[]a){Integer i=1;int n=i.valueOf(a[0]),m=i.valueOf(a[1]),f[]=new int[n>m?n:m+1];for(;m>=++i||n>i;){if(n%i+m%i<1){f[i]++;n/=i;m/=i--;}}for(i=2;i<f.length;System.out.print(f[i]>0?i+"^"+f[i]+" ":""),i++);}}

// line breaks below

class G{
    public static void main(String[]a){
        Integer i=1;int n=i.valueOf(a[0]),m=i.valueOf(a[1]),f[]=new int[n>m?n:m+1];
        for(;m>=++i||n>i;){
            if(n%i+m%i<1){
                f[i]++;n/=i;m/=i--;
            }
        }
        for(i=1;i<f.length;System.out.print(f[i]>0?i+"^"+f[i]+" ":""),i++);
    }
}

실제로 다른 변수를 그대로두면 int4를 잃어 버릴 수 int 있지만 new int[->로 다시 얻으 new Integer[므로 워시입니다.
durron597

예, 그리고로 전환 n%i<1&&m%i<1하여 또 다른 3 개를 얻었 습니다 n%i+m%i<1.
지오 비트

필요하지 않습니다 (). 인 경우 어쨌든 n==m기본값 m+1입니다.
Geobits

2
당신은 대체 할 수 m/=i;i=1;와 함께 m/=i--;:) 너무 빨리 실행됩니다 그것은
durron597

1
첫 번째 for루프 후 괄호가 필요합니까?
입니 프

2

자바 스크립트 (ECMAScript를 5) 170 164 163 113

나는 MT0의 리드를 따르는 것에 거의 저항 할 수 없었다. 나는 이전에 재귀를 고려했지만 너무 엉망이되는 것처럼 보였습니다. 그리고 정말입니다. 가장 작은 변형은 모든 것을 망칩니다.

바이올린을 좋아하는 사람들에게는 바이올린이 있습니다.

function f(a,b,i,e){return i?a%i|b%i?(e?i+'^'+e+' ':'')+(i>a?'':f(a,b,i+1,0)):f(a/i,b/i,i,e+1):f(a,b,2,0).trim()}

언 골프 드 :

function f(a,b,i,e){
    return i // Check for factor.
        ?a%i|b%i // Check for indivisibility.
            ?(
                e // Check for exponent.
                    ?i+'^'+e+' ' // Add the current factor to result string.
                    :'' // Omit the current non-factor.
             )+(
                i>a // Check for termination state.
                    ?'' // Stop recursion.
                    :f(a,b,i+1,0) // Go to the next factor.
            )
            :f(a/i,b/i,i,e+1) // Failed indivisibility check. Increment exponent and divide subject values.
        :f(a,b,2,0) // Add default factor and exponent.
        .trim() // Get rid of one extra space that's usually on the end.
}

구 버전

function f(a,b){for(var r=[],j=-1,i=2;i<=a;)a%i|b%i?++i:(r[j]&&r[j][0]==i?r[j][1]++:r[++j]=[i,1],a/=i,b/=i);for(j=0;i=r[j];++j)r[j]=i.join('^');return r.join(' ')}

언 골프 드 :

function f(a,b){
    for(var r=[],j=-1,i=2;i<=a;)
        // We (mis)use conditional expression `?:` instead of `if(){}else{}`.
        a%i|b%i ? // Bitwise OR saves one character over logical OR, where applicable.
             // In the truth case, `i` has become uninteresting. Just move on.
            ++i : // We don't mind hitting composites because their prime factors have already been drained from `a` and `b`.
            (
                r[j]&&r[j][0]==i ? // Check if `i` is already a listed factor.
                    r[j][1]++ : // Increment the exponent count.
                    r[++j]=[i,1], // Otherwise, add a new factor with exponent 1.

                a/=i,b/=i // Drain a used-up factor from `a` and `b`.
            );

    // The real work's done. Now we just format.
    for(j=0; i=r[j]; ++j)
        r[j]=i.join('^'); // Join each factor to its exponent.

    return r.join(' ') // Join all factors into result string.
}

다음은 몇 가지 테스트입니다.

[
    f(4, 12),
    f(80, 80),
    f(96,162),
    f(196,294)
];

이 재귀 함수는 f(301343045, 421880263);아마도 브라우저가 그 깊이를 재귀 할 수 없기 때문에 실패했습니다 . 바보 같은 파이어 폭스!
kernigh

확실히. 실제로 트리 탐색이나 본질적으로 다른 재귀 데이터 구조와 같은 일종의 스택이 필요한 경우에만 재귀 함수를 사용합니다. (물론, 숫자 재귀 데이터 구조로 취급 수 있지만 그 사실을 무시하는 데 도움이되는 모든 종류의 추상화가 있습니다.)
Keen

2

GolfScript, 68 바이트

~..),2>*${1$1$%3$2$%+!{.@@/@2$/.}*;}/;;]:D.&{`.[~]D\/,(`"^"\++}%" "*

이 방법에는 O (b 정수 "a"및 "b"에 대해 2 ) 시간 및 공간을 필요로한다.

1 바이트의 추가 비용으로 "오직"O (b) 시간과 공간이 필요합니다.

~.),2>31*${1$1$%3$2$%+!{.@@/@2$/.}*;}/;;]:D.&{`.[~]D\/,(`"^"\++}%" "*

작동 원리

~.        # Interpret the input string (“a” and “b”) and duplicate “b”.
.),2>     # Push the array [ 2 3 4 ... b ].
*$        # Repeat each element b times and sort: [ 2 ... 2 3 ... 3 ... b ... b ]
{         # For each element “d” of the array:
  1$1$%   # Calculate a % d.
  3$2$%   # Calculate b % d.
  +!      # Add and negate.
  {       # If both “a” and “b” are divisible by “d”:
    .@@/  # Calculate a / d.
    @2$/  # Calculate b / d.
    .     # Create a dummy value.
  }*      #
  ;       # Pop the topmost stack element (non-divisor “d” or dummy value).
}/        #
;;]       # Pop “a” and “b” and collect the remaining stack elements in an array.
:|.&      # Save that array in “D” and intersect it with itself to deduplicate it.
{         # For each element “d” of “D”:
  `.[~]   # Push string "d" and array [d].
  D\/,(`  # Split “D” around [d] and take the length minus 1. This count the occurrences.
  "^"\    # Push the string "^" and swap it between "d" and it's number of occurrences.
  ++      # Concatenate the three strings.
}%        # Collect all strings into an array.
]" "*     # Join by spaces.

1

파이썬 3 (123)

이것은 기본적으로 Tal의 답변 과 동일한 구조를 사용합니다 .

a,b=map(int,input().split())
s='';p=1
while p<a:
 c=0;p+=1
 while a%p+b%p<1:a/=p;b/=p;c+=1
 if c:s+='%d^%d '%(p,c)
print(s)

p = a 및 a> = min (a, b)를 얻기 위해 즉시 증가하므로 p = a-1까지 반복하면 충분합니다. b> a이면 a 이상의 위의 쓸모없는 p 값을 시도해도 아무런 해가 없습니다.

2.X에서는 문자열을 누적하지 않고 각 조각을 인쇄하여 문자를 절약 할 수 있다고 생각합니다 if c:print'%d^%d'%(p,c),. 불행히도 파이썬 3에는 줄 바꿈없이 인쇄하는 간단한 방법이없는 것 같습니다.


1

PHP, 96

<?php
list(,$a,$b)=$argv;for($s=1;$s++<$a;$c&&print"$s^$c ")for($c=0;1>$a%$s+$b%$s;$a/=$s,$b/=$s)$c++;

거의 똑같은 코드를 얻었습니다! 내 하나의 개선은 대신 1에서 p=0;g+=1시작하여 한 줄로 결합 하는 것 입니다. 나는 당신이 파이썬을 좋아하게되기를 바랍니다. gg<ag<=a
xnor

@ xnor 코드가 누락되었습니다. 실제로 거의 동일합니다. 파이썬 스크립트를 제거했습니다. 나는 파이썬처럼, 나는 중괄호 필요에 내가 가지고 있지 바랍니다
mleko

코드를 제거 할 필요없이 직접 코드를 작성했습니다. 나는 또한 기본적으로 Tal과 같은 게임을 생각해 냈기 때문에 이것이 파이썬 골프가 수렴하는 것 같습니다.
xnor

1

awk- 115 111 96 85

새 버전은 한 줄의 입력 만 처리 할 수 ​​있습니다. durron597 덕분에 확인 만하면 됩니다 i <= $1.

{for(i=1;++i<=$1;)for(;$1%i+$2%i==0;f[i]++){$1/=i;$2/=i}$0=z;for(i in f)$i=i"^"f[i]}1

언 골프 드 :

{
    #skip finding gcd as a separate step, get it from the factors
    for(i = 1; ++i <= $1;) {
        for(;$1 % i == 0 && $2 % i == 0; f[i]++) {
            $1 /= i;
            $2 /= i;
        }
    }
    $0 = "";
    for(i in f) {
        $i = i "^" f[i];
    }
    print;
}

이전에는 숫자 쌍을 반복적으로 사용할 수있었습니다.

{a=$1;b=$2;for($0=c;a-b;)if(a>b)a-=b;else b-=a;for(i=2;i<=a;i++){for(j=0;a%i==0;j++)a/=i;$0=$0(j?i"^"j" ":c)}}1

언 골프 드 :

{
    a = $1;
    b = $2;
    $0 = "";
    #rip off Euclid
    for(; a != b;) {
        if(a > b) {
            a = a - b;
        } else {
            b = b - a;
        }
    }
    #but not Eratosthenes
    for(i = 2; i <= a; i++) {
        for(j = 0; a % i == 0; j++) {
            a /= i;
        }
        $0 = $0 (j ? i "^" j " " : "");
    }
    print;
}

당신은 필요 &&i<=b합니까?
durron597

글쎄, 난 당신이 맞아요, 당신은하지 않습니다 : if i > b, 그리고 b % i != 0... thanks :)
laindir

이 프로그램은 OpenBSD 5.5에서 awk 와 작동하지 않습니다 . 왜냐하면 NF=0;$ 1과 $ 2를 삭제하지 못하기 때문 입니다. 로부터의 출력 echo 301343045 421880263 | awk -f factorize.awk | sed 's/ */ /g'5 7 1021^1 59029^1$ 1 5이고 $ 2 제 나오지 좋다고 $ 1022 $ 1023 $ 1024, 프린트 온 여분 공간이므로 ... 공백으로 접합 빈 문자열로 $ 5만9천28.
kernigh

감사합니다 @kernigh, nawk, mawk 및 gawk에서 작동합니다. posix가 NF에 할당하는 것에 대해 아무 말도하지 않았 음을 다시 확인하고$0=z;
laindir

@laindir이 변경으로 인해 프로그램이 수정되었습니다. 코드 골프는 프로그램을 휴대 할 필요가 없습니다. 운 좋게 $0=z;와 같은 문자 수입니다 NF=0;. $0=z;더 길 었다면 계속 지키라고 말할 것 NF=0;입니다.
kernigh

1

, 41 바이트

언어는 질문보다 새로운 것이기 때문에 경쟁 답변이 아닙니다. 그러나 그 68의 GolfScript 마크는 내려 와야했습니다.

Fi2,++a{p:0T$|g%i{++pg/:i}Ipx.:i.'^.p.s}x

출력은 공백으로 끝납니다. 이것이 문제라면, 다음 버전도 41 바이트입니다 ( -s플래그 포함 ).

Fi2,++a{p:0T$|g%i{++pg/:i}IplAE:i.'^.p}l

설명과 함께 형식화 :

F i 2,++a {      For i in range(2,a+1); note ++ used to avoid parentheses in 2,(a+1)
  p:0            p will store the greatest power of i that divides both numbers
  T $+(g%i) {    Loop till the sum of g%i is nonzero, where g is a list initialized
                  from cmdline args
    ++p          As long as g%i is [0 0], increment p...
    g/:i         ...and divide both numbers in g by i
  }
  I p            If p is nonzero, i went into both numbers at least once
    x.:i.'^.p.s  Append i^p and a space to the result
}
x                Print the result

골프 스크립트와 달리 CJam 등 삽입 연산자가있는 명령형 언어입니다. 또한 배열 프로그래밍 언어에서 영감을 얻습니다. 이 작업은 직장에서 두 패러다임을 잘 보여줍니다.

(방금 몇 가지 버그를 수정했기 때문에 2015-4-20 커밋이 필요합니다.)


0

파이썬 2-262 바이트

n,m=input(),input()
f=lambda i:set(filter(lambda x:i%x<1,range(1,i+1)))
g=max(f(n)&f(m))
p=[]
while g-1:
 p+=[min(filter(lambda x:x>1 and x%2!=(x==2)and not any(map(lambda y:x%y<1,range(2,x))),f(g)))]
 g/=p[-1]
print ' '.join(`a`+^+`p.count(a)`for a in set(p))

6 호선이 작동해야합니다.


1
무엇에 대해 …`a`+'^'+`f.count(a)`…?
Ry-

나는 그것이 어떻게 그리웠는지 전혀 모른다. 헤이즈 감사.
undergroundmonorail

0

그루비 : 174 자

다음은 Groovy 2.2.1 의 Geobits 솔루션 포트입니다 .

int i=1, n=args[0]as int, m=args[1]as int;s=n>m?n:m+1;f=new int[s];while(m>=++i||n>i){if(n%i+m%i<1){f[i]++;n/=i;m/=i--;}};(s-1).times{y=it+1;x=f[y];print"${x>0?"$y^$x ":""}"}

ungolfed 버전은 다음과 같습니다.

int i = 1, n = args[0] as int, m = args[1] as int

s = n>m?n:m+1
f = new int[s]

while (m>=++i||n>i) {
    if (n%i+m%i<1) {
        f[i]++;n/=i;m/=i--;
    }
}
(s-1).times {
    y=it+1
    x=f[y]
    print"${x>0?"$y^$x ":""}"
}

내 문자가 56 자 더 짧기 때문에 내 대신 Geobits 솔루션을 포팅하기로 선택한 것에 놀랐습니다.
durron597

0

R : 139

a=scan();q=1:a[1];n=max(q[!a[1]%%q&!a[2]%%q]);m=rep(0,n);for(i in 2:n){while(!n%%i){m[i]=m[i]+1;n=n/i};if(m[i])cat(paste0(i,"^",m[i])," ")}

들여 쓰기

a=scan() #Take space-separated numeric input from stdin
q=1:a[1]
n=max(q[!a[1]%%q&!a[2]%%q]) #gcd
m=rep(0,n)
for(i in 2:n){
    while(!n%%i){ #prime factorization
        m[i]=m[i]+1
        n=n/i
        }
    if(m[i])cat(paste0(i,"^",m[i])," ")
    }

용법:

> a=scan();q=1:a[1];n=max(q[!a[1]%%q&!a[2]%%q]);m=rep(0,n);for(i in 2:n){while(!n%%i){m[i]=m[i]+1;n=n/i};if(m[i])cat(paste0(i,"^",m[i])," ")}
1: 196 294
3: 
Read 2 items
2^1  7^2  
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.