더 나은 '함수'정의를 사용하여 19 바이트 절약
나는 이것이 정규식 전용 언어에 꽤 좋다고 말하고 싶습니다.
기본 lib는 Unary와 Decimal 사이의 변환을 허용하지만 (챌린지 사양에 명시 적으로 10 진수가 명시되어 있으므로 필요) Binary는 지원하지 않습니다. 그래서 120 바이트를 추가하는 스크립트의 일부로 작성해야했습니다.
#import base
b(\d*):(_*)\2_b/b1$1:$2b/b(\d*):(_+)\2b/b0$1:$2b/b(\d+):b/$1/b:b/0/B(_*):1/B$1$1_:/B(_*):0/B$1$1:/B(_*):B/$1/j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/j(\d*),\1\d{0,7}:,?(.*)/,$2,/,((_+)_+),(\2),/,$1,/,(_+),(\1_*),/,$2,/^,(_*),$/d<$1>/j,b:u<(?#input)>b:
온라인으로 사용해보십시오!
개별 정규직.
#import base
b(\d*):(_*)\2_b/b1$1:$2b/
b(\d*):(_+)\2b/b0$1:$2b/
b(\d+):b/$1/
b:b/0/
B(_*):1/B$1$1_:/
B(_*):0/B$1$1:/
B(_*):B/$1/
j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
j(\d*),\1\d{0,7}:,?(.*)/,$2,/
,((_+)_+),(\2),/,$1,/
,(_+),(\1_*),/,$2,/
^,(_*),$/d<$1>/
j,b:u<(?#input)>b:
단계
먼저 'base'라이브러리를 가져와 두 개의 정규 표현식을 제공합니다. u<numbers>
단항으로 변환 하는 것. 그리고 d<unary_underlines>
다시 십진수 로 변환하는 것 입니다. 문제는 base10에 IO가 필요하기 때문입니다.
그런 다음 단항을 이진수로 변환하는 소수의 정규 표현식을 정의합니다.
b(\d*):(_*)\2_b/b1$1:$2b/
b(\d*):(_+)\2b/b0$1:$2b/
b(\d+):b/$1/
b:b/0/
이들 중 첫 번째 b(\d*):(_*)\2_b/b1$1:$2b/
에 대한 검색이 b
임의로 다음 약간 이진수하는 다음 :
,이어서 동일한 밑줄 양을 더한, 마지막으로 다른 밑줄 뒤에 어떤 양 b
.
그런 다음 그 b1
이전의 :
, 및 밑줄의 첫 절반과 마지막의 이진수로 바꿉니다 b
.
따라서 단항을 2로 나눌 수 없는지 확인하고, 그렇다면 1을 2 진수 앞에 추가 한 다음 1을 2로 나눕니다.
두 번째 b(\d*):(_+)\2b/b0$1:$2b/
는 거의 동일하지 않지만 extra를 확인하지 않으므로 _
2로 나눌 수있는 경우에만 일치 하며이 경우 0
대신 앞에 추가 됩니다.
세 번째는 우리가 단항 숫자가 아닌지 확인하고, 그렇다면 이진수를 남기기 위해 패딩을 제거합니다.
마지막은 이진 숫자가 제공되지 않았는지 확인하고이 경우 그냥 떠납니다 0
.
우리가 정의한 다음 Regex 그룹은 바이너리를 단항으로 다시 변환하는 것이며 약간 더 간단합니다.
B(_*):1/B$1$1_:/
B(_*):0/B$1$1:/
B(_*):B/$1/
이 그룹의 첫 번째 그룹 B(_*):1/B$1$1_:/
은 대립 법과 마찬가지로 B
, 다음에 임의의 양의 단항 숫자를 감지합니다 :1
. B
이 경우 한 번에 한 자리 만 검색하기 때문에 일치 여부를 확인하지 않습니다 . 일치하면 이전에 일치 한 단항 자릿수를 두 배로 늘리고 1을 더한 다음 제거합니다.
두 번째 B(_*):0/B$1$1:/
는 첫 번째와 거의 동일 0
하지만1
하고는 단항 숫자를 추가하지 않습니다.
이 중 마지막은 B(_*):B/$1/
이진수가 더 이상 없는지 확인하고, 그렇지 않은 경우 단항을 줄입니다. 대립과 달리 특별한 경우는 필요하지 않습니다.
다음 j
으로 분할 함수로 작동 하는 정규식 을 정의합니다 .
j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
j(\d*),\1\d{0,7}:,?(.*)/,$2,/
첫 번째 j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
는 대부분의 무거운 작업을 수행합니다. 이는 검색 j
임의로 "증 분기"이다 이진수 뒤에 다음 콤마는 정확히 8 이진수이 후, 이진수의 나머지 뒤에 증 분기 하였다 :
. 8 자리 숫자 중 첫 번째 자리가 증 분자에 추가되어 증분 된 다음 이진 입력에서 8 자리 이외의 모든 것이 :
다음 a 뒤에 추가됩니다 ,
. (우리가 대신 8의 두 자리 숫자를 사용한다면) 그래서 j,1001:
될 것입니다 j1:1001:,01
후 j10:1001,01,11
. 또한 추가 된 배열 요소는 B
s 로 래핑되어 다시 단항으로 변환됩니다.
다른 하나 j(\d*),\1\d{0,7}:,?(.*)/,$2,/
는 증분 후 점검 할 이진 숫자가 8 개 미만인지 확인하고,있는 경우 ,
s로 래핑 된 배열 이외의 모든 항목을 제거합니다 . 예 :,_,___,
배열을 만드는 동안과 후에 우리는 비교 정규 표현식을 정의합니다.
,((_+)_+),(\2),/,$1,/
,(_+),(\1_*),/,$2,/
이들 중 첫 번째는 ,((_+)_+),(\2),/,$1,/
쉼표를 확인한 다음 쉼표보다 약간의 밑줄, 쉼표, 쉼표, 첫 번째 밑줄을 확인합니다. 그런 다음 ,
s로 둘러싸인 첫 번째 요소의 총 밑줄 수로 바꿉니다 .
후자 ,(_+),(\1_*),/,$2,/
는 쉼표를 확인한 다음 일부 밑줄, 다른 쉼표, 같은 금액 이상의 밑줄 및 마지막 쉼표를 확인합니다. 대신 올바른 요소가 남습니다.
마지막으로 일치하는 요소가 왼쪽에 있으면 ^,(_*),$
주변 쉼표를 제거하고 다음을 통해 십진수로 다시 변환합니다.d<>
합니다. 그런 다음 더 이상 정규 표현식을 실행할 수 없으며 출력이 표시됩니다.
입력은 처음에 템플릿에 배치됩니다. j,b:u<(?#input)>b:
먼저 소수 입력을 단항으로 변환합니다 (예 : 5
->) j,b:_____b:
, 결과 단항을 이진수로 변환 한 j,101:
다음 이진을 분할하고 (이 예제에서는 작동하지 않음) 가장 큰 요소를 가져옵니다. 십진수로 돌아가서 끝났습니다.