In hệ số nguyên tố của ước số chung lớn nhất của hai số


17

Tiêu đề nói lên tất cả. Hai số nguyên dương 32 bit đầu vào m, n >= 2, đầu ra gcd(m,n)ở dạng thừa số nguyên tố.

Đầu vào

Dòng lệnh args hoặc 1 dòng stdin ổn, bất cứ điều gì tốt hơn cho golf.

Đầu ra

Không gian duy nhất được phân định bằng số mũ (không có khoảng trắng bổ sung). Đầu ra không có gì nếu đầu vào tương đối nguyên tố.

Ví dụ:

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

$ ./factorize 14 15


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

Quy tắc

  • Bạn không được sử dụng các tài nguyên bên ngoài, thư viện toán học hoặc các hàm tích hợp để tạo hệ số hoặc GCD. Ví dụ: Java, không java.lang.Math. ruby, không prime_division, perl, không factor, v.v.

1
Sản lượng nào bạn đang tìm kiếm nếu gcd(n,m) == 1?
ngầmmonorail

Có ổn không nếu tôi thoát với một ngoại lệ? Nó sẽ tiết kiệm cho tôi một vài byte.
ngầmmonorail

Trên thực tế, tôi đã thay đổi cách tiếp cận của mình và không cần phải thoát ra bằng một ngoại lệ. Những người khác có thể muốn biết, mặc dù.
ngầmmonorail

Đừng thoát ra với một ngoại lệ. Không có kết quả nào :)
durron597

Về mặt kỹ thuật, q:a+.bhoặc __ q:a+.btrong J không sử dụng external resources or math libraries, nhưng tôi sẽ không đăng nó, vì nó quá xa so với tinh thần của câu hỏi. Tôi chỉ nghĩ rằng tôi sẽ chia sẻ nó ở đây.
ɐɔıʇǝɥʇuʎs

Câu trả lời:


10

Python 3, 255 250 237 226 188 180 150 142 137 136 ký tự

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)

Thật đáng ngạc nhiên khi tôi có thể rút ngắn điều này bằng cách bỏ qua những thứ (như, bạn biết đấy, tìm gcd)! Ngoài ra tôi có thể giảm thêm 10 ký tự bằng cách biến đây thành một hàm mong đợi 2 ints, giống như một số câu trả lời khác, thay vì đọc từ stdin.


Điều này thật mãnh liệt! Tôi đang học hỏi rất nhiều bằng cách xem các chỉnh sửa của bạn và cố gắng đánh bại bạn lol. Tôi nghĩ rằng bạn có thể có cái này mặc dù (trong số các câu trả lời của Python)
Rainbolt

1
Bạn có thể lưu 1 ký tự bằng cách thay đổi while g<a and g<b:thànhwhile(g<a)*(g<b):
Rainbolt

@Raser Cảm ơn bạn đời! Câu trả lời của bạn là câu hỏi thúc đẩy tôi làm việc chăm chỉ hơn về vấn đề này :) Ngoài ra, mẹo mà bạn đề xuất đã truyền cảm hứng cho tôi để tìm ra a%g+b%gbit
Tal

Tôi không nghĩ rằng các điều khoản khác là cần thiết. else:g+=1chỉ có thể là g+=1, trừ khi tôi thiếu một cái gì đó.
isaacg

@isaacg Bạn có vẻ đúng, cảm ơn bạn!
Tal

8

Hồng ngọc - 168 117 114 101 100 97

Chỉnh sửa: Sau khi suy nghĩ về nó, tôi nhận ra rằng tôi không cần sàng vì tính nguyên thủy của yếu tố được quan tâm trong vòng lặp nhân tố. Ngoài ra, như được thông báo bởi câu trả lời của người khác ( laindirTal là những người tôi đã thấy nó, mặc dù có vẻ như những người khác cũng đã làm điều đó), đã loại bỏ tính toán gcd riêng biệt, vì điều đó cũng xảy ra trong nhân tố.
Chỉnh sửa 2: Không cần do.
Chỉnh sửa 3: Ép nó xuống nhiều hơn.
Chỉnh sửa 4: Kéo ra thêm một khoảng trống.
Chỉnh sửa 5: uptothay vì 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}

