Tetris Esolang

March 9, 2021 · View on GitHub

BNF

<program>    ::= <statements>
<statements> ::= <statement> "\n" | <statements>
<statement>  ::= <tet-move> | <comment> | <label>
<tet-move>   ::= <tetris> <use-order><move>
<comment>    ::= /^#.*/
<label>      ::= /-?[0-9]+:/
<tetris>     ::= /[ILJZSOT]/
<move>       ::= /[><^VAB]*/
<use-order>  ::= "." | ":"

処理

横10 x 高さ20を持つテトリスフィールド上でテトリミノを操作し、テトリスを消すと命令が実行される。

操作は ^,V,>,< が上下左右キーで、Aが時計回りの回転、Bが反時計回りの回転 ワールドルールの回転をする 各テトリミノには use-order が":"の時には固有の命令が書かれているので組み合わせて使う。 use-order が"."の時には何も描かれていない(XXXXの)テトリミノ。

  • I: IXX= (Iの書き方の上から順に)
  • L: LXXM (Lの書き方の上から順に)
  • J: JXX/ (Jの書き方の上から順に)
  • Z: ZXXB (Zの書き方の左上から順に)
  • S: SXXP (Sの書き方の右上から順に)
  • O: OX*X (Oの書き方の右上から順に)
  • T: +XX- (Tの書き方の左上から順に)

テトリミノの操作は tet-move を上から順に実行していく。

brainfuckのように内部的に無限長の数値型(実装依存:js実装ではNumberも可)の配列Aを持っており、それにアクセスするための数値型のPがある。最初はAの要素はすべて0で初期化されている。また、最初はP=0である。

高さ20を超えてしまった場合、テトリスが終了するのでプログラムも(正常)終了する。実行できる命令がない場合も終了する。

演算結果は変数R(型は実装依存の数値型)に格納される。

テトリスを消すと通常のテトリスで加算される得点がRに格納される。nライン削除でR=100*n

Tスピンなどの追加得点は存在しない。あくまでnライン削除でR=100*nのみ。

テトリスの出現位置について その後削除されたテトリミノの左上から順に命令を実行する。一番上の行を左から実行し終えたら次の行を実行...という流れ。

  • X:Nop
  • I: 標準入力から1文字取ってRをそのユニコード値にする。EOFではR=-1となる。
  • O:標準出力にRの値をユニコード値として出力。
  • J:ラベル R にジャンプ。複数同じラベルがある場合はプログラム実行前にエラーをだす。ラベルが存在しない場合はジャンプしない。
  • Z: P = 0 . Zero.
  • P: P += R. ポインタを動かす。Pointer.
  • L: R = A[P] .Load.
  • S: A[P] = R. Store.
  • +-*/= : よくある二項演算 (=は宇宙船演算)。R = R op A[P]
  • M: R = -R . Minus.
  • B: テトリスフィールドをすべて削除し、以降の命令は実行されない。Bomb.