孩子们,数学和R

当前在学校的教育越来越减少。 在其余部分中,重点越来越放在外部效果上。 “项目工作”,演示文稿,效果等等。 此外,通常不清楚将这些练习的对象分发给谁-儿童还是父母? 所有这些的结果是,需要在学校内的各个圈子中或在目标是使孩子接受全面教育的情况下,在各个圈子中增加班级。


在数学或物理学的情况下,您可以尝试用一块石头抓捕两只鸟(好吧,或者一只野兔和一只野兔)。 结合ext的问题解决方案。 班级(学校课程不适合此课程),同时进行数据处理和算法方法培训文化的并行教育。 这并不是关于聊天机器人的三行讨论,而是关于将计算机用作原始目标的一部分-执行计算,进行数值实验,建模并揭示隐藏的依存关系,在此基础上可以建立新的假设。


我立即注意到并非所有人都对该主题感兴趣。 与谁无关紧要。 谁会有额外的。 想法,结识也很有趣。 接下来是一系列从三年级数学“ Metashkola ”课程中借来的问题。 自然,首先通过逻辑推理解决问题,然后讨论使用计算机的解决方法。


以下讨论的重要补充:


  1. 这些材料是从父母而不是老师的角度写的。 没有服务和公关。 这只是一系列实际考虑。
  2. R被用作工具是因为它更方便。

它是以前出版物的延续。


一般序言


library(tidyverse) library(glue) library(magrittr) library(lubridate) library(hms) library(numbers) library(polynom) library(Ryacas) library(stringi) library(tictoc) 

以下是可以扩展到无穷大的一系列任务。


恢复记录


挑战赛


恢复记录: 3∗∗:∗3=3∗ 。 找到所有遗漏数字的总和。


解决方案示例
 #  3ab = c3*3d df <- 0:9 %>% {tidyr::crossing(a = ., b = ., c = ., d = .)} %>% filter(300 + a * 10 + b == (c * 10 + 3) * (30 + d)) df 

挑战赛


是否可以在记录7∗(7∗7∗7)∗7放置算术运算符而不是“∗”以得到8?


解决方案示例
 ops <- c('*', '/', '+', '-') #      df <- tidyr::crossing(op1 = ops, op2 = ops, op3 = ops, op4 = ops) %>% #        mutate(data = glue::glue("7 {op1} (7 {op2} 7 {op3} 7) {op4} 7"), expr = rlang::parse_exprs(data)) %>% mutate(res = purrr::map_dbl(expr, rlang::eval_bare)) %>% arrange(res) %>% filter(res == 8) print(tbl_df(df), n = 20) 

挑战赛


从1到100的所有数字都被写出,数字4在记录中出现几次?


解决方案示例
 #  100   4,      99 #    tidyr::crossing(d1 = 0:9, d2 = 0:9) %>% #   ,   4 filter(d1 == 4 | d2 == 4) %>% arrange(d1, d2) 

挑战赛


三位数字开头的数字9移到了数字的末尾。 结果是一个数字少216。 原始数字的位数之和是多少?


解决方案示例
 #   : abc df <- tidyr::crossing(b = 0:9, c = 0:9) %>% #    9     mutate(delta = (900 + 10*b + c) - (100*b + 10*c + 9)) %>% filter(between(delta, 200, 230)) df 

挑战赛


5个连续自然数的乘积是2520。较小的数字是多少?


解决方案示例方法1
 numbers::primeFactors(2520) 

解决方案示例方法2
 # https://joftius.wordpress.com/2015/10/19/finding-multiple-roots-of-univariate-functions-in-r/ f <- function(x) {x * (x+1) * (x+2) * (x+3) * (x+4) - 2520} rootSolve::uniroot.all(f, c(0, 2520)) 

解决方案示例,方法3
 eq <- "x * (x+1) * (x+2) * (x+3) * (x+4) - 2520" yacas(glue("Simplify({eq})")) #            rts <- base::polyroot(c(-2520, 24, 50, 35, 10, 1)) #     n-1 #     # http://www.johnmyleswhite.com/notebook/2009/12/18/using-complex-numbers-in-r/ Re(rts[abs(Im(rts)) < 1^-10]) 

