Pietの仕様
Pietは二次元の画像データをインタープリターが解釈する言語です。
そのため、ソースコードのように明確な端がなく、いくつかの条件を用いて明示的に終了させる必要があります。
もし、明示的に終了をさせないとそのソースコードは無限ループに陥る可能性があります。
公式の解釈(interpretation)には以下の二つが終了条件が提示されています。
If after eight attempts the interpreter cannot leave its current colour block, there is no way out and the program terminates.
要約:インタプリタがカラーブロックから抜け出せなくなったら終了
If it retraces its route entirely within a white block, there is no way out of the white block and execution should terminate.
要約:ずっとカラーブロックじゃないところを循環してたら終了
どちらに書いてあることもほとんど同じで、これ以上変化する余地がないとみなされた場合は終了すると書いています。
典型的な停止(終了)パターン
以下では典型的な停止パターンを示します。
十字パターン
カラーブロックが十字のパターンです。
これはどの方向から侵入しても必ず停止します。
I字パターン
カラーブロックがI字のパターンです。
これはどの方向から侵入しても必ず停止します。
空白パターン
これは空白だけで停止させるパターンです。
左上、右上、左下、右下の座標は(0,0)
,(4,0)
,(4,4)
,(0,4)
とします。
この時、(0,1)
から右向きに、(3,0)
から下向きに、(4,3)
から左向きに、(1,4)
から上向きに侵入した場合に必ず停止します。
停止パターンの一般化
カラーブロックの場合
カラーブロックの場合、その画像を必ず停止させるのは簡単です。
停止させたいカラーブロックの中で、x座標が最も小さいブロックの左、x座標が最も大きいブロックの右、y座標が最も小さいブロックの上、y座標が最も大きいブロックの下に黒いブロックを置くだけです。ただし、同率がある場合はその同率の中で、もう一つの座標が座標が最も大きいものと小さいものに適応されます。
この例では足(?)ではy座標が最大となるブロックが二つあるので、その中でx座標が最大のものと最小のもののどちらの下にも黒ブロックをおきます。
尻尾ではx座標が最大となるブロックがいくつもあるのですが、その中でも、y座標が最大と最小のブロックの右に黒ブロックをおいています。
白ブロックの場合
白いブロックで停止させる場合は比較的難易度が高いです。
白いブロックで停止させるには、他のカラーブロックに入らずに、ある座標を循環するようなコードを書けばいいです。
おなじ場所を循環するというのは、同じ座標を同じ進行方向で通過したということで判断できます。
もし同じ座標を別に通過したいだと分岐が発生する場合があります。
このような例では(5,5)
と(5,4)
を2回通過していますが、巡回はしてないので停止はしません。
ただ、これ以上白いブロックで停止する例で示すのは少し難しいです。
それどころか循環に入る位置なんかも独特なので私個人として白色のブロックで停止させることはあまりしません。
もし、白で停止させたい場合は手で確認するのが最も確実です。
停止を忘れるとどうなるか
無限ループが発生します。
無限ループを作りたい場合はそのしようを活用すると良いでしょう。