정규식 (ECMAScript를) 276 205 201 193 189 바이트
ECMAScript 정규식을 사용하여 여러 주요 요소의 다중성 (지수)을 비교하는 것은 흥미로운 문제입니다. 루프의 반복을 통해 지속되는 역 참조가 없기 때문에 모든 것을 계산하기가 어렵습니다. 문제의 수치 적 특성을 세는 것이 가능하더라도,보다 간접적 인 접근은 종종 더 나은 골프를 만듭니다.
다른 ECMA 정규식 게시물과 마찬가지로 스포일러 경고를 제공합니다 . ECMAScript 정규식에서 단항 수학 문제를 해결하는 방법을 배우는 것이 좋습니다. 그것은 나를위한 매혹적인 여정이었습니다. 저는 스스로 그것을 시도하고 싶을 수도있는 사람, 특히 수 이론에 관심이있는 사람들을 위해 그것을 망치고 싶지 않습니다. 스포일러 태그가 붙은 권장 문제를 하나씩 해결하기위한 연속적인 문제 목록은 이 게시물 을 참조하십시오 .
따라서 고급 단항 정규식 마법을 원하지 않는다면 더 이상 읽지 마십시오 . 이 마법을 스스로 파악하는 데 총력을 기울이고 싶다면 위에 링크 된 게시물에 요약 된 ECMAScript 정규식의 일부 문제를 해결하는 것이 좋습니다.
이전에 개발 한 정규식의 주요 페이로드는이 과제에 매우 적합하다는 것이 밝혀졌습니다. 그것이 가장 높은 다중성의 소수를 찾는 정규 표현식입니다 . 그에 대한 나의 첫 번째 솔루션은 매우 긴, 그리고 나중에 첫째, 방법은 아래 단계에서 그것을 golfed 분자 내다를 사용하도록 다시 작성 후, 그리고 다시 일반 인 ECMAScript에 포팅 에 고급 기술을 사용하여 분자 내다 부족 해결 , 이후 원래의 일반 ECMAScript 솔루션보다 훨씬 작게 골라냅니다.
이 문제에 적용되는 정규 표현식의 일부는 첫 번째 단계이며, 모든 주요 요소를 공유하는 N의 가장 작은 요소 인 Q를 찾습니다. 일단이 숫자를 가지면, N이 "일정한 지수"임을 나타 내기 위해해야 할 일은 더 이상 할 수 없을 때까지 N을 Q로 나누는 것입니다. 결과가 1이면 모든 소수가 동일한 다중성입니다.
(내와 동일한 알고리즘을 사용하여 N의 가장 큰 사각없는 요소 찾기 : Q를 찾아 내 이전에 개발 된 알고리즘을 사용하여 답변을 제출 한 후, 나는 그것이 완전히 다른 방식으로 계산 될 수 있음을 깨달았다 카 마이클 번호 정규식 ). 결과적으로, 이것은 분자 표현 부족과 가변 길이 비하인드 (이전에 사용 된 고급 기술을 끌어들일 필요가 없음)를 밟는 데 전혀 어려움이 없으며 * 64 바이트 더 짧습니다! 또한이 솔루션에서 사각없는 N과 소수 N을 다른 특수한 경우로 처리하는 복잡성을 제거하여이 솔루션에서 7 바이트를 더 떨어 뜨립니다.
(여전에는 Q 계산을 내리기 위해 이전에 사용했던 고급 기술이 필요한 다른 문제가 여전히 있지만 현재 PPCG 게시물로 표시되는 문제는 없습니다.)
나는 다중성 테스트를 연속 프라임 테스트 전에 두었다. 왜냐하면 후자는 훨씬 느리기 때문이다. 더 빨리 실패 할 수있는 테스트를 먼저 배치하면 정규 분산 입력에 대한 정규식이 더 빨라집니다. 더 많은 역 참조를 사용하기 때문에 먼저 두 번째 숫자를 사용하면 비용이 더 많이 들기 때문에 골프를 우선으로하는 것이 좋습니다.
몫이 제수보다 크거나 같은 경우 Grimy 가 찾은 트릭을 사용 하여이 정규식 (193 → 189)에서 4 바이트를 삭제할 수있었습니다 .
^(?=(|(x+)\2*(?=\2$))((?=(xx+?)\4*$)(?=(x+)(\5+$))\6(?!\4*$))*x$)(?=.*$\2|((?=((x*)(?=\2\9+$)x)(\8*$))\10)*x$)(?!(((x+)(?=\13+$)(x+))(?!\12+$)(x+))\11*(?=\11$)(?!(\15\14?)?((xx+)\18+|x?)$))
온라인으로 사용해보십시오!
# For the purposes of these comments, the input number = N.
^
# Assert that all of N's prime factors are of equal multiplicity
# Step 1: Find Q, the largest square-free factor of N (which will also be the smallest
# factor of N that has all the same prime factors as N) and put it in \2.
# If N is square-free, \2 will be unset.
(?=
# Search through all factors of N, from largest to smallest, searching for one that
# satisfies the desired property. The first factor tried will be N itself, for which
# \2 will be unset.
(|(x+)\2*(?=\2$)) # for factors < N: \2 = factor of N; tail = \2
# Assert that tail is square-free (its prime factors all have single multiplicity)
(
(?=(xx+?)\4*$) # \4 = smallest prime factor of tail
(?=(x+)(\5+$)) # \5 = tail / \4 (implicitly); \6 = tool to make tail = \5
\6 # tail = \5
(?!\4*$) # Assert that tail is no longer divisible by \4, i.e. that that
# prime factor was of exactly single multiplicity.
)*x$
)
# Step 2: Require that either \2 is unset, or that the result of repeatedly
# dividing tail by \2 is 1.
(?=
.*$\2
|
(
# In the following division calculation, we can skip the test for divisibility
# by \2-1 because it's guaranteed that \2 <= \8. As a result, we did not need to
# capture \2-1 above, and can use a better-golfed form of the division.
(?=
( # \8 = tail / \2
(x*) # \9 = \8-1
(?=\2\9+$)
x
)
(\8*$) # \10 = tool to make tail = \8
)
\10 # tail = \8
)*
x$ # Require that the end result is 1
)
# Assert that there exists no trio of prime numbers such that N is divisible by the
# smallest and largest prime but not the middle prime.
(?!
( # \11 = a factor of N
( # \12 = a non-factor of N between \11 and \13
(x+)(?=\13+$) # \13 = a factor of N smaller than \11
(x+) # \14 = tool (with \15) to make tail = \13
)
(?!\12+$)
(x+) # \15 = tool to make tail = \12
)
\11*(?=\11$) # tail = \11
# Assert that \11, \12, and \13 are all prime
(?!
(\15\14?)? # tail = either \11, \12, or \13
((xx+)\18+|x?)$
)
)
* 분자의 선견지명으로 여전히 깨끗하며 N의 경우 사각이 없습니다. 6 바이트가 줄어들어 195187 183 바이트 솔루션이 생성됩니다.
^(?=(?*(x+))\1*(?=\1$)((?=(xx+?)\3*$)(?=(x+)(\4+$))\5(?!\3*$))*x$)(?=((?=((x*)(?=\1\8+$)x)(\7*$))\9)*x$)(?!(((x+)(?=\12+$)(x+))(?!\11+$)(x+))\10*(?=\10$)(?!(\14\13?)?((xx+)\17+|x?)$))
# For the purposes of these comments, the input number = N.
^
# Assert that all of N's prime factors are of equal multiplicity
# Step 1: Find Q, the largest square-free factor of N (which will also be the smallest
# factor of N that has all the same prime factors as N) and put it in \1.
(?=
(?*(x+)) # \1 = proposed factor of N
\1*(?=\1$) # Assert that \1 is a factor of N; tail = \1
# Assert that tail is square-free (its prime factors all have single multiplicity)
(
(?=(xx+?)\3*$) # \3 = smallest prime factor of tail
(?=(x+)(\4+$)) # \4 = tail / \3 (implicitly); \5 = tool to make tail = \4
\5 # tail = \4
(?!\3*$) # Assert that tail is no longer divisible by \3, i.e. that that
# prime factor was of exactly single multiplicity.
)*x$
)
# Step 2: Require that the result of repeatedly dividing tail by \1 is 1.
(?=
(
# In the following division calculation, we can skip the test for divisibility
# by \1-1 because it's guaranteed that \2 <= \8. As a result, we did not need to
# capture \1-1 above, and can use a better-golfed form of the division.
(?=
( # \7 = tail / \1
(x*) # \8 = \7-1
(?=\1\8+$)
x
)
(\7*$) # \9 = tool to make tail = \7
)
\9 # tail = \7
)*
x$ # Require that the end result is 1
)
# Assert that there exists no trio of prime numbers such that N is divisible by the
# smallest and largest prime but not the middle prime.
(?!
( # \10 = a factor of N
( # \11 = a non-factor of N between \10 and \12
(x+)(?=\12+$) # \12 = a factor of N smaller than \10
(x+) # \13 = tool (with \14) to make tail = \12
)
(?!\11+$)
(x+) # \14 = tool to make tail = \11
)
\10*(?=\10$) # tail = \10
# Assert that \10, \11, and \12 are all prime
(?!
(\14\13?)? # tail = either \10, \11, or \12
((xx+)\17+|x?)$
)
)
여기에 가변 길이 lookbehind로 포팅됩니다.
정규식 (ECMAScript를 2,018) 198 195 194 186 182 바이트
^(?=(x+)(?=\1*$)(?<=^x((?<!^\5*)\3(?<=(^\4+)(x+))(?<=^\5*(x+?x)))*))((?=((x*)(?=\1\8+$)x)(\7*$))\9)*x$(?<!(?!(\14\16?)?((xx+)\12+|x?)$)(?<=^\13+)((x+)(?<!^\15+)((x+)(?<=^\17+)(x+))))
온라인으로 사용해보십시오!
# For the purposes of these comments, the input number = N.
^
# Assert that all of N's prime factors are of equal multiplicity
# Step 1: Find Q, the largest square-free factor of N (which will also be the smallest
# factor of N that has all the same prime factors as N) and put it in \1.
(?=
(x+)(?=\1*$) # \1 = factor of N; head = \1
(?<= # This is evaluated right-to-left, so please read bottom to top.
^x
(
(?<!^\5*) # Assert that head is no longer divisible by \6, i.e. that
# that prime factor was of exactly single multiplicity.
\3 # head = \4
(?<=(^\4+)(x+)) # \4 = head / \5 (implicitly); \3 = tool to make head = \4
(?<=^\5*(x+?x)) # \5 = smallest prime factor of head
)*
)
)
# Step 2: Require that the result of repeatedly dividing tail by \1 is 1.
(
# In the following division calculation, we can skip the test for divisibility
# by \1-1 because it's guaranteed that \2 <= \8. As a result, we did not need to
# capture \1-1 above, and can use a better-golfed form of the division.
(?=
( # \7 = tail / \1
(x*) # \8 = \7-1
(?=\1\8+$)
x
)
(\7*$) # \9 = tool to make tail = \7
)
\9 # tail = \7
)*
x$ # Require that the end result is 1
# Assert that there exists no trio of prime numbers such that N is divisible by the
# smallest and largest prime but not the middle prime.
# This is evaluated right-to-left, so please read bottom to top, but switch back to
# reading top to bottom at the negative lookahead.
(?<!
# Assert that \13, \15, and \17 are all prime.
(?!
(\14\16?)? # tail = either \13, \15, or \17
((xx+)\12+|x?)$
)
(?<=^\13+)
( # tail = \13
(x+) # \14 = tool to make tail = \15
(?<!^\15+)
(
(x+) # \16 = tool (with \14) to make tail = \17
(?<=^\17+)(x+) # \17 = a factor of N smaller than \13
) # \15 = a non-factor of N between \13 and \17
) # \13 = a factor of N
)