AsciiDots - ドットがアスキーアートを移動する神秘的なプログラミング言語

S 20170810 204521

世界中に多数存在するプログラミング言語。PythonやJavaScriptなど人気の言語は、生産性の高さや応用範囲の広さなど、実用的な面に着目して作られています。

本日紹介する「AsciiDots」はそれら実用系とは一線を画すユニークな言語です。

開発者Aaron Janse氏によって作成されたプログラミング言語で、ドット(.)がアスキーアート上の経路を移動することで動作する、ユニークな仕組みを採用しています。

AsciiDotsでのプログラミングに熟練すれば、最終的に以下のようなゲームプログラムを作成できるようになるかもしれません。

/-""$-.
|
\--$"Pick a number between 1 and 255 (inclusive)"\
/------------------------------------------------/
\--$"I will correctly guess that number after no more than 8 tries"\
/---------------------------------------------------------------""$/
\--$"After each of my guesses, respond with: "\
/---------------------------------------------/
\--$"     '2' if I guess too high,"\
/----------------------------------/
\--$"     '1' if I guess too low,"\
/---------------------------------/
\--$"  or '0' if I guess correctly"\
/----------------------------------/
|
|                             /->-\
|         /--------------\ /-[-]| |
#         |           /#1\-~--+[+]|
6         |          /*-{-}*  | | |
4  /2#\   |     /----~-----+--+-+-+-#7-$a_#-$"I won! Good game!"-&
|/{÷}-*---*     *----/     |/-~-/ |
||    |/--+-----+------\   \+-/   |
\>----~#  #     \-?#-*-+----/     |
      |1  1  /$""-$#-/ |          |
      \/  |  ~---------*----------<-821#-.
          \--/

コメントからするに「数当てゲーム」みたいですが、ソースコードに圧倒されます。

AsciiDotsのインストール

AsciiDotsはPythonで作られたプログラミング言語です。事前にPython 3の実行環境を準備した後、以下のようにしてインストールします。

最初にリポジトリをクローンします。

git clone https://github.com/aaronduino/asciidots

clickをインストールすれば準備完了です。

pip3 install click

サンプルプログラムの実行

AsciiDotsのインタプリタは__main__.pyに格納されているため、リポジトリに含まれるサンプルプログラムは以下のように実行できます。

$ python __main__.py ./samples/counter.dots

ただしそのままだと普通にプログラムが実行されるだけでAsciiDotsの醍醐味が味わえません。"-d"オプションを追加して、デバッグモードで実行するのが良いでしょう。

$ python __main__.py ./samples/counter.dots -t 300 -d -a 0.05

デバッグモードでは、ターミナル上にソースコードや、移動中のドットが表示され、プログラムの実行を目で見て確認することが可能です。

最も簡単なプログラム

AsciiDotsの基本はドットが開始点から終了点まで経路に沿って移動するというものです。

例えば開始から終了まで移動する最も簡単なプログラムは以下となります。

. `` プログラムの開始点
| `` ドットが下に移動
| `` さらに下に
& `` プログラムの終了点

また以下のプログラムは少し複雑ですが、基本は同じです。

/-&         `` 終了
|
\-\ /-\
  | | |
/-/ | \-\
\---/   |
        |
        \-. ``開始

実行すると、開始点から終了点までラインに沿ってドットが移動して終わりです。

S 20170810 211801

カウンターの実現

これがカウンターになると急に難しくなります。以下のソースコードは数字を順に増やしていき、結果を標準出力に出力していくというものです。

     /1#-.
     |
   /-+-$#\
   | |   |
  [+]<1#-*
   |     |
   \--<--/
      |
      0
      #
      |
      .

カウンターはリポジトリのサンプルプログラムに含まれていて、次のように実行できます。

$ python __main__.py ./samples/counter2.dots -t 300 -d -a 0.5

ターミナルで実行すると、数字が順に表示され一定数カウントアップしたところで終了します("-t"オプションで決まり、この場合10まで出力されます)。

S 20170810 212714

カウンタープログラムには、以下のような各種命令が使われています。

  • #1 ドットの値として1を代入する
  • [+] 水平方向のドットと垂直方向のドットをプラスする
  • $# コンソールにドットの値を出力する
  • * ドットを分岐する

これだけでは何のことやら…かもしれませんが、公式サイトのリファレンスと、実際に動かしててドットが移動する様子を確認していくうちに、なんとなく意味がわかるかもしれません。

ざっくり説明すると、下側のループで保存される現在値と、真ん中のループで作られる1とを組み合わせて、数字がインクリメントしていく仕組みになっています。右側の"*"でドットが分岐し、左側の"[+]"で足し合わされていくのです。

脱出条件は設定されておらず、無限ループになりそうですが、実際は"-t"オプションで指定したチック数に到達することで終了します。

まとめ

AsciiDotsはソースコードがアスキーアート形式というユニークなプログラミング言語です。"Hello World"的な簡単なプログラムだけではなく、以下のように素数を求める実用的な?プログラムを作成することも可能です。

%$T

        .
        |
        #
        3
        |
        @
        1
        |
/--*--*-<--\
|  |  |   /+----\
|  #  |   v+-0@-~-\
|  2  | /->~*{%}/ |
|  |  | 1  |\-+---/
|  |  | @  ^\ |
\-{+}-+-*  01 |
      | |  ## |
      | v--*+-/
      | |  ||
    /-* |  *+--\
    | T |  ||  |
    # $ # /~/  |
    0 # 1 */   |
    | | | |    |
    \->-+-~----<-#$-2#-.
        \-/


 /--------\
 T        |
 *--------~
 |        |
 \-*----@[=]
   |      |
   \--#1--/

メジャーなプログラミング言語がどれも同じようなシンタックスを採用していて面白みがないと感じる、ベテランプログラマな方は、新しいチャレンジとしてソースコードの解読にチャレンジしてみてはいかがでしょうか。

Hacker Newsでもこのユニークなプログラミング言語に関して、さまざまなコメントが寄せられています。こちらもどうぞ。

スポンサーリンク