平成10年度「KLIC プログラミングコンテスト」課題

9月25日更新
[エントリ・コース]、 [スピード・コース]




「KLIC プログラミングコンテスト」は、第五世代プロジェクトで 開発された並列論理型言語 KL1 で書かれたプログラムを、 以下の3コースについて募集しています。
(1)エントリ・コース
(2)スピード・コース
(3)アイデア・コース

(1)、(2) は与えられた課題の仕様を満たすプログラムが、逐次環境、又 は並列環境で動作するように作成して下さい。

今年度の課題は、「エントリ・コース」と「スピード・コース」で異なります。
以下、「エントリ・コース」、「スピード・コース」の順に課題を説明します。


「エントリ・コース」
課題: 「ライツアウト」

ゲーム「 ライツアウト」の進行を管理するプログラムを作りましょう。この プログラムは、プレーヤーのボタン操作に対応する情報を受け取り、ライトの オン/オフを制御する情報を出力するものとします。


1. ライツアウトについて
2. プログラムについて
2.1 プログラムのインタフェース
3. 審査について
4. 備考

1. ライツアウトについて

ライツアウトの盤面は 5x5 の光るボタンから構成されます(図 1)。ボタンを 押すことによって、盤面の光るボタンのオン/オフが変化します。ゲームの目 的はすべてのボタンを消灯状態にすることです。

                      → Column
                     01234  
                   0■■■■■
                   1■□□□□      □ オン
                ↓ 2■■■■□      ■ オフ
                Row3■■□□□
                   4■■■■□

                図 1. ライツアウト
ボタンを押した時の盤面の変化の規則は以下の通りです。

【規則】

一つのボタンが押された時、そのボタンおよび縦横に隣り合うボタンの状態が 反転します。

具体例で見てみましょう。

ボタンの位置を (Row,Column) で表すとします。(0,4) のボタンを押すと、 (0,3)、 (0,4)、 (1,4) のボタンが反転します(図 2 (a))。

             01234                  01234
           0□□□□□                0□□□■■
           1□□□□□    click(0,4)  1□□□□■
           2□□□□□      →        2□□□□□
           3□□□□□                3□□□□□ 
           4□□□□□                4□□□□□
                           図 2. (a)

             01234                  01234
           0□□□■■                0□□□■■
           1□□□□■    click(2,2)  1□□■□■
           2□□□□□      →        2□■■■□
           3□□□□□                3□□■□□ 
           4□□□□□                4□□□□□
                           図 2. (b)

             01234                  01234
           0□□□■■                0□□□■■
           1□□■□■    click(4,2)  1□□■□■
           2□■■■□      →        2□■■■□
           3□□■□□                3□□□□□ 
           4□□□□□                4□■■■□
                           図 2. (c)

                図 2. ボタンを押した時の盤面の変化
(2,2) のボタンを押すと、 (1,2)、 (2,1)、 (2,2)、 (2,3)、 (3,2) のボタ ンが反転します(図 2 (b))。

(4,2) のボタンを押すと、 (3,2)、 (4,1)、 (4,2)、 (4,3) のボタンが反転 します(図 2 (c))。

今回は、 盤面の初期状態はすべてオンとします(図 5)。

                     01234
                   0□□□□□
                   1□□□□□      □ オン
                   2□□□□□      ■ オフ
                   3□□□□□
                   4□□□□□

                図 5. 盤面の初期状態

2. プログラムについて

2.1 プログラムのインタフェース

応募作品では、モジュール名を lo、述語名を game とする 1 引数の 述語を用意して下さい。

        lo:game(Event)
ここで引数 Event は 2.1.1 で示すインタフェースを持つ入力ストリームです。 出力は、入力ストリームの中で渡される変数に対して行ないます。

2.1.1 入力ストリームのインタフェース

以下で示すメッセージのストリームです。

    ボタンのクリック
      click(Row,Column,Output)
        Row、Column には押されたボタンの位置 (Row,Column) が来る。
        Output は出力のための変数。

    盤面の再描画
      redraw(Output)
        盤面を再描画する。
        Output は出力のための変数。
        (これは、 隠されていたウィンドウが表に出た時など、 盤面をすべて
         書き直す必要がある際の入力。この時、 盤面はすべてオンの初期状
         態になっているとする。)

