sasanqua_neuf      | 概要 | 仕様 | 文法 | 試用 | 完備 | 連絡 | Link |      The Programming Language

仕様(文法を除く)

ここでは,sasanqua_neufの文法を除いた仕様について説明します.文法についてはこちらをご覧ください.

sasanqua_neufの動作を一言で説明すると,

3目並べの対局をして,決着が着いた際に処理を行う,という動作を繰り返す

となります.以下,より詳しく説明します.

変数の定義

以後,各変数の詳細は後述するものとし,先に定義を述べます.
テープ:T とは,添え字を整数とする,整数の配列T[n] (n=0,±1,±2,…) のこととします.
テープ読み位置:Hコード読み位置:Cルーチン限度:L_1,L_2 は,それぞれ整数変数であるとします.
ルーチン:R_1,R_2 とは,それぞれ123456789の順列 嗜好フラグ1~9を値にとる変数 思考フラグ の組とします.たとえば,R_1=(123456789,9),R_2=(987654321,1)などとなります.
終了処理:E_1,E_2 とは,それぞれ1~9を値にとる変数とします.
ゲーム盤:B ,または単に 盤:B とは,0,1,2の3つの数を元とする長さ9の配列B[1],...,B[9]を意味するものとします.(←B[0]がないことに注意してください.)
この盤は,3×3の配列とみなせることに注意しておきます.すなわち,B[m]=B'[(m-1)/3][(m-1)%3]なる二次元配列B'[3][3]を考えることができる,ということです.イメージ的には,

┌┬┬┐
├┼┼┤
├┼┼┤
└┴┴┘

上の枠の中に0,1,2の数を書き込んだものが盤に対応します.この盤の左上(の中身)がB'[0][0],上がB'[0][1],…,下がB'[2][1],右下がB'[2][2]と,それぞれ対応しているとしましょう.このとき,Bを用いて書き直すと,左上から順に
B[1] B[2] B[3]
B[4] B[5] B[6]
B[7] B[8] B[9]
ということになります.
B[m]には,このようにB'[x][y]を考えた場合の幾何学的構造が反映されるものとします.
なお,B[m]の値として0が空白に,1が先手コマに,2が後手コマにそれぞれ対応しますが,詳細は次で説明します.

sasanqua_neufに登場する変数は,上に挙げたものが全てとなります.

※T[n]は,実装上は無限でない場合を含みますので注意してください.コンパイラやインタプリタの製作者は,T[n]のスタックが事前に確保していた範囲を超えた際にメッセージを出すなどの対処を行うことが推奨されます.T[n]の値域についても同様の対処が推奨されます.

3目並べの対局に関する定義

3目並べを行うことを 対局 と言います.以下,対局について説明します.
盤のある一つの0を,1または2で置換することを,手を指す と言います.対局は,先手 (1)と 後手 (2)が交互に手を指すことで進みます.先手・後手が盤のどこに手を指すかは,それぞれのルーチンによって決められ,対局は自動的に進行します.対局開始の時には,盤は0で初期化されています.

先手が一手指したとき,1が上の図の「タテ」「ヨコ」「ナナメ(45°)」のいずれか少なくとも一つの列で3つ揃った場合,先手勝ち となります.同様に,後手が一手指して2が揃った場合,後手勝ち となります.先手勝ちにも後手勝ちにもならず,9マス全てが1または2のいずれかで埋まった場合,引き分け となります.先手勝ち,後手勝ち,引き分けを合わせて 対局終了 と呼びます.

リーチ とは,簡単に言うと相手の手を無視すれば勝てる状態のことです.以下,詳しく説明します.
「タテ」「ヨコ」「ナナメ」のいずれかの3つのマスからなる列であって,先手のコマで2つ埋まっていて,さらに残り一つが空白のものが存在するとき,この列を リーチ列 と呼びます.先手のリーチ列が存在するとき先手は リーチ であると言い,この空白は先手の リーチマス であるといいます.同様に,後手のコマ2つだけが埋まっている列があるとき,後手はリーチであると言い,その空白を後手のリーチマスといいます.

ルーチン とは,上で述べたとおり 嗜好フラグ思考フラグ の組です.先手ルーチンR_1と後手ルーチンR_2があります.

嗜好フラグ(または 優先順位 )とは,後述の思考フラグによって次の一手が定まらないとき,どこに指すかの優先順位を示すもので,1から9までの自然数9個の順列になっています.この順列において,左にある数と対応するマスほど優先順位が高いと解釈します.たとえば,
987654321
という列があった場合,B[9]を最優先し,B[8]を次に優先し,…,他の全てが埋まっているときのみB[1]に指す,ということを意味します.このような解釈が任意の順列に対し適用されるものとします.

