Nguyên tố đệ quy


8

Công việc của bạn là lấy các thừa số nguyên tố của một số được lấy từ đầu vào (bỏ qua bất kỳ số mũ nào bằng 1) sau đó lấy các thừa số nguyên tố của tất cả các số mũ, v.v., cho đến khi không còn số tổng hợp nào; và sau đó xuất kết quả.

Để làm cho những gì tôi yêu cầu rõ ràng hơn một chút, đây là một chương trình javascript thực hiện nó, nhưng, ở mức 782 byte, nó chưa được chơi tốt lắm:

var primes=[2,3];
function nextPrime(){
    var n=2;
    while(isAMultipleOfAKnownPrime(n)){n++}
    primes.push(n);
}
function isAKnownPrime(n){return primes.indexOf(n)!=-1};
function isAMultipleOfAKnownPrime(n){
    for(var i=0;i<primes.length;i++)if(n%primes[i]==0)return true;
    return false;
}
function primeFactorize(n){
    while(primes[primes.length-1]<n)nextPrime();
    if(isAKnownPrime(n)||n==1)return n;
    var q=[];while(q.length<=n)q.push(0);
    while(n!=1){
        for(var i=0;i<primes.length;i++){
            var x=primes[i];
            if(n%x==0){q[x]++;n/=x}
        }
    }
    var o="";
    for(var i=2;i<q.length;i++){
        if(q[i]){if(o)o+="x";o+=i;if(q[i]>1){o+="^("+primeFactorize(q[i])+")"}}
    }
    return o;
}
alert(primeFactorize(+prompt()));

Bạn được yêu cầu sắp xếp thứ tự các thao tác càng rõ ràng càng tốt và sắp xếp các thừa số nguyên tố theo thứ tự tăng dần theo từng cấp độ.

Bạn nhận được phần thưởng -50 byte nếu bạn tạo đầu ra dưới dạng toán học được định dạng hoặc mã latex hợp lệ.


17
Nó sẽ giúp cung cấp các ví dụ về đầu vào và đầu ra.
DavidC

7
Bạn có thể đưa ra một số ví dụ đầu vào và đầu ra? Tôi đang gặp khó khăn trong việc hiểu thông số kỹ thuật của bạn và giải pháp ví dụ khá ngắn gọn.
Zgarb

@Zgarb Ông có nghĩa là tính hệ số nguyên, nhân số mũ của số nguyên tố, nhân số mũ của chúng , v.v., cho đến khi bạn còn lại tất cả các số nguyên tố.
LegionMammal978

2
Chính xác những gì bạn hiểu là "định dạng toán học". Ví dụ có được phép in mã latex không?
Jakube

1
@Zgarb Bất kỳ định dạng nào hoạt động (ví dụ 2^(5^11*11^(2^7))*541).
LegionMammal978

Câu trả lời:


7

CJam, 32 31 29 27 25 - 50 = -25 byte

7 byte được lưu bởi Dennis.

Woooo, Dennis đã giảm điều này bằng bảy byte tuyệt vời và đã xoay sở để đánh bại Pyth!

