R の for の特性を生かせば,f5 は f6 のようにできる。そして,f6 は f5 より速い。あっという間に答えが出る。
関数の中で base::setdiff を最適化したものを使うようにしている。そのようにしないと(base::setdiff を使うと)むしろ f5 より遅くなる。
f6 = function() {
setdiff = function (x, y) {
x[match(x, y, 0L) == 0L]
}
m = 1L
o = 0L
domain = 2:9
for (s in domain) {
domain2 = setdiff(domain, s)
for (e in domain2) {
domain3 = setdiff(domain2, e)
for (n in domain3) {
domain4 = setdiff(domain3, n)
for (d in domain4) {
domain5 = setdiff(domain4, d)
for (r in domain5) {
domain6 = setdiff(domain5, r)
for (y in domain6) {
if (sum(10^(3:0)*c(s+m, e+o, n+r, d+e)) == sum(10^(4:0)*c(m, o, n, e, y))) {
cat(sprintf("%s%s%s%s + %s%s%s%s = %s%s%s%s%s\n",
s, e, n, d, m, o, r, e, m, o, n, e, y))
}}}}}}}}
※コメント投稿者のブログIDはブログ作成者のみに通知されます