Đầu ra (giống sau khi chỉnh sửa):

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

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

Chắc chắn có thể được làm tốt hơn, nhưng không tệ cho cái đầu tiên của tôi.


Bạn có thể loại bỏ 4 byte bằng cách thay đổi map{|i|i.to_i}thành map &:to_i. Bạn có thể xóa byte thứ 5 bằng cách không đếm dòng mới ở cuối tệp; Ruby hoạt động mà không có nó.
hạt nhân

Ngoài ra, bạn có thể sử dụng $*thay vì ARGV.
daniero

6

Con trăn 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`,

Thông dịch viên

thay thế

Ví dụ đầu vào - stdin

100 50

Ví dụ đầu ra - thiết bị xuất chuẩn

2 ^ 1 5 ^ 2


1
Thế còn …`a`+'^'+`f.count(a)`…?
Ry-

Khá sạch sẽ, tôi thích nó
qwr

@qwr Cảm ơn. Tôi hy vọng tôi có thể hiểu các câu trả lời Python khác Định dạng chuỗi và cạo một vài ký tự.
Rainbolt

Swap f.append(i)cho f+=[i]tiết kiệm 5 ký tự.
Nolen Royalty

1
Và bây giờ bạn không cần phải sử dụng f cả: p (tại sao f=''vẫn còn ở đó?)
Nolen Royalty

4

Java - 184 175

Điều này được lấy cảm hứng từ câu trả lời của @Geobits (và một chút câu trả lời của @ Tal), nhưng đủ để tôi quyết định tạo ra câu trả lời của riêng mình.

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

Ungolfed (loại) với khai thác thử nghiệm (xác minh con người):

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 byte

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

Nó đọc một dòng đầu vào tiêu chuẩn. Đầu ra của nó không kết thúc với một dòng mới. (EDIT: Nó cũng tạo ra một không gian thừa sau mỗi yếu tố. Một số câu trả lời khác cắt không gian, nhưng câu trả lời này thì không.)

Thí dụ:

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

Mã có ý kiến:

# 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"}}

Cái này ngắn và dễ đọc. Nó chuyển phạm vi 2..$avào một vòng lặp Foreach-Object %{...}. Vòng lặp thu thập các giá trị của if($p){"$_^$p"}.
hạt nhân

3

JavaScript (Bản nháp ECMAScript 6) - 89 ký tự

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()

Chuyển đổi câu trả lời gốc (lặp), bên dưới, thành câu trả lời đệ quy.

Giải trình

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.

Câu trả lời lặp lại: JavaScript (ECMASCript 6) - 108 (hoặc 121) 98 ký tự

Phiên bản 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()}

Phiên bản 1:

Trả lời câu hỏi như ban đầu được hỏi:

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(' ')}

Hoặc để tuân thủ các thay đổi quy tắc sau khi thực tế:

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(' ')}

Giải trình

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.
}

Đầu ra

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

f(14,15)
""

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

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

Hey bạn có thể thử nghiệm f(158,237)xin
durron597

Đó là không gian được phân định bằng số mũ (nó chỉ có rất nhiều không gian)" 79^1"
MT0

Đúng, các giải pháp khác không có điều đó và cũng không có ví dụ. Vui lòng sửa :)
durron597

Không có gì trong câu hỏi, như được hỏi ban đầu, định nghĩa bao nhiêu khoảng trắng là hoặc không được phép - như tôi thấy, điều này đáp ứng các yêu cầu vì nó được phân cách bằng khoảng trắng. Tuy nhiên, bây giờ bạn sẽ đi và thay đổi các quy tắc phải không?
MT0

2
Theo các quy tắc có sẵn, người ta có thể nói rằng việc triển khai này bỏ qua yêu cầu "Đầu ra không có gì nếu đầu vào tương đối chính." Vẫn có vẻ sai lầm khi bỏ qua mã golf mà ra rất đẹp. Làm thế nào ngắn gọn bạn có thể thực hiện một filter()cuộc gọi?
Keen

3

Perl 6: 90 ký tự, 94 byte

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

Một số de-golfed và nhận xét:

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"
}

Cách sử dụng giống như:

$ 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

Là một biểu tượng trong perl? Tôi không biết điều đó.
durron597

@ durron597 Chỉ Perl 6 :)
Mouq

3

Perl, 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 ";}

Phiên bản bị đánh cắp:

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

Tôi thực sự chỉ mới bắt đầu học Perl chỉ để trả lời câu hỏi này (đây là mã Perl đầu tiên của tôi từ trước đến nay), vì vậy tôi nghi ngờ rằng điều này có thể bị đánh gôn hơn nữa.


Có, tôi đã không xem mã của bạn chặt chẽ, nhưng foreachluôn đồng nghĩa với forPerl 5, vì vậy nên cắt bỏ 4 ký tự :)
Mouq

@Mouq Tôi chưa bao giờ thấy một ngôn ngữ có quá nhiều dư thừa ... cảm ơn :)
Tal

2

Java: 247 241

Theo dõi các yếu tố trong một mảng và chỉ in chúng ra trong một vòng lặp.

Kích thước Decent cho Java, có vẻ như.

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

Bạn thực sự có thể để các biến khác như int, bạn mất 4 đến int nhưng bạn lấy lại chúng bằng new int[-> new Integer[vì vậy đó là một rửa.
durron597

Vâng, và tôi đã có thêm ba bằng cách chuyển n%i<1&&m%i<1sang n%i+m%i<1.
Geobits

Bạn không cần (). Nếu n==m, nó sẽ mặc định là m+1anyway.
Địa chất

2
Bạn có thể thay thế m/=i;i=1;bằng m/=i--;Nó cũng sẽ chạy nhanh hơn :)
durron597

1
Là niềng răng sau forvòng lặp đầu tiên cần thiết?
Ypnypn

2

JavaScript (Bản thảo 5) 170 164 163 113

Tôi gần như không thể cưỡng lại sự dẫn dắt của MT0. Tôi đã xem xét đệ quy trước đây, nhưng dường như quá dễ để gây rối. Và nó thực sự là. Các biến thể nhỏ nhất phá hỏng tất cả mọi thứ.

Có một câu đố cho những người thích câu đố.

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

Ung dung:

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.
}

Phiên bản cũ

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(' ')}

Ung dung:

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.
}

Dưới đây là một vài bài kiểm tra:

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

Chức năng đệ quy này f(301343045, 421880263);có thể không thành công vì trình duyệt của tôi sẽ không cho phép tôi truy cập sâu. Firefox ngu ngốc!
hạt nhân

Chắc chắn rồi. Trong thực tế, tôi chỉ sử dụng một hàm đệ quy nếu tôi thực sự cần một loại ngăn xếp nào đó, như để điều hướng cây hoặc các cấu trúc dữ liệu đệ quy khác. (Chắc chắn, các con số có thể được coi là cấu trúc dữ liệu đệ quy, nhưng chúng ta có tất cả các loại trừu tượng tốt để giúp chúng ta bỏ qua thực tế đó.)
Keen

2

GolfScript, 68 byte

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

Lưu ý rằng cách tiếp cận này đòi hỏi thời gian và không gian O (b 2 ) cho các số nguyên.

Với chi phí thêm một byte, "chỉ" O (b) thời gian và không gian là cần thiết:

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

Làm thế nào nó hoạt động

~.        # 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

Con trăn 3 (123)

Điều này về cơ bản sử dụng cấu trúc tương tự như câu trả lời của 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)

Nó đủ để lặp tới p = a - 1, vì chúng ta tăng ngay lập tức để có p = a và a> = min (a, b). Nếu b> a, không có hại khi thử các giá trị vô dụng của p trên a.

Trong 2.X, tôi nghĩ rằng chúng ta có thể lưu các ký tự bằng cách in từng mảnh khi chúng ta nhận được nó thay vì tích lũy một chuỗi : if c:print'%d^%d'%(p,c),. Thật không may, Python 3 dường như không có cách in nhỏ gọn mà không có dòng mới.


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

Chúng tôi đã nhận được gần như chính xác cùng một mã! Một cải tiến của tôi là kết hợp p=0;g+=1thành một dòng bằng cách bắt đầu từ g1 thay vào đó, cho phép bạn sau đó thực hiện g<athay vì g<=a. Tôi hy vọng bạn phát triển để thích trăn.
xnor

@xnor Tôi nhớ mã của bạn. Quả thực nó gần giống nhau. Tôi đã loại bỏ kịch bản python của tôi. Tôi hy vọng tôi sẽ không thích trăn, tôi CẦN niềng răng
mleko

Không cần phải xóa mã của bạn, bạn đã tự mình nghĩ ra. Về cơ bản, tôi cũng đã nghĩ ra trò chơi là Tal, vì vậy có vẻ như đây chỉ là thứ mà gôn Python hội tụ.
xnor

1

ôi - 115 111 96 85

Phiên bản mới chỉ có thể xử lý một dòng đầu vào. Cảm ơn durron597 đã chỉ ra rằng tôi chỉ cần đảm bảo 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

Ung dung:

{
    #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;
}

Trước đây có thể lấy các cặp số liên tục

{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

Ung dung:

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

Bạn có cần &&i<=bkhông
durron597

Chà, tôi sẽ ... bạn nói đúng, bạn không: nếu i > b, thì b % i != 0... cảm ơn :)
laindir

Chương trình này không hoạt động với awk trong OpenBSD 5.5, vì NF=0;không xóa được $ 1 và $ 2. Đầu ra từ echo 301343045 421880263 | awk -f factorize.awk | sed 's/ */ /g'5 7 1021^1 59029^1vì $ 1 là 5 và $ 2 là 7. Chiếc sed ép các khoảng trống thêm đến từ việc in $ 1022, $ 1023, $ 1024, ..., $ 59028 dưới dạng các chuỗi trống được nối bởi khoảng trắng.
hạt nhân

Cảm ơn @kernigh, nó hoạt động trong nawk, mawk và gawk. Đã kiểm tra kỹ mà posix không nói gì về việc gán cho NF và được thay thế bằng$0=z;
laindir

@laindir Sự thay đổi đó sửa chữa chương trình cho tôi. Code golf không yêu cầu các chương trình phải di động. may mắn thay$0=z; là cùng số lượng nhân vật NF=0;. Nếu $0=z;lâu hơn, tôi sẽ bảo bạn giữ NF=0;.
hạt nhân

1

Pip , 41 byte

Không phải là một câu trả lời cạnh tranh, vì ngôn ngữ mới hơn câu hỏi. Nhưng điểm đánh dấu 68 của GolfScript cần phải đi xuống.

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

Đầu ra kết thúc trong một không gian; nếu đó là một vấn đề, phiên bản sau đây cũng là 41 byte (bao gồm cả -scờ):

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

Được định dạng, với giải thích:

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

Pip, không giống như GolfScript, CJam, et al. là một ngôn ngữ bắt buộc với các toán tử infix; nó cũng lấy một số cảm hứng từ các ngôn ngữ lập trình mảng. Nhiệm vụ này hiển thị độc đáo cả hai mô hình tại nơi làm việc.

(Lưu ý rằng cam kết 2015-4-20 là cần thiết để chạy điều này, vì tôi chỉ sửa một vài lỗi.)


0

Python 2 - 262 byte

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

Dòng 6 cần làm việc.


1
Thế còn …`a`+'^'+`f.count(a)`…?
Ry-

Tôi không biết làm thế nào tôi bỏ lỡ điều đó. Trời ạ. Cảm ơn.
ngầmmonorail

0

Groovy: 174 ký tự

Đây là một cổng giải pháp của Geobits cho Groovy 2.2.1:

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 ":""}"}

Đây là phiên bản chưa được chỉnh sửa:

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 ":""}"
}

Thật ngạc nhiên khi bạn chọn chuyển giải pháp của Geobits thay vì của tôi, vì của tôi ngắn hơn 56 ký tự
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])," ")}

Với vết lõm:

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])," ")
    }

Sử dụng:

> 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  
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.