소수로 분해


14

integer가 주어지면 nn을 소수 목록으로 쓸 수있는 방법의 수를 반환하십시오. 예를 들어, 2323같이 쓸 수있다 (2,3,23), (23,23)또는 (2,3,2,3)또는 (23,2,3)당신이 출력 것, 그래서 4. 이런 식으로 쓸 수 없으면을 출력해야합니다 0.

이 문제 와 같은 소수 019또는 00000037유효한 소수입니다.

테스트 사례 :

5 -> 1
55 -> 1 
3593 -> 4 (359 and 3, or 3 and 593, or 3 and 59 and 3, or 3593)
3079 -> 2 (3 and 079, or 3079)
119 -> 0 
5730000037 -> 7 (5,7,3,000003,7, 5,7,3,0000037, 5,73,000003,7, 5,73,0000037, 5,73000003,7, 5,7,30000037, 5730000037)
0-> undefined (you do not have to handle this case)

이것은 이므로 각 언어에서 가장 짧은 바이트 단위의 대답이 이깁니다!

편집 : 이제 다음에 샌드 박스를 사용해야하는 이유를 알고 있습니다.


답변:


7

하스켈 , 96 89 바이트

H.PWiz의 원시성 테스트로 5 바이트 절약

p x=[1|0<-mod x<$>[2..x]]==[1]
f[]=1
f b=sum[f$drop i b|i<-[1..length b],p$read$take i b]

온라인으로 사용해보십시오!

설명

가장 먼저 할 일은 소수 정의를 사용 하여 윌슨 정리를 사용 하여 소수 테스트 함수 만드는 것입니다 .

p x=[1|0<-mod x<$>[2..x]]==[1]

그런 다음 정의를 시작하십시오 f. 이 문제를 볼 때 가장 먼저 생각한 것은 동적 프로그래밍을 사용하는 것이 었습니다. 그러나 동적 프로그래밍은 바이트 비용이 들기 때문에 "가상 동적 프로그래밍"알고리즘을 사용합니다. 동적 프로그래밍에서는 Directed Acyclic 그래프를 메모리에 저장하지만 재귀를 사용하고 필요할 때마다 각 노드를 다시 계산합니다. 동적 프로그래밍의 모든 시간 이점을 잃어 버렸지 만 이것이 관심있는 입니다. (여전히 무차별 대입 검색보다 낫습니다)

알고리즘은 다음과 같습니다 . 각 노드가 숫자의 하위 문자열을 나타내는 Directed Acyclic Graph L을 구성합니다 . 특히 L i 는 입력 의 마지막 i 자리를 나타냅니다 ( n 이라고 부릅니다 ).

우리는 정의 L 0 1 값과 서로 값 갖도록 L을 각각의 합 갖도록 L의 J 되도록 J <I 및 문자열 N 에서 I 까지 , j는 소수이다.

또는 공식에서 :

공식

그런 다음 L 의 가장 큰 지수에서 값을 반환합니다 . ( L k 여기서 kn 의 자릿수입니다 )


6

젤리 , 8 바이트

ŒṖḌÆPẠ€S

온라인으로 사용해보십시오!

Leaky Nun
덕분에 -1 바이트 Dennis에게 감사 -1 바이트

설명

ŒṖḌÆPẠ€S  Main Link
ŒṖ        List Partitions (automatically converts number to decimal digits)
  Ḍ       Convert back to integers (auto-vectorization)
   ÆP     Are they primes? (auto-vectorization)
     Ạ€   For each, are they all truthy (were the numbers all primes?); 1/0 for truthy/falsy
       S  Sum; gets number of truthy elements

나는 05AB1E가 이것을 쉽게 할 수 없다는 것을 알았습니다. 파티션은 훌륭한 명령처럼 보입니다.
Magic Octopus Urn

5

Brachylog , 10 바이트

ṫ{~cịᵐṗᵐ}ᶜ

온라인으로 사용해보십시오!

먼저 입력을 문자열로 변환합니다. {…}ᶜ가능한 출력 수를 계산합니다 .

내부 {…}출력은 에 공급됩니다 ~c. 이 술어의 출력은 연결될 때 입력과 동일하다는 것을 만족시킵니다. 이것은로 입력되며 ịᵐ, 이는 각 문자열이 정수로 변환 된 출력으로 입력되도록 지정합니다. ṗᵐ입력이 소수로 구성됨을 지정합니다.


1
문자열로 변환하거나 다시 변환 할 필요가 없습니다 {~cṗᵐ}ᶜ. 7 바이트이면 충분 합니다. ~c정수에서 제약 조건 산술로 작동 하기 때문에 실제로 느리지 만 이론적으로는 작동합니다.
Fatalize

@Fatalize 나는 그것이 제로 선행 0을 설명하지 못하는 것 같아요
H.PWiz

4

Pyth , 13 바이트

lf.AmP_sdT./`

테스트 스위트.


나는 Pyth를 잘 모르지만 필터링 한 다음 길이를 취하는 대신 필터 대신 for_each를 수행하고 합할 수 있습니까?
HyperNeutrino

@HyperNeutrino는 어떤 차이가 있습니까?
Leaky Nun

확실하지 않습니다, 나는 테스트하지 않았습니다. Jelly (2 바이트 필터가 빠르기 때문에)에 해당하지만 확실하지 않습니다.
HyperNeutrino

@HyperNeutrino 필터는 1 바이트입니다 ...
Leaky Nun


2

파이썬 2 , 161 바이트

lambda n:sum(all(d>1and all(d%i>0for i in range(2,d))for d in v)for v in g(`n`))
g=lambda s:[[int(s[:i])]+t for i in range(1,len(s))for t in g(s[i:])]+[[int(s)]]

온라인으로 사용해보십시오!

이 함수 g는 파티션을 재귀 적으로 생성합니다 (문자열을 입력으로 사용하지만 int 목록을 출력합니다). 나머지 코드의 대부분은 ' d프라임?' 을 구현하는 것입니다 .





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