思考フラグ とは,1~9の値をとる変数で,以下のf_1,f_2,f_3,f_6に基づく判断を行うかどうかを定めます.

f_1:自分がリーチマスをもつとき,そのマスを埋めることを優先する.
f_2:f_1の判断に加え,相手がリーチ列をもつとき,その列を埋めることを優先する(相手の勝ちを阻止しようとする).
f_3:自分が指すことでリーチになる手を優先する.
f_6:f_3の判断に加え,自分が指したあとにより多くのリーチマスが完成する手を優先する.

思考フラグのは,行う判断f_iの添え字iの和+1になります.たとえば,f_1とf_3を用いる場合,思考フラグの値は1+3+1=5となります.f_1とf_2,f_3とf_6は,それぞれ同時に指定することはできません.(f_2はf_1を含み,f_6はf_3を含みます.)
また,f_3,f_6はf_1を含まないということに注意してください.つまり,f_1を指定せずf_3やf_6を指定した場合,他に勝つ手があるのにそれよりもリーチになる手を優先する場合がある,ということです.

思考フラグに1以外を指定した場合,まず上述の条件に合う手があるか調べます.条件に合う手が存在する場合は,その手を次の手として決定します.条件に合う手が複数あった場合は,それらの中から優先順位によって決めます.条件に合う手がなかった場合,盤の空白の中から優先順位によって決めます.なお,思考フラグの判断を 2つ指定した 場合(5,6,8,9),添え字の小さい条件から判定をして,条件に合う手が見つからない場合に次の条件の判定に移ります.

※f_1に限り,候補が複数ある場合,いずれを選んでもよいとします.

全体の動作

実行時の動作のフローチャートは,次のようになります.

変数の初期化

ルーチンセット:セット不可能のとき→終了

対局

対局終了時の処理(後述)

限度数L_1,L_2のいずれか(または両方)が0→ルーチンセットへ戻る
0でないとき→対局へ戻る

実行時,はじめにT[n],B[1],...,B[9],H,C,L_1,L_2,E_1,E_2の全ての変数は,0に初期化されるものとします.

ルーチンセット時には,次のことを行います.

  1. ソース(ファイルまたはメモリ)にC行が存在しない,もしくはC行が正当な行でない場合,実行を終了します.
  2. ソースのC行目から,ルーチン・限度数・終了処理を読み込みます.
  3. L_1=0の場合:R_1,L_1,E_1を,それぞれ先に読み込んだものによって置き換えます.ただし,読み込んだ限度数が0の場合は,L_1にL_2をセットします.
    L_1≠0かつL_2=0の場合:R_2,L_2,E_2を,それぞれ先に読み込んだものとします.読み込んだ限度数が0の場合は,L_2にL_1をセットします.
  4. Cをインクリメントします.

L_1=0かつL_2=0の場合,L_1≠0になるか実行が終了するまで先手のルーチンセットを行います.つまり,この条件で読み込んだ限度数が0であった場合,後手のセットの前に再び先手のセットが行われます.

対局終了時には,終了処理として以下のことを行います.

  1. 全ての場合共通の処理として,L_1,L_2をデクリメントします.すなわち,L_1をL_1-1に,L_2をL_2-1にします.
    次に,終了の仕方によって異なる処理を示します.
  2. 引き分けの場合:Cの値を,C+T[H]にします.
    先手勝ちの場合:(E_1-1)mod 3の値に応じて処理が変化します.
     (a) (E_1-1)%3 = 0のとき:T[H]をインクリメントします.すなわち,T[H]をT[H]+1にします.
     (b) (E_1-1)%3 = 1のとき:Hをインクリメントします.すなわち,HをH+1にします.
     (c) (E_1-1)%3 = 2のとき:整数入力を要求し,入力された整数をT[H]に格納します.
    後手勝ちの場合:(E_2-1)/3の値に応じて処理が変化します.
     (a) (E_2-1)/3 = 0のとき:T[H]をデクリメントします.すなわち,T[H]をT[H]-1にします.
     (b) (E_2-1)/3 = 1のとき:Hをデクリメントします.すなわち,HをH-1にします.
     (c) (E_2-1)/3 = 2のとき:T[H]の値を出力します.
    E_1,E_2は1から9までの自然数であったことに注意してください.

以上で,文法を除いたsasanqua_neufの仕様が規定されます.ソースの文法に関しては,こちらをご覧ください.

※演算子/および%は,それぞれ整数の割り算の商および剰余を意味します.


sasanqua_neuf      | 概要 | 仕様 | 文法 | 試用 | 完備 | 連絡 | Link |  Valid XHTML 1.0 Transitional 正当なCSSです!