编程任务

2023-11-17

任务源自旧版的Brilliant数学讨论问题。2019-09-02我曾经发布过,可惜已经下线,幸活大喵做足备份。

该问题看似是概率问题,实则不然。

官方给出的解法透露出一个非常重要的数学思维方法:

数学语言 —— 为何以及如何构造一个函数 f(n);

运用恰当构造的函数为逻辑推理的起点;

Python随机模块模拟验证之;

先从关键词开始——常用英文短语:

consecutive:连续 如1,2,3,4

in the line-up:排成一列

“There's a randomly ordered line of 15 forks and 15 spoons on the counter. Chef Nidhi only needs 5 forks and 5 spoons.Can she always pick up exactly what she needs by selecting 10 consecutive utensils starting from somewhere in the line-up?

alt

图片

15把叉子和15把勺子随机摆放的,图为示例

题目考察数学思维:

丁丁猫一家的厨房有30付餐具,包含15个叉子和15把刀。丁大喵说了,叉子和勺子的摆放要方便拿取,家里5个人吃饭,桌子上需要摆放5付刀叉,取餐具的时候,很方便地找出5把叉子和5把刀。

一家之主的丁老喵让孩子们想想,该怎么摆放?

丁小喵抢先发话:“每次刷碗后,叉子和勺子要分开摆放”

“不需要” 丁大喵说:"不必这么麻烦,经常有不自觉的取走不按规则放回去,

“ 无论刀叉怎样摆放顺序,都可以找到10个连续摆放的餐具,恰好满足有5个叉子和5个勺子!”

哦?真的可以做到吗?

丁大喵说的是真的吗?

任务场景之二

学校举办新学期的运动会,首先班级推荐10个旗手,要有5男生和5个女生组成方阵,走在班级队伍的最前面,要求10人的身高要尽量接近。

班里共有30人其中15个男生和15个女生。老师先按身高排出30人有高到低排出顺序。请问应该如何选出 5 对男女生推荐为旗手方阵的人选。

——似乎和刀叉的摆放有异曲同工之妙!

逻辑推理的思路梳理:

将30个餐具分成 20个连续的组。最左边开始选10个,即1到10为第1组,2-11为第2组,... 第20-30为第20组 —— 分组是整个思路的关键!!

设一个函数f(n)返回一组器具中叉的数量—— 数学语言描述

该函数显然是连续的,满足:

(1)因为两个连续组的叉的数目之间的差不能大于1。

考虑30把厨具里必然有15把叉子,那么下面必然成立

f(1)+f(10)+f(20) = 15

再看 f(1),f(10),f(20) 3个组中有没有等于5的,如果有,就是我们要找的那一组。如果没有,这三个函数的返回值必然要满足:

(2)至少一个必须大于5,其中一个小于5。

然后,如上所述函数返回值必然满足(1),(2),那么存在某个f(n),n不在1,10,20之间,但f(n)必然是小于5和大于5之间某个数,连续变化的数列中:

譬如3,4,5,6,7之间,可见,由于满足下面两个条件,必然存在某个n,f(n)的返回值恰好为5!

(1)两个连续组的叉的数目之间的差不能大于1

(2)至少一个必须大于5,其中一个小于5

丁小喵说:

“总觉的不踏实,能不能验证下呢?

怎么验证呢

... ...

丁大喵提醒小喵,你这学期学python了

试试python可以啊?!

alt

编程时刻开始 ...

叉子表达为1,勺子表达为0

随机生成一个只有0,1的数列

... ...

import random
from collections import Counter
while True:
    group = [random.randint(0, 1) for i in range(30)]   
    #叉子为1,勺子为0,随机数量生成数组group
    num_fork = str(group).count("1")
    num_spoon = str(group).count("0")
    if num_fork == 15 and num_spoon ==15:
        print(group)
        print(Counter(group))
        break
j = 0
while True:
    #print('随机顺序摆放的叉子和勺子:',group[j:j+10])
    fork = str((group[j:j+10])).count("1")
    spoon = str(group[j:j+10]).count("0")
    if fork == 5 and spoon == 5:
        print ('j =',j)
        print (group[j:j+10])
        break
    j += 1

生成刀叉的随机摆放顺序:

[1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 
1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 
0, 1, 1, 1, 1, 0, 0, 1, 0, 0]

保证刀叉各有15把:

Counter({1: 15, 0: 15})

j = 4

[0, 0, 1, 0, 0, 1, 1, 1, 0, 1]

解读:j =4 就是数列第5个数开始算起,10个连续厨具恰好满足5个叉子和5个勺子

时至今日,再看该任务依然启发力道十足!看能否再做些改进,也只能在随机生成函数的代码做些精简而已。

