わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

三角パズルsolverできちんと求解

三角パズルsolverにコマンドライン引数を与えて解を求めるよう,プログラムを修正しました.三角形の辺の長さ(外周の各辺に置く数字の数)が4の場合,5の場合でそれぞれ,以前のプログラムを書き換え,ファイル名をtrips.rb,trips5.rbに変更して,Gistに置きました.

コマンドライン引数は1つまたは2つです.1つめは和に関する条件で,trips.rbでは6つ,trips5.rbでは9つの整数*1を,カンマまたはセミコロンで区切ります.2つめは初期配置に関する条件で,トップダウンで指定します.和および初期配置の数値について,指定しなかったり,数字以外が書かれていたりしたら,そこは任意となります.なお,1つめの引数に"exam"が含まれているときは,スクリプトに組み込みの例題プログラムを解きます.
初期配置を減らしていくことで,探索終了(解が1つしかないことを確認する)までの時間が大きくなることを,以下のとおり確認できました.最初の出力の最終行,「0:00.17elapsed」は,実行時間0.17秒を意味しますが,OS都合の時間も含まれていますので,「瞬時」と思って差し支えありません.最後は9つの和のみを指定し,初期配置はなしという条件ですが,手元の実行環境では1分21秒ほど要しています.

$ env TIME='%Eelapsed' /usr/bin/time ruby trips5.rb 7,11,23,5,20,15,8,17,14 3,,,6,,4,,8,7,,4,,,,5
==== 7,11,23,5,20,15,8,17,14 (3,*,*,6,*,4,*,8,7,*,4,*,*,*,5) / Solver ====
    3
   5 2
  6 1 4
 2 8 7 6
4 3 6 2 5
0:00.17elapsed

$ env TIME='%Eelapsed' /usr/bin/time ruby trips5.rb 7,11,23,5,20,15,8,17,14 3,,,6,,4,,8,7,,4
==== 7,11,23,5,20,15,8,17,14 (3,*,*,6,*,4,*,8,7,*,4,*,*,*,*) / Solver ====
    3
   5 2
  6 1 4
 2 8 7 6
4 3 6 2 5
0:00.16elapsed

$ env TIME='%Eelapsed' /usr/bin/time ruby trips5.rb 7,11,23,5,20,15,8,17,14 3,,,6,,4,,8,7
==== 7,11,23,5,20,15,8,17,14 (3,*,*,6,*,4,*,8,7,*,*,*,*,*,*) / Solver ====
    3
   5 2
  6 1 4
 2 8 7 6
4 3 6 2 5
0:00.17elapsed

$ env TIME='%Eelapsed' /usr/bin/time ruby trips5.rb 7,11,23,5,20,15,8,17,14 3,,,6,,4,,8
==== 7,11,23,5,20,15,8,17,14 (3,*,*,6,*,4,*,8,*,*,*,*,*,*,*) / Solver ====
    3
   5 2
  6 1 4
 2 8 7 6
4 3 6 2 5
0:00.22elapsed

$ env TIME='%Eelapsed' /usr/bin/time ruby trips5.rb 7,11,23,5,20,15,8,17,14 3,,,6,,4
==== 7,11,23,5,20,15,8,17,14 (3,*,*,6,*,4,*,*,*,*,*,*,*,*,*) / Solver ====
    3
   5 2
  6 1 4
 2 8 7 6
4 3 6 2 5
0:00.50elapsed

$ env TIME='%Eelapsed' /usr/bin/time ruby trips5.rb 7,11,23,5,20,15,8,17,14 3,,,6
==== 7,11,23,5,20,15,8,17,14 (3,*,*,6,*,*,*,*,*,*,*,*,*,*,*) / Solver ====
    3
   5 2
  6 1 4
 2 8 7 6
4 3 6 2 5
0:01.66elapsed

$ env TIME='%Eelapsed' /usr/bin/time ruby trips5.rb 7,11,23,5,20,15,8,17,14 3
==== 7,11,23,5,20,15,8,17,14 (3,*,*,*,*,*,*,*,*,*,*,*,*,*,*) / Solver ====
    3
   5 2
  6 1 4
 2 8 7 6
4 3 6 2 5
0:10.13elapsed

$ env TIME='%Eelapsed' /usr/bin/time ruby trips5.rb 7,11,23,5,20,15,8,17,14
==== 7,11,23,5,20,15,8,17,14 / Solver ====
    3
   5 2
  6 1 4
 2 8 7 6
4 3 6 2 5
1:21.73elapsed

今後の予定としては,初期状態や解を画像として出力すること,ソースをGistではなくGithubに置くことを考えています.

(最終更新:2014-07-24 晩)

*1:数の並びは,これまでのものから変更しています.簡単に言うと,今回の修正版では,左上から左回りに指定します.これにより,get_sumsメソッドの記述がすっきりしました.