プライムへのステップを登る


24

Numberphileの最新ビデオである13532385396179のタイトルは、正の整数に対する次の関数fの固定小数点です。

してみましょうnは正の整数です。素因数分解を通常の方法で記述します。たとえば、60 = 2 2・3・5で、素数は昇順に記述され、1の指数は省略されます。次に、指数を行に戻し、すべての乗算記号を省略して、数値f(n)を取得します。[...]たとえば、f(60)= f(2 2・3・5)= 2235。

(上記の定義は、5つの$ 1,000問題の問題5- ジョンH.コンウェイから取られています)

なお、F(13532385396179)= F(13・53 2・3853・96179)= 13532385396179。

仕事

n入力として正の合成整数を受け取り、出力しますf(n)

もう一つの例

48 = 2 4・3、したがってf(48)= 243。

テストケース

その他のテストケースはこちらから入手できます

   4 -> 22
   6 -> 23
   8 -> 23
  48 -> 243
  52 -> 2213
  60 -> 2235
 999 -> 3337
9999 -> 3211101

11
+1誰かが推測の証拠として13532385396179を見つけたことにまだ驚いています。1000ドルの賞金は、使用した電気の代価を払うための何らかの方法になると思います!:)
Wossname

7
リンクをたどらないと、f(n)を繰り返し適用すると常に素数に達するという推測が明確ではありませんpが素数の場合はもちろんf(p)= p)。13532385396179は、複合と固定の両方であるため、推測を反証します。
クリスH

回答:


16

Python、166 162 159バイト

あなたたちははるかに優れています。これは私が使用したものです!(それを解決したアルゴリズムはこれを呼び出します)

from primefac import*
def c(n):
 x=factorint(n)
 a=''
 for i in range(len(x)):
  l=min(x.keys())
  a+=str(l)
  if x[l]>1:a+=str(x[l])
  x.pop(l)
 return int(a)

2
@LeakyNunのように答えを改善するのを手伝うのではなく、なぜ誰かが新規参入者をダウン票したのですか?:(
シャギー

3
申し訳ありませんが、それが実際に使用したものです(数字を見つけました)。ぎこちないコードは面白いと思いました。あなたはそれを取ることができます。
jchd

9
サイトへようこそ。ソリューションを共有していただけて本当にうれしいです。(知らない人のために、ジム・デイビスはそもそもこの問題を解決した人です)。ただし、課題への回答はいくつかのルールに従う必要があります。@LeakyNunからの提案に従うだけで、答えは有効になります。(他の回答を見て、通常どのように見えるかを確認してください)
ダダ

4
私の神ああ、私はジム・デイビス自身がこのサイトに表示されるように、そして私の挑戦に答えることを期待していなかった...私はそう...今光栄に感じて
漏れ修道女

2
ええ、トロールではありません。私のメールアドレスはgladhoboexpress.blogspot.ca/2014/10/climb-to-prime.htmlにあります...投稿を残しました。数学でメールであふれる人はいません。
jchd

9

Brachylog、8バイト

ḋoọc;1xc

オンラインでお試しください!

説明

Example input: 60

ḋ          Prime decomposition: [5,3,2,2]
 o         Order: [2,2,3,5]
  ọ        Occurences: [[2,2],[3,1],[5,1]]
   c       Concatenate: [2,2,3,1,5,1]
    ;1x    Execute 1s: [2,2,3,5]
       c   Concatenate: 2235

あなたは使用することができますℕ₂ˢすべての2以上の整数を選択代わりに);1xおそらくより読みやすく、よりBrachylogの精神です、。


9

ゼリー、6バイト

ÆFFḟ1V

オンラインでお試しください!

説明

ÆF      Get prime factorisation of input as prime-exponent pairs.
  F     Flatten.
   ḟ1   Remove 1s.
     V  Effectively flattens the list into a single integer.

V=「ゼリーのような単一の文字列と評価するCONCATENATE」
エリックOutgolfer

@EriktheOutgolferはい、したがって「効果的に」。
マーティンエンダー

@MartinEnder使用しない特定の理由(10進数から整数への変換)
散布

@Christianリストには複数桁の整数が含まれている可能性があるため。
マーティンエンダー

@MartinEnderああ、賢い。私はFḌ過去に使用しました-それは良いヒントです!
散布


4

CJam、8バイト

limF:~1-

オンラインでお試しください!

説明

li  e# Read input and convert to integer.
mF  e# Get prime factorisation as prime-exponent pairs.
:~  e# Flatten.
1-  e# Remove 1s.
    e# Implicitly print a flattened representation of the list.

私はe_それがそこにあるものであるので、平坦化するために使用されますが、それはスコアを変更しません。
ピーターテイラー

1
@PeterTaylorええ、どちらを使用するかは決して決められませんがe_、深くフラット化する場合にのみ使用し:~、単一レベルの場合はいつでも使用する傾向があります。
マーティンエンダー



2

Pyth、12バイト

smjk_>hddr8P

それを試してみてください!

代替、12バイト

smjk<_AdGr8P

やってみて!

説明