如何精简?

  1. 构造一个随机数列包含15个 1(folk)和 15个 0 (spoon)
  2. 长度为 30 的数组,包含30个 0
  3. 随机生成 15个数为0-29之间的地址脚标
random_index = [random.randint(0,29) for _ in range(30)]

print('random_index =',len(random_index),random_index)

random_index = 30 [13, 22, 4, 21, 7, 27, 2, 1, 27, 6, 
15, 20, 26, 22, 24, 29, 22, 29, 2, 4, 11, 2, 13, 27, 
2, 25, 28, 10, 23, 0]

显然有重复的值,不可取。不过可以去重操作完善之。 数组求和结果为15则验证随机数组符合要求。

def randomIndex(n):
    cunt,inbox = 0,[]
    init = [0] * n
    while sum(init) < n//2:
        #循环终止条件是恰好一半的元素值为 1
        idx = random.randint(0,29)
        if idx not in inbox: #地址去重
            inbox.append(idx)
            init[idx] = 1
        else:pass
        cunt += 1
    return init,sum(init)
    
n = 30
print(randomIndex(n))

([0, 1, 0, 1, 0, 0, 0, 0, 0,
1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 
0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1], 15)

以上输出的随机数组满足要求!

def check(s,l):
    for i in range(len(s)-l):        
        if s[i:i+l].count(0) == s[i:i+l].count(1):
            return s[i:i+l],i
    else:return None

s = [1, 1, 0, 1, 1, 1, 1, 1, 0, 
     1, 1, 0, 0, 1, 1, 0, 1, 0, 0,
     1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0]
     
l = 10

print(check(seq,l))
([0, 1, 1, 0, 0, 1, 1, 0, 1, 0], 8)

第 8 个元素开始连续 10 个恰好包含 5个叉和5个勺。

课程设计:丁丁猫亲子创客

本节课两个任务场景激发编程的动力,适于小学6年级以上的孩子;

锻炼孩子遇到实际场景需求,先抽象为可用编程实现的思维过程;

熟悉并使用python数组的切片、数组元素统计函数使用;

使用英文描述和理解问题需求,掌握两个math里常见的单词 consecutive in the line-up

理解f(n)函数的本质,用函数描述问题的好习惯;

本文由 mdnice 多平台发布

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编程任务 的相关文章

  • 文件上传服务器例子,服务器端的程序优化

    package cn dali4 code04ex 此程序优化了文件名 这样可以随机生成文件名 给服务器写了循环 可以一直监听 开启了多线程 优化了执行的效率 import java io import java net ServerSoc
  • C++代码注释详解

    常用注释语法 注释写在对应的函数或变量前面 JavaDoc类型的多行注释风格如下 这里为注释 一般注释中有简要注释和详细注释 简要注释有多种标识方式 这里推荐使用 brief命令强制说明 例如 brief 这里为简要注释 这里为详细注释 b
  • 正确使用g2o各类线性方程求解器

    g2o LinearSolverEigen g2o LinearSolverDense g2o LinearSolverCSparse g2o LinearSolverCholmod是常用的线性方程求解器 一套可运行程序 包括不同梯度下降优
  • Python中的异常处理raise介绍

    文章目录 0 介绍 1 raise 介绍 案例 2 raise 不需要参数 案例 3 raise 单独一个 raise 正常程序使用无参的 raise 4 其它案例 4 1 案例1 4 2 案例2 5 处理流程 总结 0 介绍 问题1 是否

