裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

ナンプレ

2014年12月16日 | ブログラミング

簡単なクイズを解けと。

・2x2 のマス(Box)が縦横ふたつずつ並んだ 4x4 のマスがある
・それぞれのマスには 1~4 の数字が入り、それらは行・列の 4 つのマスに同じ数字がくることはない(行・列の合計は 10 となる)
・2x2 のマス(Box)にも同じ数字がくることはなく、合計は 10 となる
・最初に 1~4 の数字がランダムにひとつずつ設定されている(同じ行・列・Boxに複数の数字が設定されることは無い)

初期状態は csv ファイルで与えられる

sample1.csv

1,0,0,0
0,0,3,0
0,0,0,4
0,2,0,0

sample2.csv

0,0,0,4
0,2,0,0
0,0,3,0
1,0,0,0



solve = function(file.name) {
  m = read.csv(file.name, header=FALSE)
  dimnames(m) = list(1:4, 1:4)
  cat("init\n")
  print(m)
  func = function(i, j) {
    a = which(m[i, j] != 0, arr.ind=TRUE)
    pos[pos[, (a[1]-1)+(a[2]-1)*2+1] == m[i,j][a],]
  }
  library(e1071)
  pos = permutations(4)
  pos1 = func(1:2, 1:2)
  pos2 = func(1:2, 3:4)
  pos3 = func(3:4, 1:2)
  pos4 = func(3:4, 3:4)
  for (i1 in 1:6) {
    a1 = matrix(pos1[i1,], 2)
    for (i2 in 1:6) {
      a2 = matrix(pos2[i2,], 2)
      for (i3 in 1:6) {
        a3 = matrix(pos3[i3,], 2)
        for (i4 in 1:6) {
          a4 = matrix(pos4[i4,], 2)
          a = rbind(cbind(a1, a2), cbind(a3, a4))
          if (all(c(apply(a, 1, function(x) length(table(x)) == 4),
                    apply(a, 2, function(x) length(table(x)) == 4)))) {
            dimnames(a) = list(1:4, 1:4)
            cat("ans\n")
            print(a)
          }
        }
      }
    }
  }
}
solve("sample1.csv")
solve("sample2.csv")

2 問についての所要時間は合計 3.245 秒。
まあまあか?

実行結果

init
  1 2 3 4
1 1 0 0 0
2 0 0 3 0
3 0 0 0 4
4 0 2 0 0

ans
  1 2 3 4
1 1 3 4 2
2 2 4 3 1
3 3 1 2 4
4 4 2 1 3

init
  1 2 3 4
1 0 0 0 4
2 0 2 0 0
3 0 0 3 0
4 1 0 0 0

ans

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

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 約数の個数 | トップ | 10 を作る »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事