Sunday, April 13, 2014

数独再び

以前の数独を解くプログラムを書いたが、お粗末だった印象がありました。
この前、とある飲み会で数独の話が出て、数独を制約の問題としてとらえるという話を聞きました。ネットで調べてみると、Sugarを使って解いている人がいる。Sugarなら自分のパソコンにも入っているので試してみようかという気になったけれど、ちょっと味気ないかな。
まずは普通のやり方をやり直してみようと思いました。

数独の問題は9x9のマスにところどころ数字が入っていて、穴埋めをする。ルールは縦横と、その穴が属する3x3の領域のいずれもそれぞれ異なる数字(1から9)を入れる。

問題のテキストは穴のところにに0が書かれているものとして、0の代わりに数字を入れて答えるものとしよう。解き方の手順はこうだ。

まず0のところを探す。もう0がなければ完成、現在の盤が答え。0を見つけたら縦横と3x3の箱を見渡して、使われている数字をリストアップする。そこから候補となる数字のリストを得る。

候補の数字を一個使って、新しい盤を作る。次の0を探す。これを順番に繰り返す。候補が無ければ失敗。

答えが複数ある場合も気になるけれど、とりあえず答えは一個しかないものとして良いだろう。

盤は行列の形で扱っても良いが、一本のベクトルだと思っても良いだろう、ということで後者にした。


def cand(bd, pos):
  px, py = pos/9, pos%9
  i,j = (px/3)*3, (py/3)*3
  s = set([bd[9*x+py] for x in xrange(9)]+[bd[9*px+y] for y in xrange(9)]+ 
          [bd[9*x+y] for x in xrange(i,i+3) for y in xrange(j,j+3)])
  return list(set(range(10))-s)

def solver(b, pos):
  for p in xrange(pos, 81):
    if b[p] == 0:
      for c in cand(b, p):
        r = solver(b[:p]+[c]+b[p+1:],p+1)
        if r: return r
      return []
  return b

呼び出すときはまあこんな風に。

solver([0,0,3,0,2,0,6,0,0,9,0,0,3,0,5,0,0,1,0,0,1,8,0,6,4,0,0,0,0,8,1,0,2,9,0,0,7,0,0,0,0,0,0,0,8,0,0,6,7,0,8,2,0,0,0,0,2,6,0,9,5,0,0,8,0,0,2,0,3,0,0,9,0,0,5,0,1,0,3,0,0],0)

Haskellでも同じプログラムを書いたので貼付けてみようと思ったのだけど、なんだかうまく行かないんですよね。Haskellでよく使う半角の<ーという記号がダメっぽい。


Saturday, March 15, 2014

AWS Glacierを使う

うちにあるディスクは2TBのディスクのRAID1で、買ってから2年経ちます。iPhotoのデータが数十GBあるのと、子供たちが小さい頃に撮ったビデオのDVDのコピーと、子供のお稽古の発表会のDVDをコピーしたものが50GBほど。まあ仕事が仕事なんで、RAIDそのものがちゃんと動かない場合も心配になってバックアップをしようと思いました。値段から言って、Glacierに入れるのが良いのではないかと思いました。まずはDVDの類いをアップロードしてみました。使ったのはCrossFTP。宛先は東京リージョンのGlacierです。スループットは1MB/secくらいかな。夜中に仕掛けて夜通し転送する感じですね。3夜くらいかかったと思います。CrossFTPも有料版だと複数スレッドでバンド幅が使えるようですが、まあ良いかという感じになってしまいました。S3にいったん入れてからAWSの機能でGlacierに転送する、ということが出来るらしくそちらの方が速いとか。S3にアップロードする為にはCyberduckを使うと良いという話も聞いたのですが、聞いた頃には50GBの転送が終ってました。これでAWSには月に50円くらい払うことになると思います。バックアップがあるからと言ってもRAIDが壊れるまで使おうということにはなりませんよね。まあ正しく1本づつ壊れてくれれば良いのか。

Saturday, February 22, 2014

HDDレコーダー

たぶん2007年の夏頃に買ったPanasonicのDMR-EH75VというHDD+VHS+DVDレコーダーを使っていてどこも悪くならない優秀な機種でしたが、さすがに地デジにも対応していなくて不便という家族の声を受けてAmazonで探していちばん安かったDMR-BR160-Kという機種に買い替えました。同じPanasonicにしたのは前の機種が壊れなかったのと、使いやすかったからですね。今回の設定も非常に簡単でした。しかし、なぜかHDMIケーブルはついておらず、買いに走らなければならなかった。

さて、前のレコーダーは子供が小さかったこともあって家族のビデオなども入っていたのですが、DVDにコピーして取りあえずパソコンのハードドライブに入っています。これは買うことのできないプライスレスなコンテンツなので、どうにかしてバックアップ体勢を確実にしないといけないわけですが、この話は別の機会に。



