算数の問題
子供がやってた算数問題
子供が面白い算数の問題をやっていた。
a b
|a-b|
というように上の2つの差の絶対値が下の数になる。
このルールで、1~10の整数を使ってa~jの表を完成する。
a b c d
e f g
h i
j
問題はe=6の場合の解であった。
とりあえずサクッと解いて、父親の面目は保ったが 、
なんか、虫食い算の時もそうだったけど、無理やり
Rで解きたくなるんだよね。R病かな。
今回は以前速いのに感心したe1071を使用する。
# 算数問題
f1 <- function() {
library(e1071)
s <- permutations(10)
a <- b <- c <- d <- e <- f <- g <- numeric(36288000)
a <- abs(s[, 1] - s[, 2]) == s[, 5]
b <- abs(s[, 2] - s[, 3]) == s[, 6]
c <- abs(s[, 3] - s[, 4]) == s[, 7]
d <- abs(s[, 5] - s[, 6]) == s[, 8]
e <- abs(s[, 6] - s[, 7]) == s[, 9]
f <- abs(s[, 8] - s[, 9]) == s[, 10]
g <- a * b * c * d * e * f
return(s[g == 1, ])
}
system.time(f1())
## Loading required package: class
## user system elapsed
## 2.93 0.39 3.34
f1()
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,] 9 3 10 8 6 7 2 1 5 4
## [2,] 6 1 10 8 5 9 2 4 7 3
## [3,] 8 1 10 6 7 9 4 2 5 3
## [4,] 8 3 10 9 5 7 1 2 6 4
## [5,] 9 10 3 8 1 7 5 6 2 4
## [6,] 6 10 1 8 4 9 7 5 2 3
## [7,] 8 10 1 6 2 9 5 7 4 3
## [8,] 8 10 3 9 2 7 6 5 1 4
ということで、そもそも8種類の解答しか無いことが分かる。
上の書き方で言うと、e or g or h or i = 1,4,6,7の場合、答えが一意に決まるようだ。
しかし、sが277Mbもあってワロタ。
ちなみに以前使用したgtoolsのpermutationsを使うと 死ぬほど時間がかかる。
detach("package:e1071", unload = TRUE)
f2 <- function() {
library(gtools)
s <- permutations(10, 10, set = TRUE, repeats.allowed = FALSE)
a <- b <- c <- d <- e <- f <- g <- numeric(36288000)
a <- abs(s[, 1] - s[, 2]) == s[, 5]
b <- abs(s[, 2] - s[, 3]) == s[, 6]
c <- abs(s[, 3] - s[, 4]) == s[, 7]
d <- abs(s[, 5] - s[, 6]) == s[, 8]
e <- abs(s[, 6] - s[, 7]) == s[, 9]
f <- abs(s[, 8] - s[, 9]) == s[, 10]
g <- a * b * c * d * e * f
return(s[g == 1, ])
}
system.time(f2())
## user system elapsed
## 71.23 0.55 72.06
71秒と3秒の差は大きい