パズル勉強会

パズルプログラミング勉強会

第5課題:ひとりにしてくれ

初版  2001年12月 8日
2版  2003年 3月11日
by パソコン初心者


第5課題は、分断系の「ひとりにしてくれ」になった。

■問題データ: letmealone-sample.data
遊びたい人は、 こびとさんの部屋の『ひとりにしてくれ』を見てください。
なお、十分なデータを用意できておりませんが、 おかゆさん の ひとくれっ! には大量に問題がありますので、参照してみてください。 そこでどんどん解いて遊ぶのもありかと思います。

■プログラムソース: LetMeAlone.C, LetMeAlone.h
とても手抜きのソースなのであるが、とりあえずこれで公開しちゃいます。

■解説:その1
とりあえず、何かいい加減なプログラムでもと思って、作り始めた。いつ作り始めたかも覚えていない。 まあ、何とか動くので解説を書くことにした。

これだけの期間で作ったので、めちゃくちゃ手抜きである。 調べていることといったら極めて簡単である。

  1. タテまたはヨコに同じ数字が2つ並んでいたら、同じタテまたはヨコの列にある同じ数字は黒マスになる。
  2. 黒マスの上下左右は白マスになる。
  3. 白マスと同じ数字が、その白マスを含むタテまたはヨコの列にあるときは、その数字のマスは黒マスになる。
  4. 黒マスの繋がりで分断あれることはない。 というか、あるマスを黒マスにしようとすると、分断されるならば、そのマスは白ますである。
これだけのプログラムを書き、あとは仮定をしながら再帰的に求めている。 初心者なのでそんな面倒なことはしていない。 最後の分断の部分を除けは極めて単純で、結局ルール以上のものは組み込んでいないのである。
$ letmealone letmealone-sample.data [return]
# Vol.2 No. 39
rest=64
 8 2 7 6 7 5 8 3
 1 4 8 5 2 7 6 4
 4 7 1 2 1 3 1 5
 5 3 6 3 4 2 7 2
 6 5 7 8 3 4 4 1
 2 1 3 1 5 8 4 8
 5 8 2 4 3 1 4 7
 7 3 4 5 8 6 2 6


Answer 1
rest=0
8276■5■3
1■8■2764
47■213■5
■36■4■72
65■834■1
2■315■48
5824■1■7
7■45862■

Answer count : 1

$

詳しいことは、日曜日の勉強会(2001/12/9)の時にでも。

2001年12月8日

■解説:その2

というところまで2001年の末に進んでいたのだが、2003年の2月になってから、 ちょっと手を入れて、機能追加した。

問題を解くだけでなく、問題を実際に作るのに役立つように工夫したのである。 現状で、出力は以下のようになっている。

  1. ■:黒マスに決定
  2. 全角数字:白マスに決定
  3. 半角数字:数字が入っているが、未定
  4. ・(中黒):数字がなく、未定
  5. ☆:まだ数字が入っていないけれども白マスに決定
  6. ★:まだ数字が入っていないけれども黒マスに決定

問題作成途中の動作例サンプルデータ: letmealone-make.data

オプションに -g をつけると、黒の連結がどのようになっているかも分かるよう になっている。

$ letmealone letmealone-make.data
# letmealone-make.data
# 問題作成途中データ例
・・・・・
・・・・・
・ 1 1 1・
・・・・・
・・・・・

・・・・・
・☆・☆・
☆■1■☆
・☆・☆・
・・・・・

Answer count : 0


・・・・・
・ 2 2・・
・ 1 1 1・
・・・・・
・・・・・

・・☆・・
・2■☆・
☆■1■☆
・☆☆☆・
・・・・・

Answer count : 0


・・・・・
・ 2 2・・
・ 1 1 1・
・ 3 4 5・
・・・・・

・・☆・・
・2■☆・
☆■1■☆
・345・
・・・・・

Answer count : 0


・ 4 3 5 2
 1 2 2 4 3
 5 1 1 1 4
 2 3 4 5 1
・・・ 4 5

★43■2
12■43
5■1■4
23451
・・2■5

Answer count : 0


 4 4 3 5 2
 1 2 2 4 3
 5 1 1 1 4
 2 3 4 5 1
 3 5 2 4 5


Answer 1
■43■2
12■43
5■1■4
23451
3■2■5

Answer count : 1

という感じで、なんとか動くものをでっちあげた。 実際にこれを使って問題を作ることもしてみたが、確に助かる。

何の高速化もしていないプログラムで、決して速いとは思わないが、それでも ニコリのペンパ本を、1冊10秒以下で解けるので、まあまあかなと思い、 3月9日のパズルプログラミング勉強会で説明しました。

もちろん、勉強会では、1冊1秒以下で解けるプログラムの説明もありました。

2003年3月11日

パズル勉強会