smjk_>hddr8P
           PQ  # prime factorization (already in correct order) of the implicit input: [3, 3, 11, 101]
         r8    # length encode: [[2, 3], [1, 11], [1, 101]]
 m             # map over the length encoded list (lambda variable: d)
     >hdd      # take the d[0] last elements of d (so only the last for d[0]==1 and all else)
    _          # reverse that list
  jk           # join into a string
s              # conatenate the list of strings


2

Python 2、99バイト

n=input()
r=''
p=2
while~-n:
 e=0
 while n%p<1:e+=1;n/=p
 r+=str(p)*(e>0)+str(e)*(e>1);p+=1
print r

オンラインでお試しください!

入力がbelow 2147483659に制限されている場合、両方とも6バイトを節約str(...)することで置き換えることができ`...`ます(このプログラムは、とにかく影響を受ける数値に対しては非常に遅くなります!)。



1

Japt、19バイト

k ó¥ ®¯1 pZlÃc fÉ q

オンラインでテストしてください!

説明

 k ó¥  ®   ¯  1 pZlà c fÉ  q
Uk ó== mZ{Zs0,1 pZl} c f-1 q  // Ungolfed
                              // Implicit: U = input number
Uk                            // Break U into its prime factors.
   ó==                        // Group into runs of equal items.
       mZ{         }          // Map each item Z in this to
          Zs0,1               //   Z.slice(0, 1) (the array of the first item),
                pZl           //   with Z.length added at the end.
                              // This returns an array of prime-exponent pairs (Jelly's ÆF).
                     c        // Flatten.
                       f-1    // Filter to the items X where X - 1 is truthy (removes '1's).
                           q  // Join the resulting array into a single string.
                              // Implicit: output result of last expression


0

C#、206100バイト

n=>{var r="";for(int d=1,c;++d<=n;){c=0;while(n%d<1){c++;n/=d;}r+=c>0?d+(c>1?c+"":""):"";}return r;}

フル/フォーマット済みバージョン:

using System;

class P
{
    static void Main()
    {
        Func<int, string> func = n =>
        {
            var r = "";
            for (int d = 1, c; ++d <= n;)
            {
                c = 0;
                while (n % d < 1)
                {
                    c++;
                    n /= d;
                }

                r += c > 0 ? d + (c > 1 ? c + "" : "") : "";
            }

            return r;
        };

        Console.WriteLine(func(4));
        Console.WriteLine(func(6));
        Console.WriteLine(func(8));
        Console.WriteLine(func(48));
        Console.WriteLine(func(52));
        Console.WriteLine(func(60));
        Console.WriteLine(func(999));
        Console.WriteLine(func(9999));

        Console.ReadLine();
    }
}

0

Javascript-91バイト

(x,r='',i=1,n)=>{while(x>i++){for(n=0;x%i<1;n++)x/=i;r+=(n>0?i+'':'')+(n>1?n:'')}return r}

説明

(x,r='',i=1,n)=>(          // input x is the number to process, r, i, n are default values only
    while(x>i++){          // iterate over i until x
        for(n=0;x%i<1;n++) // iterate over n until i is not a factor of x
            x/=i;          // factor i out of x
        r+=(n>0?i+'':'')   // append i to r if n > 0
            +(n>1?n:'')    // append n to r if n > 1
                           // i+'' prevents adding i and n before appending to r
    }
    return r               // return r by comma-operator and arrow function syntax
)

0

Java 8、103文字

非常に簡単なソリューション。

n->{String r="";int d=2,c;while(n>1){c=0;while(n%d<1){c++;n/=d;}if(c>0)r+=d;if(c>1)r+=c;d++;}return r;}

ゴルフをしていない:

private static Function<Integer, String> f = n->{
    String result = "";
    int divisor = 2, count;
    while (n>1) {
        count = 0;
        while (n % divisor < 1) {
            count++;
            n /= divisor;
        }
        if (count > 0) result += divisor;
        if (count > 1) result += count;
        divisor++;
    }
    return result;
};


0

オクターブ、69バイト

@(a)printf('%d',(f=[[~,c]=hist(b=factor(a),d=unique(b));d](:))(f~=1))

オンラインでお試しください!

最終的にはかなり長くなりましたが、これにより目的の出力が生成されます。

基本的に、ヒストグラム関数を使用して、入力値の素因数分解における一意の値の出現回数をカウントします。

  • factor()関数の結果は、昇順で素因数を与えます
  • 次にunique()、その配列内の値を見つけます
  • hist() 出現回数を返します

2つの配列(1つは一意のファクター用、1つはカウント用)を作成したら、配列を垂直方向に連結し(一方を他方の上に)、平坦化します。これにより、係数とカウントがインターリーブされます。

最後に、結果を文字列として表示し、最終的な配列の1をすべてスキップするようにします。1が表示されるのは、カウントが1である場合のみです。1は決して素因数にはならないからです。この除去は、文字列に変換する前に行われるため、数字の10などには影響しません。




0

R、72バイト

x=rle(pracma::factors(scan()));x$l[x$l<2]='';paste0(x$v,x$l,collapse='')

pracmaTIOにインストールされていないパッケージが必要です。

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