정규식 (PCRE 풍미), 66 (65🐌) 바이트
두 정규 표현식 천재 인 Martin Ender 와 jaytea 가이 코드 골프에 대한 정규식 솔루션을 작성 했음을 알면서 영감을 얻어서 처음부터 직접 작성했습니다. 유명한 프라임 검사 정규 표현식이 내 솔루션의 어느 곳에도 나타나지 않습니다.
단항 정규식 마술이 당신을 망치고 싶지 않다면 이것을 읽으십시오. 이 마법을 스스로 알아 내고 싶다면 ECMAScript 정규식에서 몇 가지 문제를 해결하는 것이 좋습니다.
- 소수를 일치시킵니다 (정규식 에서이 작업에 익숙하지 않은 경우)
- 2의 거듭 제곱을 맞추십시오 (아직 수행하지 않은 경우). 또는 Prime과 Powers가 포함 된 Regex Golf를 통해 길을 따라 가십시오 . Classic 및 Teukon 문제 세트를 모두 수행하십시오.
N이 거듭 제곱 일 수있는 일정한 상수 (즉, 입력이 아닌 정규식에 지정됨) 인 N의 거듭 제곱과 일치하는 가장 짧은 방법을 찾으십시오 (그러나 필수는 아닙니다). 예를 들어, 6의 거듭 제곱을 일치시킵니다.
N이 일정한> = 2 인 N 번째 거듭 제곱을 일치시키는 방법을 찾으십시오. 예를 들어 완벽한 정사각형을 찾습니다. (워밍업하려면 프라임 파워 와 일치하십시오 .)
올바른 곱셈 문을 찾습니다. 삼각 숫자를 일치시킵니다.
피보나치 수를 일치 시키거나 (나보다 미친 경우), 더 짧은 것을 고수하려면 올바른 지수 표현을 일치 시키십시오 (예열의 경우 2의 거듭 제곱 2의 대수와 일치합니다. – 보너스, 원하는 숫자로 반올림, 원하는 숫자로 반올림 또는 팩토리얼 숫자 (예열시 원초 숫자 와 일치 )
풍부한 숫자를 일치 시키십시오 (나만큼 미친 사람이라면)
요청 된 정밀도로 비이성적 인 숫자를 계산합니다 (예 : 입력을 2의 제곱근으로 나누고 반올림 결과를 일치로 반환)
( 필자가 작성한 정규식 엔진 은 단항 수학 정규 표현식 에서 매우 빠르며 자연수 범위를 테스트 할 수있는 단항 숫자 모드를 포함하지만 단항이 아닌 정규식 또는 단항을 평가할 수있는 문자열 모드도 있기 때문에 도움이 될 수 있습니다 기본적으로 ECMAScript와 호환되지만 선택적 확장 (선택적 확장명 (다른 정규 표현식 엔진이없는 PCRE의 서브 세트 또는 분자식 미리보기를 추가 할 수 있음))이 있습니다.
그렇지 않으면 이 GitHub Gist (경고, 많은 스포일러)를 읽고 읽어보십시오 .ECMAScript 정규식을 추진하여 난이도가 증가하는 자연수 함수를 다루는 여정을 연대 화합니다 (teukon의 퍼즐 세트부터 시작합니다. 여행).
이 문제에 대한 다른 정규식 솔루션과 마찬가지로 입력 값은 포괄 범위를 나타내는 쉼표로 구분 된 이항 단항으로 두 개의 숫자로 제공됩니다. 하나의 숫자 만 반환됩니다. 정규식은 동일한 가장 큰 소수를 공유하는 모든 숫자를 별도의 일치 항목으로 반환하도록 수정 될 수 있지만 가변 길이 lookbehind가 필요 \K
하고 lookahead를 넣거나 일치하는 대신 캡처로 결과를 반환해야합니다.
가장 작은 소수로 반복 암시 적 분할을하는 데 사용 된 기술은 길이가 네 번째 거듭 제곱 한 응답 문자열 인 일치 문자열 에서 사용 된 기술과 동일합니다 .
더 이상 고민하지 않고 :
((.+).*),(?!.*(?=\1)(((?=(..+)(\5+$))\6)*)(?!\2)).*(?=\1)\K(?3)\2$
여기서 시도해 볼 수 있습니다.
그리고 코멘트와 함께 무료 간격 버전 :
# No ^ anchor needed, because this algorithm always returns a
# match for valid input (in which the first number is less than
# or equal to the second number), and even in /g mode only one
# match can be returned. You can add an anchor to make it reject
# invalid ranges.
((.+).*), # \1 = low end of range; \2 = conjectured number that is the
# smallest number in the set of the largest prime factor of each
# number in the range; note, it is only in subsequent tests that
# this is implicitly confined to being prime.
# We shall do the rest of our work inside the "high end of range"
# number.
(?! # Assert that there is no number in the range whose largest prime
# factor is smaller than \2.
.*(?=\1) # Cycle tail through all numbers in the range, starting with \1.
( # Subroutine (?3):
# Find the largest prime factor of tail, and leave it in tail.
# It will both be evaluated here as-is, and later as an atomic
# subroutine call. As used here, it is not wrapped in an atomic
# group. Thus after the return from group 3, backtracking back
# into it can increase the value of tail – but this won't mess
# with the final result, because only making tail smaller could
# change a non-match into a match.
( # Repeatedly divide tail by its smallest prime factor, leaving
# only the largest prime factor at the end.
(?=(..+)(\5+$)) # \6 = tool to make tail = \5 = largest nontrivial factor of
# current tail, which is implicitly the result of dividing it
# by its smallest prime factor.
\6 # tail = \5
)*
)
(?!\2) # matches iff tail < \ 2
)
# now, pick a number in the range whose largest prime factor is \2
.*(?=\1) # Cycle tail through all numbers in the range, starting with \1.
\K # Set us up to return tail as the match.
(?3) # tail = largest prime factor of tail
\2$ # Match iff tail == \2, then return the number whose largest
# prime factor is \2 as the match.
서브 루틴 호출을 서브 루틴의 사본으로 바꾸고 일치를 \ K 대신 캡처 그룹으로 리턴하여 알고리즘을 ECMAScript로 쉽게 포팅 할 수 있습니다. 결과 길이는 80 바이트입니다.
((x+)x*),(?!.*(?=\1)((?=(xx+)(\4+$))\5)*(?!\2)).*(?=\1)(((?=(xx+)(\8+$))\9)*\2$)
온라인으로 사용해보십시오!
참고 ((.+).*)
로 변경 될 수있다 ((.+)+)
(1 내지 66 바이트 크기를 h, 65 바이트의 올바른 기능의 손실없이) -하지만 정규식 지수 느려짐에 폭발.
온라인으로 사용해보십시오! (79 바이트 ECMAScript 지수 감속 버전)