網膜、293 + 15 = 308314 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を追加しました。または、すべてを1つのファイルにそのまま入れて、-s
フラグを使用することもできます。<empty>
実際に空のファイルまたは行の略。
残念ながら、結果を単項から10進数に変換するためだけに187バイトが必要です。近いうちにこれを実際に実装する必要があると思います。
説明
Retinaは正規表現ベースの言語です(正規表現でこのようなことを行えるようにするために正確に記述しました)。ファイル/行の各ペアは置換ステージを定義します。最初の行はパターンで、2行目は置換文字列です。パターンの前に`
-delimited構成文字列を付けることができます。この構成文字列には、通常の正規表現修飾子とRetina固有のオプションが含まれる場合があります。上記のプログラムの場合、関連するオプションは;
、そのステージの出力を抑制する、および+
結果が変化しなくなるまでループ内の置換を適用する、です。
解決策のアイデアは、各行を個別にカウントすることです。なぜなら、ポリゴンの内側にいるか外側にいるかは、すでに遭遇したキャラクターによっていつでも決定できるからです。これは、線の始点と終点が常にポリゴンの外側にあるため、すべてを1本の線に結合できることも意味します。我々はまた、ことに注意することができます_
ラインスイープアルゴリズムのために完全に一致している、などとスペース\
と/
。だから、最初のステップとして、私はすべての改行とスペースを交換_
し、すべての\
ことで/
、後にいくつかのコードを簡素化します。
現在の内側/外側の状態を文字i
とo
で追跡し、同時にi
sを使用して領域を集計します。そのためにo
、ポリゴンの外側にいることを示すために、結合された線にを追加することから始めます。またiio
、入力の最後にを追加します。これは、新しい文字を生成するためのルックアップとして使用します。
次に、最初の大規模な置換は、単純に1つを次の文字セットに置換するi
か、またはo
1つを置換するだけ/V_L
で、全体をフラッディングして集計します。置換テーブルは次のようになります。列はその行の最後の文字に対応し、行は次の文字に対応します(場所S
はスペースと<>
空の文字列です)。入力のすべての文字を含めて、すでに使用した等価性を示しています。
i o
/ io i
\ io i
L o ii
V i io
_ ii <>
S ii <>
最後の文字は、文字の後にポリゴンの内側にあるか外側にあるかを常に示し、i
s の数はポリゴンに追加する必要がある領域に対応することに注意してください。例として、最後の入力例の最初の4回の繰り返しの結果を示します(これは、実際には各行を個別にフラッディングする古いバージョンによって生成されましたが、原理は同じです)。
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]
、残りは10進数から1進数への変換であり、かなり退屈です。