再帰的な素因数分解


8

あなたの仕事は、入力から取られた数値の素因数を取り(1に等しいすべての指数を省略)、次にすべての指数の素因数を取り、合成数がなくなるまで続けます。そして結果を出力します。

私が求めていることを少し明確にするために、これを行うjavascriptプログラムを次に示しますが、782バイトではまだ十分にゴルフされていません。

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

演算の順序をできるだけ明確にして、各レベルで素因数を昇順にソートする必要があります。

フォーマットされたmathprintまたは有効なlatexコードとして出力を生成すると、-50バイトのボーナスが得られます。


17
入力と出力の例を提供すると役立ちます。
DavidC、2015年

7
入力と出力の例をいくつか教えていただけますか?私はあなたの仕様を理解するのに苦労しており、サンプルのソリューションはかなり簡潔です。
Zgarb

@Zgarb彼は、すべての素数がなくなるまで、整数の因数分解、素数の指数の因数分解、それらの指数の因数分解などを行うことを意味します。
LegionMammal978

2
あなたは「フォーマットされたmathprint」として正確に何を理解していますか?たとえば、latexコードを印刷することはできますか?
ジャクベ

1
@Zgarb機能する任意の形式(例:)2^(5^11*11^(2^7))*541
LegionMammal978 2015年

回答:


7

CJam、32 31 29 27 25-50 = -25バイト

Dennisによって7バイト節約されました。

Woooo、デニスはこれを驚くべき7バイト削減し、なんとかPythを倒しました!

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

ここでテストしてください。

説明

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 '*'.

これらのスタックの内容はすべて、プログラムの最後に自動的に連続して印刷されます。


"{}" -> {}s仕組みを理解したようjです。
デニス

@Dennis jしばらく使ってきたと思います。user23013がMixed Base Conversionについての良い説明を投稿し、SourceForgeのどこかで高度な使用法に関するいくつかの明確な注釈を追加しました。
マーティンエンダー、2015年

aditsuは私のフォーラム投稿に実際に回答しましたが、SFは私に通知せず、2か月後にチェックを停止しました... jかなりクールですが、名前付き関数はここでは短くなります:{mF{)_({Fa+'^}&*}%'**{}s\*}:F
Dennis

@Dennisああそうです。名前付き関数アプローチを使用すれば、実際にそれを関数のみの送信にできるとは考えていませんでした。後で答えを変更します。
マーティンエンダー

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

14

Pyth、27〜50 = -23バイト

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

これは再帰関数を定義しますy。オンラインで試す:デモ

出力は有効なLaTeXコードなので、私はボーナスを主張します。呼び出しはy66430125、文字列を返す3^{2^{2}*3}*5^{3}にレンダリングし、

pic_small

コードで中かっこを使用せずに中かっこを印刷する方法を見つけたことは非常に誇りです。

説明:

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はい、あなたの権利です。古いアプローチを使用すると、これはより短くなりました。しかし、今、私はrepr(H)トリックを見つけたので、それは問題ではありません。だから今すぐ編集しました。
ジャクベ

ちなみに、{}Pythonでは空の辞書ではなく、空のセットです。
isaacg

6

パイス-39 34 32 28バイト

ありがとう Jakube

関数を定義します y整数を取るを。

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

説明:

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                                            

^(1)許可されていない場合は、33バイトを使用する必要があります。

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

4

Mathematica、106 102 101-50 = 51バイト

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

ドット乗算を使用したネストされた指数としてフォーマットします。入力と出力の例のUnicode表現:

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

CenterDot回避するための良い使用Times。私はまだ再帰が行われる場所を理解しようとしています。
DavidC、2015年

@DavidCarraher #0は、引数名のない最も内側の純粋な関数を参照します。
LegionMammal978 2015年

ありがとう。初めてこの使用について聞いた#
-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

出力

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

この出力はLaTeX形式であり、http: //www.sciweavers.org/free-online-latex-equation-editorのようなツールでレンダリングされるため、私は-50のボーナスを主張しています

ここに画像の説明を入力してください

これが受け入れられない場合はお知らせください。


1
それはうまくいきます。
SuperJedi224

1

クリップ 36 33

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

説明

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

LaTeXコードがボーナスの対象となったので、ゴルフの一部として必要な変更を含めることにしました。それはおそらくまださらにゴルフすることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.