q~S2*{mF{~'^'{@j'}'*}/;}j

Kiểm tra nó ở đây.

Giải trình

q~                           e# Read and eval input.
  S2*                        e# Push the string "  ". The second space will be our 
                             e# memoised result for input 1. This way, 1-exponents become 
                             e# ^{ } later which do not affect the rendered output of the 
                             e# generated LaTeX.
     {                 }j    e# Initialise a recursion with the above base case.
      mF                     e# Compute prime factorisation as list of pairs.
        {           }/       e# For each pair...
         ~'^'{@              e# Unwrap the pair and put a '^' and a '{' in the middle.
               j             e# Recursively run the outer block on the exponent.
                '}'*         e# Push a '}' and a '*' character.
                      ;      e# Discard the last '*'.

Tất cả các nội dung ngăn xếp sẽ được in tự động back-to-back vào cuối chương trình.


"{}"-> {}sCó vẻ như bạn đã tìm ra cách jhoạt động.
Dennis

@Dennis Tôi nghĩ rằng tôi đã sử dụng jmột thời gian. user23013 đã đăng một lời giải thích hay về Chuyển đổi cơ sở hỗn hợp và aditsu một vài nhận xét làm rõ về việc sử dụng nâng cao ở đâu đó trên SourceForge.
Martin Ender

aditsu thực sự đã trả lời một bài đăng trên diễn đàn của tôi, nhưng SF đã không thông báo cho tôi và tôi đã dừng kiểm tra sau một vài tháng ... Trong khi jkhá tuyệt, một chức năng được đặt tên sẽ ngắn hơn ở đây:{mF{)_({Fa+'^}&*}%'**{}s\*}:F
Dennis

@Dennis Ồ đúng rồi, tôi đã không nghĩ rằng tôi thực sự có thể biến nó thành một đệ trình chỉ có chức năng nếu tôi sử dụng phương pháp hàm được đặt tên. Sẽ thay đổi câu trả lời sau.
Martin Ender

1
25 byte:q~S2*{mF{~'^'{@j'}'*}/;}j
Dennis

14

Pyth, 27 - 50 = -23 byte

Lj\*m+ed?+\^jyhd`HthdkrPb8

Điều này xác định một hàm đệ quy y. Dùng thử trực tuyến: Trình diễn

Đầu ra là mã LaTeX hợp lệ, vì vậy tôi yêu cầu tiền thưởng. Cuộc gọi y66430125trả về chuỗi 3^{2^{2}*3}*5^{3}, kết xuất thành

pic_small

Khá tự hào khi tìm cách in dấu ngoặc nhọn mà không sử dụng dấu ngoặc nhọn trong mã của tôi.

Giải trình:

L                            define a function y(b): return ...
                       Pb       prime factorization of b
                      r  8      run-length-encoded, gives pairs of (exponent, prime)
    m                           map each pair d (exponent, prime) to:
      ed                          prime
     +                            +
             yhd                    recursive call
            j   `H                  join repr(H) by ^
                                      H is preinitialized with an empty dictionary
                                      so the repr(H) gives the string "{}"
                                      and join inserts the prime-factorization 
                                      of the exponent between the chars of "{}"

         +\^                        add "^" at the beginning
        ?         thd               if exponent - 1 != 0 else
                     k              "" (empty string)
 j\*                            join by "*"

1
@ SuperJedi224 Vâng, quyền của bạn. Sử dụng một cách tiếp cận cũ này là ngắn hơn. Nhưng bây giờ, tôi đã tìm thấy repr(H)mánh khóe, nó không thành vấn đề. Vì vậy, tôi đã chỉnh sửa nó ngay bây giờ.
Jakube

Nhân tiện {}là từ điển trống trong Python, không phải tập rỗng.
isaacg

6

Pyth - 39 34 32 28 byte

Cảm ơn Jakube

Xác định hàm ylấy số nguyên:

L?j\xm+ed+"^("+yhd\)rPb8tPbb

Giải trình:

L                              define y(b): return                                  
  j\x                              "x".join(                                        
     m                                 map(lambda d:                                
      +ed+"^("+yhd\)                       d[1] + "^(" + y(d[0]) + ")",             
                    rPb8                   tally(prime_factors(b))))                
 ?                      tPb        if len(prime_factors(b)) != 1 else               
                           b           b                                            

Nếu ^(1)không được phép, tôi phải sử dụng 33 byte:

L?j\xm+ed?+"^("+yhd\)thdkrPb8tPbb

4

Toán học, 106 102 101 - 50 = 51 byte

If[PrimeQ@#,#,(a=CenterDot)@@{b,c}~Function~If[c<2,b,b~Superscript~#0@c]@@@FactorInteger@#/.a@b_:>b]&

Các định dạng như số mũ lồng nhau với phép nhân dấu chấm. Biểu diễn Unicode của ví dụ đầu vào và đầu ra:

  • 102 · 5
  • 1202³ · 3 · 5
  • 163842²˙⁷

Sử dụng tốt CenterDotđể tránh Times. Tôi vẫn đang cố gắng tìm ra nơi đệ quy diễn ra.
DavidC

@DavidCarraher #0đề cập đến hàm thuần nhất trong cùng mà không có tên đối số.
LegionMammal978

Cảm ơn. Lần đầu tiên tôi nghe về việc sử dụng này#
DavidC

3

Bash + coreutils + bsdgames, 117 - 50 = 67

f()(factor $1|tr \  \\n|sed 1d|uniq -c|while read e m;do
((e>1))&&m+=^{`f $e`}
printf {$m}
done)
f $1|sed s/}{/}\*{/g

Đầu ra

$ ./recprimefac.sh 2985984
{2^{{2^{{2}}}*{3}}}*{3^{{2}*{3}}} $ 
$ 

Tôi đang nhận phần thưởng -50, vì đầu ra này được định dạng LaTeX và với một công cụ như http://www.sciweavers.org/free-online-latex-equation-editor hiển thị:

nhập mô tả hình ảnh ở đây

Hãy cho tôi biết nếu điều này không được chấp nhận.


1
Điều đó làm việc tốt.
SuperJedi224

1

Clip , 36 33

jm[z.y(z?()z{'^'(M)z')`]L]}qfnx"*

Giải trình

                            qfnx   .- Prime factors of the input, with exponents -.
  m[z                      }       .- For each factor z...               -.
     .y(z                          .- The prime number                   -.
         ?()z            L]        .- If the exponent is 1, nothing      -.
             {         `]          .- Otherwise, the following:          -.
                  M)z              .- Apply the main function to the exponent... -.
              '^'(   ')            .- ...inside ^(..)                    -.
 j                              "* .- Join the factors with "*"          -.

1

Javascript, 388-50 = 338

l="length";function g(n){for(;m(++n););p.push(n)}function m(n){for(i=0;i<p[l];i++)if(n%p[i]==0)return 1;return 0}function f(n,x,q,o){while(p[p[l]-1]<n)g(2);if(p.indexOf(n)>=0||n==1)return n;q=[];while(q[l]<=n)q.push(0);for(i=0;i<p[l];i++){x=p[i];while(n%x==0){q[x]++;n/=x}}o="";for(i=2;i<q[l];i++)if(q[i]){if(o)o+="*";o+=i;if(q[i]>1){o+="^{"+f(q[i])+"}"}}return o}alert(f(+prompt(p=[2])))

Vì mã LaTeX hiện đủ điều kiện nhận tiền thưởng, tôi đã quyết định đưa vào các sửa đổi cần thiết như một phần của việc chơi gôn cho việc này. Nó có thể vẫn có thể được chơi golf hơn nữa mặc dù.

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.