プライムの連結


26

チャレンジ:

数字のみを含む文字列が与えられます。あなたの仕事は、文字列を形成するために連結しなければならない素数の最小数を出力することです。これが不可能な場合、output 0

テストケース:

入力->出力:

252 -> 3
235 -> 2
92 -> 0
31149 -> 2


先行ゼロはありますか?
ズガルブ

はい、先行ゼロがある場合があります。
poi830

数字のリストを取得できますか?
LegionMammal978

1
先行ゼロがあるとどうなりますか?
デニス

回答:


6

JavaScript(ES6)、123 121 120バイト

f=(s,v)=>(p=n=>--n-1?s%n&&p(n):1)(s)||[...s].map((_,i)=>!(n=i&&(a=f(s.slice(0,i)))&&(b=f(s.slice(i)))&&a+b)|n>v?0:v=n)|v

@Neilのおかげで1バイト節約できました!

説明

入力として単一の文字列を受け取ります。プライムチェック方式(再帰試行分割)により、安全にチェックできる最大数は13840です。これを超える数値の一部は、最大呼び出しスタックサイズを超えているため失敗します。ただし、処理できるすべてのケースで即座に終了します。

f=(s,v)=>
  (p=n=>--n-1?s%n&&p(n):1)(s) // if s is prime, return 1
  ||[...s].map((_,i)=>        // else for each index in s, split s into 2
    !(n=i&&                   // v = return value (initialised to undefined)
      (a=f(s.slice(0,i)))&&
      (b=f(s.slice(i)))&&
      a+b
    )|n>v?0:v=n               // if i, a, b and n are all > 0 and !(n > v), v = n
  )|v                         // cast v to an integer and return it

// Test
var testCases = [ "252", "235", "92", "3149", "24747" ];
document.write("<pre>" + testCases.map(c => c + ": " + f(c)).join("\n"));


それは私であるか、変更することができますi?(a=...)&&(b=...)&&a+b:0i&&(a=...)&&(b=...)&&a+b
ニール

5

MATL26 24バイト

0in:"GUtZq@Z^V10ZA=a?x@.

一部のテストケースでは数秒かかります。

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

説明

0       % Push 0
in:     % Take input. Generate array [1,2,...,N] where N is input length
"       % For each. In each iteration the number of used primes is increased
  GU    %   Push input. Convert to number
  tZq   %   Duplicate. Array of primes smaller than the input
  @     %   Push number of primes to bes tested in this iteration
  Z^    %   Cartesian power
  V     %   Convert to 2D array. Each row is a combination of primes
  10ZA  %   Convert each row to base 10, disregarding spaces
  =a    %   Do any of the results equal the input number? 
  ?     %   If so
    x   %     Remove the 0 that's at the bottom of the stack
    .   %     Break for each loop
        %   Implicitly end if
        % Implicitly end for each
        % Implicitly display



2

Bash + coreutils、169 158 149バイト

c()
{
test $1||echo a
for i in `seq ${#1}`
do factor ${1::$i}|grep -q ': \w*$'&&printf b%s\\n `c ${1:$i}`
done
}
c $1|sort|sed '/a/!d;s/..//;q'|wc -c

単項で数え、b各素数ごとに1行を出力し、行aの終わりで終了します(そのため、処理printfするトークンがあります)。

素数性テストはfactor $n | grep -q ': \w*$'であり、これは数に正確に1つの素因数があるかどうかを決定します。

入力を再帰的に分割します。左半分が素数の場合、各値に1を加算して右半分の結果をフィルター処理します。a長さがゼロの入力を返すと、再帰が終了します。

最後に、すべての結果を取得してソートし、最短を見つけます(a成功を示す必要がないものは無視します)。2つ(挿入a用と改行用)を削除してから、文字を数えて結果を出す必要があります。

テスト

$ for i in 252 235 92 31149 111; do echo "$i:"$'\t'"$(./77623.sh $i)"; done
252:    3
235:    2
92:     0
31149:  2
111:    0

111テストに追加して、1正しく非プライムと見なされることを示しました。


私はこれを提案するつもりだった。私の変更の大部分はおそらく今では時代遅れですが、他のものはまだ機能するはずです。
デニス

@Dennis- c最終版を生成するのが好き0です。しかし、豊富な標準エラーにはそれほど熱心ではありません。必要に応じて、私の回答(のバージョン)を独自の基礎として使用してください。
トビー・スペイト

2

Mathematica、142 135バイト

Min[Length/@Select[Join@@@Permutations/@IntegerPartitions@Length[a=#],And@@PrimeQ@*FromDigits/@a~Internal`PartitionRagged~#&]]/.∞->0&

ご覧のとおり、Mathematicaはこのタスク用に構築されたものではありません。数字のリストを取得します。


And@@代わりに使用できますAllTrueか?4〜5バイトを節約する必要があります。
電卓

Flatten[#,1]=Join@@@#
CalculatorFeline

ええと... 133でエラーと間違った答えを与えます...すべてのテストケースを使用しましたか?
電卓

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