Sunday, February 09, 2014

San Jose 5泊7日

新しい職場になってから初めてのアメリカ出張。1月下旬の1週間San Joseへ。日曜の夜羽田発、土曜夜羽田着。JALで機体は787でした。今回の時差ぼけは重症でした。まず向こうに行っている間まったく元気がないのはいつものこととしても、日本に帰ってからがひどかったのです。2日間ちゃんと眠れず。いままでになかったことです。


飛行機の中で見た映画"Gravity"が良かった。それと「半沢」を初めて見ましたがなかなか良かったです。

Tuesday, December 31, 2013

五代目 #3

ちょっとショックを受けているのは、プリンタ複合機の見楽るのドライバが今のMacosxではサポートされていないらしいことですね。これがなかなか分からなかった。デフォルトの設定でも、pdfだとか文字だけなら印刷できるのですが、写真などがダメ。今回学んだのはMacをプリントサーバにすることで、三代目をプリントサーバにして(環境設定→プリンタで、「ネットワークでこのプリンタを共有」をチェック入れるだけ)、四代目、五代目からプリンタとして送信するだけなんですが。

三代目の使い方としてはまずまずだけど、プリンタを新調するのが本筋なんでしょうね。今のは電話もついているやつだけど、これは電話として使い続け、プリンタとコピーだけのものを買うのがよいかもしれない。しかしこれは置き場を考えたりするのが面倒だ。Raspberry Piを買って、プリントサーバにするというというのが良いかもしれない‥などと余分なことを考えてます。

Sunday, December 29, 2013

五代目#2

冬休みの宿題だったVirtualboxのWindows7のネットワークとオーディオの件は簡単に片付いた。まずネットワークは、NATのままでよく、NICのドライバをデフォルトのものから適当に変えたらそれだけでつながった。


そのあとWindowsのアップデートをしたら、オーディオも使えるようになっていた。以上。

Saturday, December 28, 2013

五代目

液晶が不調だった三代目MacbookをディスプレイとHappy Hacking Keyboardにつないだのは2011年の震災のあとでした。その後、RAIDつなげるなどして、もう5年以上使っていました。このマシンの使命はParallelsの中で、Windows7を動かすなどなかなか大変。一方で、お父さんは四代目であるMacbookAirを使っていたのでした。

そろそろ三代目の方を更新しようと、Mac miniを買いました。トラックパッドと、DVDプレーヤーもおまけで買った。LCDと、HHKはそのまま使うつもり。RAIDに入っていたTimemachineからのリカバリで、いろいろ楽をさせてもらった。Scan snapも何もしないで使えたし、子供達の設定もそのまま引き継げた。データのコピーは1時間足らずで完了。

問題は、Macosxのバージョンが変わって、Parallelsが動かなくなったことですかね。Virtualboxを入れて、DVDからWindowsのインストールまで来ました。しかし、ネットワークとオーディオが使えていない。先ほどからいろいろ調べていますが、面倒です。冬休みの宿題か。


Sunday, December 15, 2013

イスラエル ハイファ 3泊5日

半年前に行ったときには夢にも思わなかったのですが、また行くことになりました。


ホテルは前回のお隣。こちらの方がランクは上。天気予報は見ていて何だか気温が低そうなのだけど、これは何かのマチガイ、またどうせ熱いだろうから、外のプールで泳ごうかなあ、くらいに思っていたのですが、行ってみたら雨と寒さでそれどころではありませんでした。最終日エルサレムを見に行こうと計画したのですが、エルサレム近辺は大雪で、車にチェーンもないので引き返してきました。

空いた時間にイスラエルフィルの演奏会を聞きに行きました。指揮はZubin Mehta, プログラムはシューベルトのシンフォニー6番、シェーンベルクのオーケストラのための5つの小品、ブラームスのヴァイオリンコンチェルトでソリストはDavid Garettでした。演奏はこの順だったのですが、シェーンベルグになってオケの音がすばらしくツヤツヤに変わったなあという印象。

Monday, December 09, 2013

Haskellメモ:tail, init

tailとinit。それからheadとlast。

Prelude Data.List> init "123"
"12"
Prelude Data.List> tail "123"
"23"
Prelude Data.List> head "123"
'1'
Prelude Data.List> last "123"
'3'

Saturday, November 23, 2013

Haskell メモ:数→文字列、文字列→数

覚えとこ:
Prelude Data.Char> intToDigit 1
'1'
Prelude Data.Char> map intToDigit [1,2,3]
"123"
Prelude Data.Char> read "123" :: Int
123
なので、
Prelude Data.Char> read (map intToDigit [1,2,3]) :: Int
123 
逆は 、
Prelude Data.Char> show 123
"123"