r-statistics-fanの日記

統計好きの現場の臨床医の覚書のようなもの

算数の問題

子供がやってた算数問題

子供が面白い算数の問題をやっていた。

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秒の差は大きい