더 나은 '함수'정의를 사용하여 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. 또한 추가 된 배열 요소는 Bs 로 래핑되어 다시 단항으로 변환됩니다.
다른 하나 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:다음 이진을 분할하고 (이 예제에서는 작동하지 않음) 가장 큰 요소를 가져옵니다. 십진수로 돌아가서 끝났습니다.