作者: Tsutomu Hiroshima
日時: 2003/5/14(13:06)
廣島です.

> > オリジナルの問題は Trial & Error の過程を経ずに解けました.
> 
> みたいですね。
> 
> ルールを落してしまっていたんですね…。(-_-;
> うむぅ

でもまあ,気づかなかったおかげで,
Trial & Error の過程のコードを書くことになって,
オリジナル以外の問題にも対応できるようになったのだから,
あながち悪いことでもないと思い直しています.<< 自画自賛気味?

Ruby 版の改良場所は

class Puzzle の initialize 関数に 1 行追加

  def initialize(cell = CELL.map { |r| r.map { |c| Cell.new } })
    @cell = cell
    0.upto(5) do |x|
      0.upto(5) do |y|
        (x + 1).upto(5) { |i| same_column(@cell[i][y], @cell[x][y]) }
        (y + 1).upto(5) { |j| same_raw(@cell[x][j], @cell[x][y]) }
      end
    end    
    0.step(4, 2) do |i|
      1.step(3, 2) do |j|
        mate(@cell[i][j], @cell[i][j + 1])
      end
      mate(@cell[i][0], @cell[i][5]) # この行を追加
    end
    1.step(5, 2) do |i|
      0.step(4, 2) do |j|
        mate(@cell[i][j], @cell[i][j + 1])
      end
    end
  end

Scheme 版は(一般公開していないけど),
init-puzzle 関数に 2 行追加 

(define (init-puzzle puzzle)
  (define (make a b)
    (do-list (i a)
             (do-list (j b)
                      (mate (cell-ref puzzle i j)
                            (cell-ref puzzle i (+ j 1))))))
  (do-upto (x 6)
           (do-upto (y 6)
                    (let ((xy (cell-ref puzzle x y)))
                      (do-upto (i (+ x 1) 6)
                               (same-column (cell-ref puzzle i y) xy))
                      (do-upto (j (+ y 1) 6)
                               (same-raw (cell-ref puzzle x j) xy)))))
  (make '(0 2 4) '(1 3))
  (make '(1 3 5) '(0 2 4))
  (do-list (i '(0 2 4)) (mate (cell-ref puzzle i 0)   ; この行と
                              (cell-ref puzzle i 5))) ; この行を追加
  puzzle)



-----------------------------
	廣島 勉
	(tsutomu@...)