簡単なクイズを解けと。
・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