Piet
概要編集
- 画像の左上の画素から右側に実行される。
- 「ソースコード」にはあらかじめ決められた20色を使用する。
- 白黒以外の色から別の白黒以外の色に実行位置が移るとき、その色の組み合わせに対応する命令が実行される。
- 実行位置の次の色への移動は、一定の法則に従って今の色が四方向に連続している領域の「隅」から行われる。
- 上記にかかわらず、白色の画素では実行位置は直進する。
- 画像の外側や黒色の画素には移動できない。
- 前に進めなくなったら基本的に時計回りに曲がろうとし、何回曲がっても次の領域に進めなくなったら終了する。
- データの保存や計算はすべてスタック上で行う。
- スタックに数値をプッシュする命令を使用するとき、プッシュされる値として命令の実行直前にいた領域の面積が使用される。
ここで述べたのはあくまで概要である。正式な仕様は公式ページで確認してほしい。
例編集
右の画像は、与えられた整数がコラッツの問題の計算で1になるまでのステップ数を計算するPietプログラムである。
このプログラムを起動すると、整数の入力を求められる。 標準入力から整数を入力すると、その整数がコラッツの問題の計算で1になるまでのステップ数が出力され、 その後改行が出力される。
ただし、計算の途中でオーバーフローを検知した場合は-1が出力される。
テクニック編集
ここで紹介するテクニックは、主にPiet初心者を対象としたものです。 中級者以降は自分で考え、芸術的なコードの作成を目指す方がいいでしょう。 (この記述は中級者以降がここで紹介するテクニックを利用することを禁止するものではありません)
フローをわかりやすくする編集
Pietの仕様上、次に移動する領域は実行の向きだけでなくCodel Chooserと呼ばれるパラメータにも依存するので、 普通にプログラムを組もうとすると実行の向きとCodel Chooserの両方を意識しないといけません。 しかし、それでは大変です。
そこで、以下のような方法で次に実行される向きがCodel Chooserに依存しないようにするとプログラムは組みやすくなります。
- 進行方向の一方の隅の先を黒で塞ぎ、もう一方にしか移動できない状態にする。
- 進行方向のどっちの隅の先に行っても次が同じ領域になるようにする。
- そもそも領域の幅を1ピクセルにし、「どっちの隅」と考える必要をなくす。
また、プログラムの実行とは関係ない領域を黒で埋めておくと、流れがわかりやすくなるでしょう。
分岐は2方向にする編集
pointer命令を使用すると実行が進む方向を変えることができるが、 ここに任意の整数が渡される可能性を作ると流れがわかりにくくなるかもしれない。
そこで、pointer命令の直前でnot命令を使用すると、pointer命令に渡される整数が0か1に限られるため、 0なら直進、1なら右折となり、流れがわかりやすくなる。 また、greater命令や2で割ったあまりなど、他にも結果が0か1に限られる状況は存在する。
左折する編集
Pietの仕様上、まっすぐ進めなくなった時は右折する。 しかし、時には左折したいこともあるだろう。
白い領域上で左折するときは、以下の図のように画素を配置すると矢印の向きに左折できる。 他の方向は適宜このパターンを回転させれば良い。
?↑?? →□□■ ■□□? ??■?
ただし、■は黒い画素を、□は白い画素を表す。矢印の場所は白でも黒以外の色がついていてもいい。?はどの色でもいい。
また、3をpushしてpointer命令を実行することでも左折できる。スペースに合わせて適切な方を選べばよい。