挑战赛


什么数字可以代替"∗" ,以使数字543∗ 4整除? 有哪些选择?


解决方案示例
 tibble(num = 5430 + 0:9, mod = mod(num, 4)) %>% arrange(mod, num) 

挑战赛


第三位数60的两倍是多少?


解决方案示例
 2*(1/3*(1/4*60)) 60 %>% {./4} %>% {./3} %>% {.*2} 

挑战赛


将没有指针的表盘分成两部分,以使每个部分中可用的数字总和相同。
添加。 问题是:钟面可以进一步划分多少个部分,以便每个部分中的数字之和彼此相等?


解决方案示例
 #       2  ,   #    ,    =  sum(1:12) / 2 #    for (i in 1:12){ res <- cumsum(i:12) print(glue(" : {i},  : {glue_collapse(res, ', ')}")) val <- which(res == 39) if(! identical(val, integer(0))){ print(glue("  [{i}; {val + i - 1}]")) } } 

“牛和牛”


变体1


在记录号中,从1到5(包括1和5)的各个数字。
猜中的数字代表公牛的数量。 错位的猜测数字就是母牛的数量。


什么是三位数的数字,如果您知道:


  • 314-1头公牛和1头牛;
  • 124-1公牛和1头牛;
  • 523-1头公牛和1头牛。

解决方案示例
 library(tidyverse) library(stringi) #   "an_bn_cn". c --    df <- c(1, 2, 3, 4, 5) %>% {tidyr::crossing(an = ., bn = ., cn = .)} %>% #    mutate(comb = purrr::pmap(., c)) %>% #     mutate(val = stri_join(an, bn, cn)) %>% #      # 314 -  1  filter(stri_detect_regex(val, "3[^1][^4]|[^3]1[^4]|[^3][^1]4")) %>% # 124 -  1  filter(stri_detect_regex(val, "1[^2][^4]|[^1]2[^4]|[^1][^2]4")) %>% # 523 -  1  filter(stri_detect_regex(val, "5[^2][^3]|[^5]2[^3]|[^5][^2]3")) %>% #      filter(purrr::map_int(comb, n_distinct) == 3) %>% #      (1   1 ) filter(purrr::map(comb, ~length(base::intersect(.x, c(3, 1, 4)))) == 2) %>% filter(purrr::map(comb, ~length(base::intersect(.x, c(1, 2, 4)))) == 2) %>% filter(purrr::map(comb, ~length(base::intersect(.x, c(5, 2, 3)))) == 2) df 

变化2


在记录号中,从1到5(包括1和5)的各个数字。
猜中的数字代表公牛的数量。
错位的猜测数字就是母牛的数量。
什么是三位数的数字,如果您知道:


543-1头公牛; 0头牛;
235-1公牛; 0头母牛。


解决方案示例
 library(tidyverse) library(stringi) df <- c(1, 2, 3, 4, 5) %>% tidyr::crossing(d3 = ., d2 = ., d1 = .) %>% #    mutate(comb = purrr::pmap(., c)) %>% #     mutate(val = stri_join(d3, d2, d1)) %>% #      # 543 -- 1 ; 0  filter(stri_detect_regex(val, "5..|.4.|..3")) %>% # 235 -- 1 ; 0  filter(stri_detect_regex(val, "2..|.3.|..5")) %>% #      filter(purrr::map_int(comb, n_distinct) == 3) %>% #      filter(purrr::map(comb, ~length(base::intersect(.x, c(5, 4, 3)))) == 1) %>% filter(purrr::map(comb, ~length(base::intersect(.x, c(2, 3, 5)))) == 1) df 

填补广场


是否可以在4×4的方形表的单元格中排列十个负号,以便每一列具有奇数个负号,而每一行具有偶数个负号?


