読者です 読者をやめる 読者になる 読者になる

$a(){ a|a& };a

京大生かもしれない

Pietでカラーゴルフ(有彩5色+白)をした

この記事は KMCお絵かき Advent Calendar 2016 - Adventar の 19日目*1の記事です。 前回の記事は @kurimotz による 【クリスマス】「クリスマスケーキ」イラスト/Motz [pixiv] でした。

はじめに 〜経緯〜

KMCでは描け麻雀というものを不定期で行っています。 描け麻雀は、勝者が敗者に好きなお題の絵を描かせることが出来るという麻雀です。 8月頃にこの描け麻雀を行ったのですが、僕が絵を描くのをずっとサボってしまい *2、 この12月に、4ヶ月遅れでこのように提出する運びとなりました。

このときのお題は「輿水幸子」「すずしい」でした。 お題が出されたのは8月だったので、「すずしい」というお題がでるのも頷けます。 8月にとった涼しげな仕事を12月に遅れて幸子が嫌々やらされる…みたいな絵を描くのも頭を よぎったのですが、結局Pietを描いてしまいました。*3

つくったもの

Pietで絵を描くのは過去に何度もやったことがあるので、 今回はいつもと違う制限をつけて描いてみようと思いました。

Pietは 有彩色18色 + 白黒 の計20色 によって 計17の命令が使える高級な言語なのですが、 実は理論上は上手く有彩色5色を選べば、全ての命令が表現できます*4。 プログラミング界隈ではコードゴルフというコードの短さを競う遊びがあり、 Pietではコーデル数の少なさ=コードの短さがよく部内でも競われています。 Pietの場合は別の方面、つまり色数の少なさ(カラーゴルフ)で競うこともできるのですが、 この方面に関してはKMC内ではあまり研究は盛んではなく、 どのようなものが出来るのか気になったのもあり、このようにやってみることにしました。

完成品がこちらです!! f:id:CHY72:20161224000119p:plain 実行すると「すずしい」と出力する、涼しい顔で締め切りを破る輿水幸子です。

(Pietの仕様を十分に満たしたUTF16のPiet処理系で正常に動作します。 (例えば、PietDevでは「要素数の足りないrollでスタックの先頭を消費する」という仕様に沿わない実装があるので動作しません。 未定義な処理は、「何もしない」というのがPietの正しい仕様なのです。dama氏のPidetや 自作のUltraPietでは正常に動作します) )

ひと目で分かる解説

f:id:CHY72:20161224162722p:plain 「いしずす」の順でスタックに積み、最後に逆順に出力しています。

カラーゴルフについて

色が少ないことによって以下のような制約ができます。

  • 黒を使用しない場合、方向転換、終了処理がかなり面倒くさくなる。
  • 基本的に一つの命令は一つの遷移にしか割当たらないので、欲しい命令を実行する時にその色遷移を頑張って作る必要がある。
    • 今回の場合 例えばduplicate命令は黄->紫の遷移でしか表現できない
    • 備考:18有彩色の場合は当然18個の遷移で表現できる
  • 実感として18色フルで使うほうが10倍くらいの情報を詰め込める気がする。
    • 今回の絵くらい大きければ、「もしも締め切りに間に合わなかったら桜の木の下に埋めてもらっても構わないですよ」くらいは詰め込められそう。

一応、色が少ないことで以下のようなメリットはあります。

  • ファイルサイズが小さくなる。
  • 色が多くないのでデザイン的に綺麗なものが出来る*5
  • 達成感がある。

今回の幸子の絵により、5色カラーゴルフは十分に可能であるということは示されたと思います。 今後カラーゴルフをする人口が増えることを望んでいます。

Piet用のお役立ちプログラム

今回の特殊なPietを描くにあたって実装したプログラムを公開します。 まず、絵を一番近いPiet18色に変換するプログラムとして

topietcolor.py · GitHub

をPython3で書きました。 まず下絵を描いてそれを徐々にPietにしていったのでこういうプログラムは大事です。

次に、どの5色を選べば17命令を達成できるかを調べるプログラムとして

search_piet5.cpp · GitHub

C++で書きました。 結果的に17命令を達成できる5色の選び方は4通りあることが分かりました。 このプログラムの結果から使用する5色を決めて書きました。

さいごに

もしも間に合えばこの絵のメイキングについて、 コミックマーケット91の サークル「いっと☆わーくす!」に、 寄稿しようと考えているので、コミケに行かれる方は是非手に取ってくださいまし。

明日*6の12/20のアドベントカレンダーは、@maztani による 【KMCお絵かきAdventCalendar】Illustrator で星輝子 - mz-log です。 彼はめっちゃすごい。

f:id:CHY72:20161224000119p:plain

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.
f:id:CHY72:20161224174930p:plain

*1:5日遅れ…すみません

*2:描いていない間は他の描け麻雀に参加できないという制約はあるのでどんな人でもいずれは描く

*3:Piet絵師自体が絶対的に少ないので描く意味はあるはず!!

*4: (4+3+2+1)*2 > 17

*5:ある事物を表現する時に色は少ないほうがいいですよね

*6:明日…