Hatena::Grouphaskell

wanparkの日記

 | 

2007-11-28

Haskellプログラミング(8) ペンシルパズルを解く

http://www.ipsj.or.jp/07editj/promenade/4611.pdf

二コリをよく買っていた時期があったけど、数独とカックロはなんか面倒でいつもとばしてたなー。

d
$ cat data.txt
9
8				3	4		5
		2						1
	1		9
		8			9			6
5				1				8
6			4			7
					1		7
2						1
	9		5	6				2
$ runghc sudoku.hs < data.txt
8	6	7	1	3	4	2	5	9
9	5	2	6	7	8	3	4	1
4	1	3	9	5	2	6	8	7
7	4	8	3	2	9	5	1	6
5	3	9	7	1	6	4	2	8
6	2	1	4	8	5	7	9	3
3	8	6	2	4	1	9	7	5
2	7	5	8	9	3	1	6	4
1	9	4	5	6	7	8	3	2

1マスごとに全数字を試す。反省点

  • 遅い。9x9でぎりぎり
    • 全マスに置ける数字を計算しておく -> 1つの数字しか置けないマスは確定 -> ... とやるとだいぶましになる
  • 引数の最後に Sudoku を渡すパターンは State で書くとよいと思う
  • Maybe を無理やり目に使ってみたけど、ぎこちない
  • Sudoku のデータ構造を外に漏らすな。traverse とか書けばいいんだけど。Traversable っていうのを実装するのが標準的?
  • print デバッグができなくて大変だ。いやテストを書けと

本文読んだ

わかった

nobsunnobsun2007/11/28 23:48Haskell には暗黙の型変換はありません。
length to の型は Int です。mdistance の型は Memo ListTable (String,String) Int
すなわち (String,String) -> State (ListTable (String,String) Int ですので、
return なしでは型があいません。

wanparkwanpark2007/11/29 03:19ありがとうございます。暗黙の型変換はそもそもないんですか。数値リテラルと型変換を混同していたようです。

 |