READ + WRITE + TALK = SKILL を満たす解が何通りあるか。
以下のプログラムは,2 番目のものより 10 倍ほど「遅い」。
library(e1071)
d = permutations(10)-1
w = c(1000, 100, 10, 1)
w2 = c(w*10, 1)
ans = apply(d, 1, function(x) all(x[c(1,5,7,10)] != 0) && sum(x[1:4]*w)+sum(x[c(5,1,6,7,2)]*w2)+sum(x[c(7,3,8,9)]*w) == sum(x[c(10,9,6,8,8)]*w2))
sum(ans)
d = d[ans,]
apply(d, 1, function(x) cat(sprintf("%i + %i + %i = %i\n", sum(x[1:4]*w), sum(x[c(5,1,6,7,2)]*w2), sum(x[c(7,3,8,9)]*w), sum(x[c(10,9,6,8,8)]*w2))))
なるべくベクトル演算を使うと速くなる。
library(e1071)
d = t(permutations(10)-1)
w = c(1000, 100, 10, 1)
w2 = c(w*10, 1)
read = colSums(d[1:4,]*w)
write = colSums(d[c(5,1,6,7,2),]*w2)
talk = colSums(d[c(7,3,8,9),]*w)
skill = colSums(d[c(10,9,6,8,8),]*w2)
ans = d[1,]*d[5,]*d[7,]*d[10,] != 0 & read+write+talk == skill
sum(ans)
data.frame(read=read[ans], write=write[ans], talk=talk[ans], skill=skill[ans])
read write talk skill
1 5270 85132 3764 94166
2 2543 72065 6491 81099
3 5180 65921 2843 73944
4 1632 41976 7380 50988
5 5094 75310 1962 82366
6 5096 35710 1982 42788
7 7092 37510 1986 46588
8 7092 47310 1986 56388
9 4905 24689 8017 37611
10 9728 19467 6205 35400