2.1.2 出力のインタフェース

出力は、出力のための変数に以下の内容を含むリストをバインドします。

      set(Row,Column)
        ボタンをオンにする。(Row,Column) はボタンの位置

      reset(Row,Column)
        ボタンをオフにする。(Row,Column) はボタンの位置
とします。

2.1.3 インタフェースの実例

        lo:game([click(0,4,O1),
                 click(2,2,O2),
                 click(4,2,O3),
                 ...
                 ])

        O1 = [reset(0,3),reset(0,4),reset(1,4)]
        O2 = [reset(1,2),reset(2,1),reset(2,2),reset(2,3),reset(3,2)]
        O3 = [set(3,2),reset(4,1),reset(4,2),reset(4,3)]
        ...

3. 審査について

事務局で用意するテストプログラムを実行し、正しく動作した作品を入賞候補 とします。

4. 備考(関連プログラムを含む)

"Lights Out" は Tiger Electronics, Inc. の商標です。

(この課題はTiger Electronics, Inc. の許可を得て作成しました。 Tigerのゲームについては こちらを御覧下さい。)


課題に関連して、lo:game/1 に追加して実際に遊べるプログラムとするモジュー ルなどが、 随時 WWW/FTP に公開されます。メーリングリストにお知らせが流 れますので必要な場合、登録して下さい。


(ftp されたものは、tar, gzip されています。
 (Mail で受けとる場合はさらに uuencode されています。)
 利用方法等の詳細については, 解凍後 README を参照して下さい。
 なお、希望者には mail にておくります。宛先(klic-contest@icot.or.jp)
 に、「エントリ・コース、添付プログラム希望」とメールして下さい)

  このプログラムは, 変更されることがあります。その際, 変更については, 
本コンテストの応募者のメイリングリストにより通知されます。



「スピード・コース」
課題: 「スケルトン・コンテスト」

実行時に引数として与えられるローマ字からなる単語群の一部を、やはり引数 として与えられる大きさの正方形のマス目の中に並べて、クロスワードパズル の解答のようなものを作る。単語はそれぞれに点数が決められており、使った 単語の点数の合計ができるだけ大きくなるような解を、できるだけ速く作るこ とを目的とする。


1.例
2.単語の並べ方の規則
3.プログラムについて
 3.1 述語のインタフェース
 3.2 プログラミング上の制限
4. 参考(結果表示プログラムなどについて)
謝辞

1. 例

たとえば 9×9 のマス目に対して:

	《単語》	《点数》
	FIFTH		   5
	GENERATION	  17
	KLIC		  13
	SPEED		   4	
	CONTEST		   9
	PROBLEM		   4
	SOLUTION	  15
	YOURS		   3
	WINNER		  21
	OR		   1
	LOSER		   2

という単語群が与えられたとき:

	 012345678
	0■■■■■■■Y■
	1■KLIC■■OR
	2■■■■O■■U■
	3■■WINNER■
	4■■■■T■■S■
	5■■SPEED■■
	6■■■■S■■■■
	7■FIFTH■■■
	8■■■■■■■■■

というのは正しい解のひとつである。■は文字を入れなかったマス。この解の 得点は、用いた単語の点数を合計して
	5 + 13 + 4 + 9 + 3 + 21 + 1 = 56 点

となる。

2. 単語の並べ方の規則

(1) 単語の並べ方は縦 (上→下) 横 (左→右) のいずれかの方向のみで、斜め や下→上、右→左は許されない。 (2) 同じ単語を二度以上使ってはならない。 (3) 単語は全体がひとつながりになっていなければならず、複数の「島」に分 れてはならない。 (4) 同じ行または列に複数の単語を並べるときには、間にひとマス以上空けな くてはならない。 (5) 与えられた単語以外に2文字以上が縦または横に連続してはならない。

3. プログラムについて

 3.1 述語のインタフェース

応募作品では、モジュール名を skeleton、 述語名を solve とする 3 引数の 述語を記述すること。
	skeleton:solve(一辺の長さ、単語リスト、解のストリーム)

