「Piet」の版間の差分
3行目: | 3行目: | ||
==概要== | ==概要== | ||
* 画像の左上の画素から右側に[[実行]]される。 | * 画像の左上の画素から右側に[[実行]]される。 | ||
− | * | + | * 「[[ソースコード]]」にはあらかじめ決められた20色を使用する。 |
* 白黒以外の色から別の白黒以外の色に実行位置が移るとき、その色の組み合わせに対応する[[命令]]が実行される。 | * 白黒以外の色から別の白黒以外の色に実行位置が移るとき、その色の組み合わせに対応する[[命令]]が実行される。 | ||
* 実行位置の次の色への移動は、一定の法則に従って今の色が四方向に連続している領域の「隅」から行われる。 | * 実行位置の次の色への移動は、一定の法則に従って今の色が四方向に連続している領域の「隅」から行われる。 | ||
9行目: | 9行目: | ||
* 画像の外側や黒色の画素には移動できない。 | * 画像の外側や黒色の画素には移動できない。 | ||
* 前に進めなくなったら基本的に時計回りに曲がろうとし、何回曲がっても次の領域に進めなくなったら終了する。 | * 前に進めなくなったら基本的に時計回りに曲がろうとし、何回曲がっても次の領域に進めなくなったら終了する。 | ||
− | * | + | * [[データ]]の保存や計算はすべて[[スタック]]上で行う。 |
− | * | + | * [[スタック]]に数値をプッシュする命令を使用するとき、プッシュされる値として命令の実行直前にいた領域の面積が使用される。 |
ここで述べたのはあくまで概要である。正式な仕様は[http://www.dangermouse.net/esoteric/piet.html 公式ページ]で確認してほしい。 | ここで述べたのはあくまで概要である。正式な仕様は[http://www.dangermouse.net/esoteric/piet.html 公式ページ]で確認してほしい。 | ||
18行目: | 18行目: | ||
右の画像は、与えられた整数が[[コラッツの問題]]の計算で1になるまでのステップ数を計算するPietプログラムである。 | 右の画像は、与えられた整数が[[コラッツの問題]]の計算で1になるまでのステップ数を計算するPietプログラムである。 | ||
− | + | この[[プログラム]]を起動すると、[[整数]]の入力を求められる。 | |
− | + | [[標準入力]]から[[整数]]を入力すると、その整数が[[コラッツの問題]]の計算で1になるまでのステップ数が出力され、 | |
− | + | その後[[改行]]が出力される。 | |
+ | |||
ただし、計算の途中で[[オーバーフロー]]を検知した場合は-1が出力される。 | ただし、計算の途中で[[オーバーフロー]]を検知した場合は-1が出力される。 | ||
==テクニック== | ==テクニック== | ||
ここで紹介するテクニックは、主にPiet[[初心者]]を対象としたものです。 | ここで紹介するテクニックは、主にPiet[[初心者]]を対象としたものです。 | ||
− | + | 中級者以降は自分で考え、芸術的な[[コード]]の作成を目指す方がいいでしょう。 | |
(この記述は中級者以降がここで紹介するテクニックを利用することを禁止するものではありません) | (この記述は中級者以降がここで紹介するテクニックを利用することを禁止するものではありません) | ||
38行目: | 39行目: | ||
* そもそも領域の幅を1ピクセルにし、「どっちの隅」と考える必要をなくす。 | * そもそも領域の幅を1ピクセルにし、「どっちの隅」と考える必要をなくす。 | ||
− | + | また、[[プログラム]]の実行とは関係ない領域を黒で埋めておくと、流れがわかりやすくなるでしょう。 | |
===分岐は2方向にする=== | ===分岐は2方向にする=== |
2014年10月21日 (火) 03:01時点における版
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命令を実行することでも左折できる。スペースに合わせて適切な方を選べばよい。
外部リンク
- DM's Esoteric Programming Languages - Piet -- 公式サイト
- DM氏の難解プログラミング言語 - Piet (和訳版) -- 公式サイトの和訳
- npiet - an interpreter and editor for the piet programming language -- Pietのインタプリタ、Windows版もある