随机推荐

  • eslint 搭配 vscode 的简单使用

    前言 刚开始时 由于嫌麻烦 并没有安装eslint 最近在新的项目上使用了eslint再配合vscode的插件 真是爽的不要太爽 因此打算写一篇简单的食用说明来记录食用过程 前期准备 没啥好准备的 作为开发肯定是具备yarn和node的 编
  • WINDOWS键盘钩子

    最近有个需求做的时候碰到需要捕获某个程序的特定按键并且在该程序处于焦点并且按下特定键 如F1 时让主板的蜂鸣器响一声以提示 由于该程序没有源码 因此只能通过编写服务挂全局钩子来对该程序的键盘消息进行捕获 大致的代码结构是使用VC现编写了一个
  • Linux Debian上快速安装Docker并运行

    要在Debian上安装Docker 可以按照以下步骤进行 更新系统软件包 在终端中执行以下命令 更新系统软件包 sudo apt get update 安装依赖包 在终端中执行以下命令 安装Docker需要的依赖包 sudo apt get
  • Echarts折线图x轴刻度距离

    在 ECharts 折线图中 x 轴刻度的距离是根据数据的数量和实际绘图区域的宽度来确定的 ECharts 会根据数据的数量自动计算出 x 轴上每个刻度之间的距离 以适应绘图区域的宽度 如果希望手动设置 x 轴刻度的距离 可以使用以下两种方
  • 解决PowerDesigner里允许字段重名约束的设置问题

    让tomcat支持中文路径名 将conf server xml中的
  • mfc入门基础(六)创建模态对话框与非模态对话框

    参考博客 VS2010 MFC编程入门之十一 对话框 模态对话框及其弹出过程 软件开发 鸡啄米 一 创建模态对话框 1 接着上节中的test02的例子来讲 找到test02 cpp文件 找到函数InitInstance 然后 因为上节我们实
  • setuptools清华源_setuptools与pip的依赖关系解决方案之间的差异

    我最近开始用SetupTools打包我的第一个项目 并且大部分都取得了成功 setuptools与pip的依赖关系解决方案之间的差异 不幸的是 我遇到了一个令人困惑的情况 我的项目依赖于PyPI上没有的单个文件模块 我已经能够使用depen
  • RandLA-Net结果可视化(将结果保存到本地再通过cloudcompare可视化)

    RandLA Net结果可视化 将结果保存到本地再通过cloudcompare可视化 问题 RandLA Net官网提供代码的可视化部分是通过open3d的方式呈现的 但如果使用远端服务器去跑 可能就无法实现可视化 或者当我们的需要可视化的
  • 卷积神经网络及其在图像处理中的应用

    一 前言 卷积神经网络 Constitutional Neural Networks CNN 是在多层神经网络的基础上发展起来的针对图像分类和识别而特别设计的一种深度学习方法 先回顾一下多层神经网络 多层神经网络包括一个输入层和一个输出层
  • Linux framebuffer显示bmp图片

    帧缓冲 framebuffer 是Linux为显示设备提供的一个接口 把显存抽象后的一种设备 他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作 framebuffer是LCD对应的一种HAL 硬件抽象层 提供抽象的 统一的接口操作
  • Zabbix的web界面基本操作

    Zabbix的web界面基本操作 一 查看客户端运行状态 1 查看客户端监听端口 2 查看客户端服务及进程 二 服务端状态检查 1 服务端端口监听 2 查看客户端的hostname获取情况 三 zabbix的web网页基本配置 1 登录查看
  • VisualStudio中添加LIb库、头文件、宏等常用配制

    在VS工程中 添加c c 工程中外部头文件及库的基本步骤 1 添加工程的头文件目录 工程 属性 配置属性 c c 常规 附加包含目录 加上头文件存放目录 2 添加文件引用的lib静态库路径 工程 属性 配置属性 链接器 常规 附加库目录 加
  • 深度强化学习入门:用TensorFlow构建你的第一个游戏AI

    本文通过一种简单的 Catch 游戏介绍了深度强化学习的基本原理 并给出了完整的以 Keras 为前端的 TensorFlow 代码实现 是入门深度强化学习的不错选择 GitHub 链接 https github com JannesKla
  • Java 内存模型及GC原理

    一个优秀Java程序员 必须了解Java内存模型 GC工作原理 以及如何优化GC的性能 与GC进行有限的交互 有一些应用程序对性能要求较高 例如嵌入式系统 实时系统等 只有全面提升内存的管理效率 才能提高整个应用程序的性能 本文将从JVM内
  • Windows11镜像网盘链接

    Windows11镜像 大小10 39G 自己用于M1芯片的mac装虚拟机 网盘链接放入 有需要的朋友自取 链接 https pan baidu com s 1xBjGPq74 FKiEK MgIFTpA 提取码 3jw3
  • matlab自动输出数据到excel文件的指定单元格

    matlab自动输出数据到excel文件的指定单元格 转载 https blog csdn net txcokokok article details 41969793 使用matlab自带的 xlswrite 命令 格式 xlswrite
  • 八大排序算法之选择排序

    选择排序 选择排序 Selection sort 是一种简单直观的排序算法 它的工作原理是每一次从待排序的数据元素中选出最小 或最大 的一个元素 存放在序列的起始位置 直到全部待排序的数据元素排完 选择排序是不稳定的排序方法 比如序列 5
  • Ubuntu_Crontab

    Ubuntu Crontab BasicUsage 编辑定时任务 crontab e 显示定时任务 crontab l 定时任务不执行的解决方案 首先手动执行定时任务命令 排查是否任务本身是否出问题 没问题的话 去日志中看 crontab日
  • C - C语言实验——求两个整数之中较大者

    Description 输入两个整数 请编程求其中的较大者 Input 在一行中输入用空格隔开的两个整数 例如5 9 Output 输出两个整数之中较大者 输出形式举例 max 9 Sample Input 5 9 Output max 9
  • 编程任务

    任务源自旧版的Brilliant数学讨论问题 2019 09 02我曾经发布过 可惜已经下线 幸活大喵做足备份 该问题看似是概率问题 实则不然 官方给出的解法透露出一个非常重要的数学思维方法 数学语言 为何以及如何构造一个函数 f n 运用