망막 , 293 + 15 = 308 (314) 385 바이트
;`\s
_
;`\\
/
;`.+
o$0iio
;+`(o(?=/.*(i)|L.*(ii)|V.*(io)|_)|i(?=/.*(io)|L.*(o)|_.*(ii)|V.*(i))).
$1$2$3$4$5$6$7$8
;`o
<empty>
;`ii$
#:0123456789
;+`^(?=i)(i*)\1{9}(?=#.*(0)|i#.*(1)|ii#.*(2)|iii#.*(3)|iiii#.*(4)|iiiii#.*(5)|iiiiii#.*(6)|iiiiiii#.*(7)|iiiiiiii#.*(8)|iiiiiiiii#.*(9))
$1#$2$3$4$5$6$7$8$9$10$11
:.*|\D
<empty>
각 줄은 별도의 파일로 이동하므로 바이트 수에 13을 추가했습니다. 또는 모든 것을 단일 파일에 그대로 놓고 -s
플래그를 사용할 수 있습니다 . <empty>
실제로 빈 파일이나 라인 스탠드.
불행히도 결과를 단항에서 10 진수로 변환하려면 187 바이트가 필요합니다. 나는 정말로 이것을 곧 구현 해야한다고 생각한다 .
설명
Retina는 정규식 기반 언어입니다 (정규식으로 이와 같은 작업을 수행 할 수 있도록 정확하게 작성했습니다). 각 파일 / 라인 쌍은 대체 단계를 정의하며, 첫 번째 행은 패턴이고 두 번째 행은 대체 문자열입니다. 패턴 앞에-로 `
구분 된 구성 문자열이있을 수 있습니다.이 문자열에는 일반적인 정규식 수정 자 및 일부 Retina 특정 옵션이 포함될 수 있습니다. 위 프로그램의 경우 관련 옵션은 ;
해당 단계의 출력을 억제 +
하고 결과 변경이 중지 될 때까지 루프에 대체를 적용합니다.
솔루션의 아이디어는 각 줄을 개별적으로 계산하는 것입니다. 다각형의 내부 또는 외부에서 이미 접한 문자로 항상 결정할 수 있기 때문입니다. 이것은 선의 시작과 끝이 항상 다각형 외부에 있기 때문에 전체 항목을 단일 선으로 결합 할 수 있음을 의미합니다. 우리는 또한주의 할 수있는 _
공간이 라인 청소 알고리즘 완전히 동일하다뿐만 아니라 \
및 /
. 에 의해 그래서 첫 번째 단계로 나는 모든 줄 바꿈과 공백을 대체 _
하고 모든 \
함으로써 /
나중에 몇 가지 코드를 단순화 할 수 있습니다.
문자 i
와로 현재 내부 / 외부 상태를 추적 하고 o
있으며 i
s를 사용 하여 영역을 계산합니다. 이렇게하려면 o
결합 된 선을 앞에 추가 하여 다각형 외부에 있음을 표시합니다. 또한 iio
입력의 맨 끝에를 추가하여 새 문자를 생성하는 조회로 사용할 것입니다.
그런 다음 첫 번째 큰 대체는 단순히 i
또는 o
뒤에 하나 /V_L
의 문자를 다음 문자 세트로 바꾸어 전체를 넘치게합니다. 대체 테이블은 다음과 같습니다. 여기서 열은 해당 행의 마지막 문자에 해당하고 행은 다음 문자 ( S
공백 및 <>
빈 문자열)에 해당합니다. 나는 이미 사용했던 동등성을 보여주기 위해 입력의 모든 문자를 포함시켰다.
i o
/ io i
\ io i
L o ii
V i io
_ ii <>
S ii <>
그러면 마지막 문자는 항상 문자가 다각형 내부 또는 외부에 있는지 여부 를 나타내며 i
s 의 수 는 다각형에 추가해야하는 영역에 해당합니다. 예를 들어 다음은 마지막 예제 입력에서 처음 네 번의 반복 결과입니다 (이것은 실제로 각 라인을 개별적으로 플러딩 한 이전 버전에서 생성되었지만 원칙은 여전히 동일합니다).
o /V\
o / \___
o L _/
o/\/ /V
oL__ _/
o V
o /V\
o / \___
o L _/
oi\/ /V
oii__ _/
o V
o /V\
o/ \___
oL _/
oiio/ /V
oiiii_ _/
o V
o/V\
oi \___
oii _/
oiioi /V
oiiiiii _/
oV
oiV\
oiii \___
oiiii _/
oiioiii /V
oiiiiiiii_/
oio
마지막으로, 나는 o
일치하는 모든 것을 제거하여 모든 s 및 줄 바꿈을 제거 [^i]
하고 나머지는 다소 지루한 십진수 대 단항 변환입니다.