FOODS4ALL HOME
Last Update: 2020-04-17

1〜9までの相異なる二つの数字があり、一方は5桁、他方は4桁で、差が、3333となる数をみつける引き算の覆面算からヒントを受けて、このタイプの問題を考えてみたい。

\[ \begin{array}{cccccc} \mbox{} & A & B & C & D & E\\ -)& & F & G & H & I\\ \hline & 3 & 3 & 3 & 3 & 3 \end{array} \quad\Rightarrow\quad \begin{array}{cccccc} \mbox{} & 4 & 1 & 2 & 6 & 8\\ -)& & 7 & 9 & 3 & 5\\ \hline & 3 & 3 & 3 & 3 & 3 \end{array} \quad \begin{array}{cccccc} \mbox{} & 4 & 1 & 2 & 8 & 6\\ -)& & 7 & 9 & 5 & 3\\ \hline & 3 & 3 & 3 & 3 & 3 \end{array} \]

問い

  1. 同じ構造で、33333 の部分のみを変えて、答えが1種類になるものは、どの程度あるのか。
  2. 最大の個数答えがあるものは、どのようなもので、いくつぐらいあるのか。
  3. 答えの個数は、どのような分布になっているのか。

Code

library(gtools)
library(tidyverse)
## ─ Attaching packages ───────────────────────────── tidyverse 1.3.0 ─
## ✓ ggplot2 3.3.0     ✓ purrr   0.3.3
## ✓ tibble  3.0.0     ✓ dplyr   0.8.5
## ✓ tidyr   1.0.2     ✓ stringr 1.4.0
## ✓ readr   1.3.1     ✓ forcats 0.5.0
## ─ Conflicts ─────────────────────────────── tidyverse_conflicts() ─
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
perm <- permutations(9,9,v=1:9)
colnames(perm) <- LETTERS[1:9]
p <- as_tibble(perm)
# dim(perm)
# factorial(9)
p <- p %>% mutate(first = A * 10^4 + B * 10^3 + C * 10^2 + D * 10 + E, 
                  second = F * 10^3 + G * 10^2 + H * 10 + I, diff = first - second)
# head(p)
p %>% group_by(diff) %>% mutate(count = n()) %>% summary()
##        A           B           C           D           E           F    
##  Min.   :1   Min.   :1   Min.   :1   Min.   :1   Min.   :1   Min.   :1  
##  1st Qu.:3   1st Qu.:3   1st Qu.:3   1st Qu.:3   1st Qu.:3   1st Qu.:3  
##  Median :5   Median :5   Median :5   Median :5   Median :5   Median :5  
##  Mean   :5   Mean   :5   Mean   :5   Mean   :5   Mean   :5   Mean   :5  
##  3rd Qu.:7   3rd Qu.:7   3rd Qu.:7   3rd Qu.:7   3rd Qu.:7   3rd Qu.:7  
##  Max.   :9   Max.   :9   Max.   :9   Max.   :9   Max.   :9   Max.   :9  
##        G           H           I         first           second    
##  Min.   :1   Min.   :1   Min.   :1   Min.   :12345   Min.   :1234  
##  1st Qu.:3   1st Qu.:3   1st Qu.:3   1st Qu.:33840   1st Qu.:3384  
##  Median :5   Median :5   Median :5   Median :55555   Median :5555  
##  Mean   :5   Mean   :5   Mean   :5   Mean   :55555   Mean   :5555  
##  3rd Qu.:7   3rd Qu.:7   3rd Qu.:7   3rd Qu.:77270   3rd Qu.:7726  
##  Max.   :9   Max.   :9   Max.   :9   Max.   :98765   Max.   :9876  
##       diff           count       
##  Min.   : 2469   Min.   : 1.000  
##  1st Qu.:27212   1st Qu.: 4.000  
##  Median :50000   Median : 6.000  
##  Mean   :50000   Mean   : 7.051  
##  3rd Qu.:72788   3rd Qu.: 8.000  
##  Max.   :97531   Max.   :54.000
u <- p %>% group_by(diff) %>% mutate(count = n()) %>% arrange(count) %>% ungroup()
head(u)

n のヒストグラム

hist(u$count)

n の diff に対するプロット

plot(x = u$diff, y = u$count)

ggplot2 によるプロット

library(gridExtra)
ph <- qplot(count,data = u)
# ph <- ggplot(data = u, aes(x = count)) + geom_histogram()
pd <- qplot(diff, count, data = u)
# pd <- ggplot(data = u, aes(x = diff, y = count)) + geom_point()
grid.arrange(ph, pd, ncol=2)

新たな問い

  1. plot のグラフは、ある軸に対して対称なのか。
v <- u %>% group_by(diff) %>% arrange(diff) %>% select(diff, count)
check <- function(x){
  v$count[x] == v$count[nrow(v)-x+1]
}
all(sapply(1:floor(nrow(v)/2), check))
## [1] TRUE
  1. 理由は?
  1. 背景にある数学は? つまり、どのような一般化が可能か。

いくつかの例

例題の答え

p %>% filter(diff == 33333)

例題と似た問題

  • 答えが 11111 となるものの数:24
  • 答えが 22222 となるものの数:12
  • 答えが 33333 となるものの数:2
  • 答えが 44444 となるものの数:18
  • 答えが 55555 となるものの数:42
  • 答えが 66666 となるものの数:10
  • 答えが 77777 となるものの数:12
  • 答えが 88888 となるものの数:0
  • 答えが 99999 となるものの数:0
  • 答えが 9999 となるものの数:0
  • 答えが 8888 となるものの数:0
  • 答えが 7777 となるものの数:2
  • 答えが 6666 となるものの数:4
  • 答えが 5555 となるものの数:0
  • 答えが 4444 となるものの数:0
  • 答えが 3333 となるものの数:6
  • 答えが 2222 となるものの数:0
  • 答えが 1111 となるものの数:0
