다른 해결책
내 생각에 이것은 사이트에서 가장 흥미로운 문제 중 하나입니다. 데드 코드 를 맨 위로 올린 것에 대해 감사해야합니다 .
^((^|xx)(^|\3\4\4)(^|\4x{12})(^x|\1))*$
조건부 나 어설 션이없는 39 바이트 ... 사용중인 대체품 (^|
)는 "첫 번째 반복"과 "첫 번째 반복이 아닌"중에서 선택하는 방식의 조건부 유형입니다.
이 정규식은 다음과 같이 작동합니다. http://regex101.com/r/qA5pK3/1
PCRE와 Python은 정규 표현식을 올바르게 해석하며 n 4 -1 및 n 4 +1을 포함하여 Perl에서 n = 128 까지 테스트되었습니다 .
정의
일반적인 기술은 이미 게시 된 다른 솔루션과 동일합니다. 각 후속 반복에서 순방향 차이 함수 ( D f) 의 다음 항과 동일한 길이를 무제한 수량 자 ( *
)로 일치시키는 자체 참조 표현식을 정의하십시오 . 전진 차분 함수의 공식적인 정의 :
또한 고차 차이 함수도 정의 할 수 있습니다.
또는 더 일반적으로 :
전진 차분 함수에는 많은 흥미로운 속성이 있습니다. 그것은 미분이 연속 함수에 대한 것임을 시퀀싱하는 것이다. 예를 들어, n 차 다항식 의 D f 는 항상 n-1 차 다항식이며, 모든 i 에 대해 D f i = D f i + 1 이면 함수 f 는 지수와 거의 같습니다. e x 의 미분은 그 자체와 같습니다. f = D f 가 2 n 인 가장 간단한 이산 함수입니다 .
f (n) = n 2
위의 해결책을 검토하기 전에 좀 더 쉬운 것으로 시작해 봅시다. 길이가 완벽한 정사각형 인 문자열과 일치하는 정규 표현식입니다. 전진 차분 함수 검토 :
즉, 첫 번째 반복은 길이 1 의 문자열, 두 번째는 길이 3 의 문자열, 세 번째는 길이 5 의 문자열 등과 일치해야하며, 일반적으로 각 반복은 이전의 문자열보다 2 더 긴 문자열과 일치해야합니다. 해당 정규 표현식은이 문장에서 거의 직접적으로 따릅니다.
^(^x|\1xx)*$
첫 번째 반복은 하나만 x
일치하고 이후의 각 반복은 지정된 것과 정확히 일치하는 이전 문자열보다 두 개 더 긴 문자열과 일치한다는 것을 알 수 있습니다 . 이것은 또한 perl에서 놀랍도록 짧은 완벽한 제곱 테스트를 의미합니다.
(1x$_)=~/^(^1|11\1)*$/
이 정규식은 n- gonal 길이 에 맞게 일반화 할 수 있습니다 .
삼각 숫자 :
^(^x|\1x{1})*$
제곱수 :
^(^x|\1x{2})*$
오각형 숫자 :
^(^x|\1x{3})*$
6 각 숫자 :
^(^x|\1x{4})*$
기타
f (n) = n 3
전진 차분 함수를 다시 검토하여 n 3으로 이동 합니다.
이를 구현하는 방법이 즉시 명확하지 않을 수 있으므로 두 번째 차이 함수도 검사합니다.
따라서 앞으로 차이 함수는 상수가 아니라 선형 값으로 증가합니다. D f 2 의 초기 ( ' -1 th') 값 이 0이므로 두 번째 반복에서 초기화를 저장하는 것이 좋습니다. 결과 정규식은 다음과 같습니다.
^((^|\2x{6})(^x|\1))*$
첫 번째 반복은 이전과 마찬가지로 1을 , 두 번째는 6을 더 긴 ( 7 ), 세 번째는 12를 더 긴 ( 19 ) 등과 일치시킵니다 .
f (n) = n 4
n 4 의 순차 차이 함수 :
두 번째 전진 차분 함수 :
세 번째 전진 차분 함수 :
이제는 추악합니다. D f 2 및 D f 3 의 초기 값은 각각 0이 아닌 2 , 12 이며 모두 계산해야합니다. 아마 정규식이 다음 패턴을 따를 것이라는 것을 알았을 것입니다.
^((^|\2\3{b})(^|\3x{a})(^x|\1))*$
때문에 D F 3 의 길이와 일치한다 (12)를 두 번째 반복에서, A는 필수적이다 (12) . 그러나 각 항이 24 씩 증가하므로 다음의 더 깊은 중첩은 이전 값을 두 번 사용해야하며 b = 2 입니다. 마지막으로해야 할 일은 D f 2를 초기화하는 것 입니다. D f 2는 D f에 직접 영향을 미치 므로 궁극적으로 일치시키려는 것이므로이 경우 적절한 원자를 정규식에 직접 삽입하여 값을 초기화 할 수 있습니다 (^|xx)
. 최종 정규 표현식은 다음과 같습니다.
^((^|xx)(^|\3\4{2})(^|\4x{12})(^x|\1))*$
더 높은 주문
5 차 다항식은 다음 정규식과 일치시킬 수 있습니다.
^((^|\2\3{c})(^|\3\4{b})(^|\4x{a})(^x|\1))*$
f (n) = n 5 는 두 번째와 네 번째 전차 함수의 초기 값이 0이므로 상당히 쉬운 운동입니다.
^((^|\2\3)(^|\3\4{4})(^|\4x{30})(^x|\1))*$
6 차 다항식의 경우 :
^((^|\2\3{d})(^|\3\4{c})(^|\4\5{b})(^|\5x{a})(^x|\1))*$
7 차 다항식의 경우 :
^((^|\2\3{e})(^|\3\4{d})(^|\4\5{c})(^|\5\6{b})(^|\6x{a})(^x|\1))*$
기타
필요한 계수가 정수가 아닌 경우 모든 다항식이 정확하게 이런 식으로 일치되는 것은 아닙니다. 예를 들어, n 6 은 a = 60 , b = 8 및 c = 3/2이어야 합니다. 이 경우이 문제를 해결할 수 있습니다.
^((^|xx)(^|\3\6\7{2})(^|\4\5)(^|\5\6{2})(^|\6\7{6})(^|\7x{60})(^x|\1))*$
여기에서 b 를 6으로 , c 를 2 로 변경했는데, 위에서 언급 한 값과 동일한 제품을 갖습니다. 이 제품으로 변경하지 않는 것이 중요 · B · C · ... 제어한다 6 차 다항식을위한 상수 차 함수, D f를 6 . 두 개의 초기화 원자가 있습니다. 하나 는 n 4 와 같이 D f 를 2 로 초기화하고 다른 하나 는 b로 누락 된 두 개를 더하는 동시에 다섯 번째 차이 함수를 360 으로 초기화합니다 .