연결 프라임


26

도전:

숫자 만 포함 된 문자열이 제공됩니다. 당신의 임무는 문자열을 형성하기 위해 연결되어야하는 최소 소수의 소수를 출력하는 것입니다. 이것이 불가능하면을 출력하십시오 0.

테스트 사례 :

입력-> 출력 :

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


선행 0이있을 수 있습니까?
Zgarb

예, 선행 0이있을 수 있습니다.
poi830

자릿수 목록을 가져올 수 있습니까?
LegionMammal978

1
선행 0이 있으면 어떻게됩니까?
Dennis

답변:


6

자바 스크립트 (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 덕분에 바이트를 절약했습니다!

설명

단일 문자열을 입력으로 사용합니다. 프라임 확인 방법 (재귀 시험 분할)으로 인해 안전하게 확인할 수있는 최대 개수는 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있습니까?
Neil

5

MATL , 26 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


4

Pyth- 19 17 16 바이트

lhf.AmP_sdTa./zY

테스트 스위트 .


새로운 형태로, 이것은 0과 1을 소수로 계산합니다. 그러나 편집하기 전에는 그렇지 않았습니다.
poi830

1
@ poi830에서 해결했습니다.
Maltysen

2

배시로 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각 소수에 대해 하나씩 라인을 출력하고 라인 a끝에서 종료 합니다 (그래서 printf작업 할 토큰이 있음).

소수성 테스트는이며 factor $n | grep -q ': \w*$', 숫자에 정확히 하나의 소인수가 있는지 여부를 결정합니다.

입력을 재귀 적으로 분할합니다. 왼쪽 절반이 소수이면 각 값에 1을 추가하여 오른쪽 절반의 결과를 필터링합니다. a길이가 0 인 입력을 반환 하면 재귀가 종료됩니다.

마지막으로, 모든 결과를 가져 와서 가장 짧은 것을 찾기 위해 정렬합니다 ( a성공을 표시 하지 않는 것을 무시 ). 삽입 된 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

@Dennis-나는 c최종을 생성하는 것을 좋아한다 0. 그러나 그 풍성한 stderr에 너무 열중하지는 않습니다. 원하는 경우 내 답변을 자신의 기초로 사용하도록 환영합니다.
Toby Speight

2

Mathematica, 142135 바이트

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

보시다시피 Mathematica는이 작업을 위해 제작되지 않았습니다. 자릿수 목록을 가져옵니다.


And@@대신 사용할 수 있습니까 AllTrue? 4-5 바이트를 저장해야합니다.
CalculatorFeline

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

음 ... 133에 오류와 오답을 제공합니다 ... 모든 테스트 사례를 사용 했습니까?
CalculatorFeline

@CatsAreFluffy 골프와 정화.
LegionMammal978
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.