解决方案示例,选项1
 #      ,    10.  : 3, 3, 3, 1 library(arrangements) library(foreach) #   : # 1 2 3 4 # 5 6 7 8 # 9 10 11 12 # 13 14 15 16 cmb <- arrangements::combinations(1:16, k = 10, replace = FALSE) pryr::object_size(cmb) #   ,   ,   .  icomb <- icombinations(1:16, k = 10, replace = FALSE) foreach(x = icomb, .combine=c) %do% { # x -    ,    "" #       #  isOdd <- function(x, set){ #   length(base::intersect(x, set)) %% 2 == 1 } isEven <- function(x, set){ #   length(base::intersect(x, set)) %% 2 == 0 } col_flag <- all( isOdd(x, c(1, 5, 9, 13)), isOdd(x, c(2, 6, 10, 14)), isOdd(x, c(3, 7, 11, 15)), isOdd(x, c(4, 8, 12, 16)) ) row_flag <- all( isEven(x, c(1, 2, 3, 4)), isEven(x, c(5, 6, 7, 8)), isEven(x, c(9, 10, 11, 12)), isEven(x, c(13, 14, 15, 16)) ) if(col_flag && row_flag) print(x) } 

解决方案示例,选项2
 #      ,    10.  : 3, 3, 3, 1 library(tidyverse) library(magrittr) library(arrangements) library(foreach) #   : # 1 2 3 4 # 5 6 7 8 # 9 10 11 12 # 13 14 15 16 #   ,   ,   .  icomb <- icombinations(1:16, k = 10, replace = FALSE) df <- foreach(x = icomb, .combine = rbind) %do% { # x -    ,    "" #       #   v <- rep(0, 16) #   ,   # browser() v[x] <- 1 m <- matrix(v, nrow = 4, ncol = 4, byrow = TRUE) #  :      , #        if (all(colSums(m) %% 2 == 1) && all(rowSums(m) %% 2 == 0)) x else NULL } df %<>% as_tibble(.name_repair = "minimal") #       v <- rep(0, 16) #   ,   v[purrr::flatten_int(df[5, ])] <- 1 matrix(v, nrow = 4, ncol = 4, byrow = TRUE) 

组合学


挑战赛


通过重新排列字母K,A,W和A,可以制成几个不同的字母组合,其中两个相同的字母彼此不相邻?


看一下各种注意事项: 在R中生成列表的所有不同排列


解决方案示例
 #     # https://stackoverflow.com/questions/44918645/split-a-string-into-character-efficiently lset <- unlist(base::strsplit("", split = "", fixed = TRUE)) #       ,      lset <- c("", "1", "", "2") # library(permutations) df <- tidyr::crossing(p1 = lset, p2 = lset, p3 = lset, p4 = lset) ff <- function(...){ vals <- rlang::list2(...) # browser() n_distinct(unlist(vals)) } df %>% # mutate(u = purrr::pmap_int(., ~n_distinct(.x))) mutate(u = purrr::pmap_int(., ff)) %>% filter(u == 4) %>% select(-u) %>% #      mutate(s = purrr::pmap_chr(., stri_join)) %>% mutate_at(vars(s), stri_replace_all_regex, pattern = "(\\d+)", replacement = "") %>% distinct(s) %>% #     filter(!stri_detect_fixed(s, "")) 

挑战赛


一年中可以有几个星期天? 可能的最大数目是多少?


解决方案示例
 #   ,     366 %/% 7 #   .         366 %% 7 

海盗的任务


海盗:A,B,C
说1
A:B有2只眼睛
B:C有2只眼睛
C:A有两只眼睛


说2
答:我们都有两只眼睛
B:我们都有三只眼睛
C:我们都有四只眼睛


每个海盗都像他的眼睛一样撒谎多次。 每个海盗有几只眼睛?


解决方案示例
 df <- tidyr::crossing(a = 0:2, b = 0:2, c = 0:2) %>% mutate(total = a + b + c) %>% mutate(a_lie = (b != 2) + (total != 2), b_lie = (c != 2) + (total != 3), c_lie = (a != 2) + (total != 4)) %>% filter(a_lie == a, b_lie == b, c_lie == c) df 

等等 等


对于某些人来说,这可能是花时间陪伴孩子的机会。


一篇文章- “针对“企业”任务的R中并行计算的一些注意事项

Source: https://habr.com/ru/post/zh-CN462619/


All Articles