p %>% filter(diff == 7777) 
p %>% filter(diff == 6666) 
p %>% filter(diff == 3333) 

答えが一つのもの

filter(u, count ==1)

答えが二つのもの

filter(u, count == 2)

答えの数が最大のもの

filter(u, count == max(count))

問題の作成

この問題も、児童養護施設での学修支援のときに質問を受けたことに起因しているので、問題を作成してみる。それには、難易度も、定めたい。解答が多数あるのは、問題としては、適切とは言えないので、count が、2以下のもののみ考える。
難易度は、解き心地があり、難しいが、繰り下がりの数のみで判断することにする。

w <- u %>% filter(count <= 2) %>% 
  mutate(lv1 = B < F, lv2 = C < G, lv3 = D < H, lv4 = E < I) %>% 
  mutate(lvl = lv1 + lv2 + lv3 + lv4) %>%
  group_by(diff) %>% mutate(level = max(lvl)) %>% ungroup()
# head(w)
prob <- w %>% select(diff, level) %>% group_by(diff) %>% arrange(desc(level)) %>% distinct()
# head(prob)
table(prob$level)
## 
##    0    1    2    3    4 
##  287 3143 6886 3501  345
hist(prob$level)

いくつかの問題のレベル

2469 は、答えが一つに決まるものの中で最小、97531 は、最大のものである。 これらは、上の問題4の意味で、対称な位置にあるものである。

prob %>% filter(diff %in% c(33333, 7777, 2469, 97531))

Samples

level4 <- prob %>% filter(level == 4) %>% select(diff) %>% as.data.frame()
level_4 <- level4[[1]]
level3 <- prob %>% filter(level == 3) %>% select(diff) %>% as.data.frame()
level_3 <- level3[[1]]
level2 <- prob %>% filter(level == 2) %>% select(diff) %>% as.data.frame()
level_2 <- level2[[1]]
level1 <- prob %>% filter(level == 1) %>% select(diff) %>% as.data.frame()
level_1 <- level1[[1]]
level0 <- prob %>% filter(level == 0) %>% select(diff) %>% as.data.frame()
level_0 <- level0[[1]]
sample_problems <- cbind(sample(level_4, 5), sample(level_3, 5), sample(level_2, 5), sample(level_1, 5), sample(level_0, 5))
colnames(sample_problems) <- c("Level 4", "Level 3", "Level 2", "Level 1", "Level 0")
sample_problems
##      Level 4 Level 3 Level 2 Level 1 Level 0
## [1,]   86575   70438   58022   31141   11636
## [2,]   73737   80264   51894   63498   97153
## [3,]   27844    3739   84029   95163   96341
## [4,]   65842   26039   53018   71503   45132
## [5,]   55548   30278    7662   50928   91366

対称性について

\(\mbox{diff}\) に対する解と、\(1000000-\mbox{diff}\) の解の数は等しい。
count(diff) = count(100000 - diff)

まず、以下のように置く。

すると、 \[\begin{eqnarray*} 100000 - Z & = & (111110 - X) - (11110 - Y)\\ & = & (10 - A) * 10^4 + (10 - B) * 10^3 + (10 - C) * 10^2 + (10 - D) * 10 + (10 - E)\\ & & - ((10 - F) * 10*3 + (10 - G) * 10^2 + (10 - H) * 10 + (10 - I))\\ & = & \bar{A} * 10^4 + \bar{B} * 10^3 + \bar{C} * 10^2 + \bar{D} * 10 + \bar{E}\\ & & - (\bar{F} * 10*3 + \bar{G} * 10^2 + \bar{H} * 10 + \bar{I})\\ & = & \bar{X} - \bar{Y} \end{eqnarray*}\]

したがって、\(\bar{X}\), \(\bar{Y}\) が、\(\bar{Z} = 100000 - Z = \bar{Y} - \bar{Z}\) を満たす。

\[\{1, 2, 3, 4, 5, 6, 7, 8, 9\} = \{A, B, C, D, E, F, G, H, I\} = \{\bar{A}, \bar{B}, \bar{C}, \bar{D}, \bar{E}, \bar{F}, \bar{G}, \bar{H}, \bar{I}\}\]

従って、

\[ \begin{array}{cccccc} \mbox{} & A & B & C & D & E\\ -)& & F & G & H & I\\ \hline &&&& Z & \end{array} \quad\Leftrightarrow\quad \begin{array}{cccccc} \mbox{} & \bar{A} & \bar{B} & \bar{C} & \bar{D} & \bar{E}\\ -)& & \bar{F} & \bar{G} & \bar{H} & \bar{I}\\ \hline & & 10^5 & - & Z & \end{array} \]

解の数は、等しい。

練習問題

  1. 5桁+4桁 の問題にするとどうなるか。
  2. 桁の最大を、5桁と、4桁とし、差に関する同様の問題を考えるとどうなるか。
  3. \(0\) も加えることにして、5桁以下+5桁以下、5桁以下 - 5桁以下として、正の答えが得られる問題に変えるとどうなるか。
  4. Shiny で、Web 上の問題を提供できないか。