第1,第2引数を入力に、解を第3引数のストリームに出力する。

   一辺の長さ: 入力

	正方形の一辺のマス目の数を整数値で与える。20以下とする。

	例) 9

   単語リスト: 入力

	以下のような形式の要素を持つリスト。

		word(識別子、 綴り、 点数)

	識別子は単語を識別するアトム。綴りは8ビット要素の文字列、文字
	数は一辺のマス目の数以下で、要素はすべて英大文字。同じ識別子や
	綴りが二度以上出てくることはない。点数は整数で与えられ、すべて
	正で、負やゼロのものはない。すべての単語の点数を足し合わせても
	オーバフローが起きない範囲である。単語の数は200以下とする。

	例) [	word(fifth, "FIFTH", 5),
		word(gener, "GENERATION", 17),
		word(klic,  "KLIC", 13),
		word(speed, "SPEED", 4),
		word(cont,  "CONTEST", 9),
		word(prob,  "PROBLEM", 4),
		word(solut, "SOLUTION", 15),
		word(yours, "YOURS", 3),
		word(winner,"WINNER",21),
		word(or,    "OR", 1),
		word(loser, "LOSER", 2) ]

   解のストリーム: 出力

	以下の形式で表現した解を要素として持つストリームである。

		[ place(識別子、 行、 列、 方向), ... ]

	識別子は単語リストに示された単語の識別子である。
	
	行、列は単語の開始位置の行と列の番号で、整数値である。行は上か
	ら下、列は左から右に、ゼロから番号づけする。

	方向は縦が tb, 横が lr とする。

	リスト中の順序に意味はない。

	例) [	place(klic,   1, 1, lr),
		place(winner, 3, 2, lr),
		place(speed,  5, 2, lr),
		place(fifth,  7, 1, lr),
		place(cont,   1, 4, tb),
		place(yours,  0, 7, tb),
		place(or,     1, 7, lr)	]

	解はいくつ出力しても構わない。時間内に出力された最後の解の点数
	をプログラムの点数とする。個々の解はストリームに流す前に完全に
	具体化していなければならない。すなわち、未完成で未束縛変数を含
	む項を解として出力してはならない。完全に具体化した解のみを出力
	するためには、解が全部具体化していることを wait ガード述語など
	を用いて確かめた後に、ストリームに出力するようにする方法が考え
	られる。

 3.2 プログラミング上の制限

・C言語のインライン挿入を使ってはならない。 ・ボディ・ゴールの優先順位指定のために、 GOAL@priority(ABSPRIO) の形式は使ってはならない。 優先順位指定では、 GOAL@lower_priority GOAL@lower_priority(RELPRIO) の形式のみ使用してよい。 ・作成する述語およびそこから直接・間接に呼出される述語の中では入出力を 行なってはならない。 ・公開する動作確認プログラム中で使っているモジュール名と同一のモジュー ル名を用いてはならない。

 4. 参考(結果表示プログラムなどについて)

結果表示プログラムは、スピード・コース「スケルトンコンテスト」 参加者に対して、各自が作成したプログラムの動作確認に利用してもらう ために作成された。 なお、このプログラムは、実際に、本プログラムコンテストの選考に 用いられる保証は無い。 また、プログラムコンテストへの応募の際には、 本プログラムを添付しないこと。 結果表示プログラム(ftp)      プログラムの README 参照 → [日本語], [English] (ftp されたものは、tar, gzip されています。  (Mail で受けとる場合はさらに uuencode されています。)  利用方法等の詳細については, 解凍後 README を参照して下さい。  なお、希望者には mail にておくります。宛先(klic-contest@icot.or.jp)  に、「スピード・コース、添付プログラム希望」とメールして下さい) このプログラムは, 変更されることがあります。その際, 変更については, 本コンテストの応募者のメイリングリストにより通知されます。

謝辞


この「スケルトン・コンテスト」のルールは株式会社ニコリ考案のパズルか ら採りました。同ルールの本コンテストへの採用に当って快く許諾してくだ さった同社関係者に感謝いたします。
(c) 1998 NIKOLI inc.