문제

('1' * N) !~ /^1?$|^(11+?)\1+$/

그물에서, 나는 n> = 0에 맞는이 루비 코드 조각을 발견하여 n이 프라임인지 여부를 결정했습니다. 내가 말할 수있는 바에 따르면, 그것은 Regex와 놀고있는 것처럼 보이지만 그것이 어떻게 작동하는지 전혀 모른다. 누군가가 어떻게 작동하는지 말해 줄 수 있습니까?

도움이 되었습니까?

해결책

이 코드에 대한 긴 설명을 여기에서 찾을 수 있습니다.http://www.noulakaz.net/weblog/2007/03/18/a-regular-expression-to-check-prime-numbers/

다른 팁

이것은 아마도 주제가 아닌 것일 것입니다. 그러나 루비 1.9에서는 다음을 수행 할 수 있습니다.

 require 'mathn'
 38749711234868463.prime?
 => false
require 'prime'

Prime.prime?(4)
# => false

Prime.prime?(5)
# => true

또는:

require 'prime'

Prime.instance.prime?(4)
# => false

Prime.instance.prime?(5)
# => true

또한보십시오 당신이 사용한 가장 훌륭한 정규식은 무엇입니까? (그렇습니다.이 Regexp가 원래 Abigail에 의해 작성되었음을 확인할 수 있습니다. 심지어 그녀가 어떻게 작동하는지 설명했습니다 :)

가장 큰 일반적인 제수 (GCD) :

/^(1+)\1*=\1+$/.match('1' * x + '=' + '1' * y)[1].length

이것과 IS_PRIME ONE은 거의 같은 방식으로 작동합니다. 포기하기 전에 모든 조합을 시도합니다.

이것은 첫 번째 숫자를 짝수 부분으로 분할하려고 시도하고 두 번째 숫자를 하나 이상의 부품과 일치시킵니다. 일치를 찾으면 선택한 부분의 길이를 반환합니다.

아주 좋은 설명이있는 또 다른 블로그 : 유명한 Perl One-Liners가 설명했습니다 (Part III)

1의 문자열의 길이가 복합체 인 경우 문자열은 111111-> 11 11 11과 같은 여러 동일한 하위 문자로 분해 될 수 있습니다.

예를 들어, 11111111111111111111111111111111111111111111111111111111111111 미 할 1111111111111111111111111111 미 할 111111111111111111111 미 할 11111111111111111를까지이며 (11) {5} 또는 (11111) {2} ({2}는 2 번 반복되는 것을 의미합니다. 111111111에는 9 1이 있으며 (111) {3} 일치합니다.

{}의 1과 숫자를 일반화하여 regexp는 다음과 같습니다./(1{2,}){2,}/. 그러나 1 {2,}는 11+로도 쓸 수 있으며 (...) {2,}는 (...) 1+로 다시 쓸 수 있으며, 뒷면은 references와 함께 다시 작성할 수 있습니다.

그만큼 ^1?$ 0 및 1 케이스에 대한 첫 번째 교대 검사에서 부분.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top