ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: flykiss80

[Excel 函数与公式] [开_150]斗牛游戏[已总结]

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-8-17 12:09 | 显示全部楼层
本帖最后由 delete_007 于 2015-8-21 10:04 编辑

答题截止,先行开帖。

TA的精华主题

TA的得分主题

发表于 2015-8-24 10:40 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本期竞赛人气较旺,我一定要抽时间总结一下,先给出评分建议,如有异意,请与我联系。
评分及总结文档稍后上传,评分建议如下:
[开_150]评分.png

TA的精华主题

TA的得分主题

发表于 2015-8-25 14:53 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 delete_007 于 2015-8-25 15:06 编辑

【开_150】总结

    总的而言,本期竞赛参赛人数较多,氛围活跃,对我而言是很大的鼓励。希望各位小伙伴能继续参加今后的竞赛,我也会努力作好竞赛区的勤杂工。
    分析本期优秀的答题思路,大体可分为两类:
    一、IF(判断是否有三个数的和是10的整数倍,TEXT(,"0点;;牛"),MAX()&"大")
    二、IFNA+TEXT+HLOOKUP


[开_150]评分与总结.rar

36.85 KB, 下载次数: 131

评分

7

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-8-25 14:55 | 显示全部楼层
本帖最后由 delete_007 于 2015-8-25 15:01 编辑

第1章 IF+TEXT+MAX


    该思路的主体是IF函数,通过条件判断牌型是否有点(包括X点和牛)进行分支。有点的情况下,计算5张牌的和,并对10取余,进而判断是X点还是牛。无点的情况下,取5张牌的最大值,得出结果X大。
    1.1    判断条件
    判断是否有三张牌之和为10的倍数。
    由于数据源有大于10的牌,所以需要先处理源数据,这里有三种境界:
    第一种,按题目要求,大于10的数当作10计算,于是有公式(21字符):
  1. TEXT(A2:E2,"[>9]1!0")
复制代码
    第二种,按需求进行简化,处理数据源的目的是为了判断三张牌之和是否是10的整数倍,那么10和0是等效的,公式如下(20字符):
  1. TEXT(A2:E2,"[>9]!0")
复制代码
    第三种,延续第二种思路,跳出TEXT,公式如下(16字符):
  1. A2:E2*(A2:E2<10)
复制代码

    在IF函数的大框架下,缩短公式长度的有效方法是减少条件判断部分的公式长度。

    以整数部分用于计算牌的张数,小数部分对牌的点数求和(82字符):(delete_007)
  1. OR(MMULT(1+A2:E2*(A2:E2<10)%,MOD(INT(COLUMN(A:AE)/2^ROW($1:$5)*2),2))={3;3.1;3.2})
复制代码
    MMULT函数计算5张牌的所有组合结果,如下:
{1.05,1.05,2.1,1,2.05,2.05,3.1,1,2.05,2.05,3.1,2,3.05,3.05,4.1,1,2.05,2.05,3.1,2,3.05,3.05,4.1,2,3.05,3.05,4.1,3,4.05,4.05,5.1}
    组合结果中有整数部分是3,小数部分是0.1的整数倍的结果,此牌型就是“有点”的情况,否则“无点”。

    当然也可以将整数部分和小数部分对换,以小数部分表示牌的张数,而整数部分表示牌的点数之和,MOD函数在处理小数时易造成浮点误差,因此用个位表示牌的张数,十位及以上表示牌的点数之和,公式如下(84字符)。(pxiceplay、chunlin1wang、jsxjd)
  1. AND(MOD(MMULT(A2:E2*(A2:E2<10)*10+1,MOD(INT(COLUMN(A:AE)/2^ROW($1:$5)*2),2))-3,100))
复制代码
    结果为真表示“无点”,否则“有点”。
    使用FIND方法,可以避免浮点误差问题处理小数,得到组合结果之后,当小数部分是“.03”表示三张牌的组合,个位数是0表示牌的点数之和是10的整数倍,因此有公式(82字符):(cmxxccxx、笑眼晴天、cleverzhzhf)
  1. COUNT(FIND(3%,MMULT(A2:E2*(A2:E2<10)+1%,MOD(INT(COLUMN(A:AE)/2^ROW($1:$5)*2),2))))
复制代码
    此公式查找组合结果中是否包含0.03字符串,有则表示“有点”,否则“无点”。
    FIND函数可以换成SEARCH、MATCH的模糊查找,大体原理相同,不再赘述。

    还有一种比较奇特的条件判断思路,不用复杂的组合因子,而采用逆向思维。(笨笨四、满坛皆为吾师)
    求三张牌的点数之和,可以转化为五张牌的点数之和,减去任意两张牌的点数,即如下公式:
  1. SUMIF(A2:E2,"<10")-A2:E2*(A2:E2<10)-TRANSPOSE(A2:E2*(A2:E2<10))
复制代码
    然后通过个位数判断是否”有点“。个位是0为有”有点“,非0为”无点“。此处需注意,二维数组对角线上的值五牌之和减同一张牌两次,不满足,使用MUNIT函数附加单位矩阵进行处理。最终得到公式(84字符):
  1. AND(RIGHT(SUMIF(A2:E2,"<10")-A2:E2*(A2:E2<10)-TRANSPOSE(A2:E2*(A2:E2<10)))+MUNIT(5))
复制代码
公式结果为真表示“无点”,否则“有点”。

评分

6

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-8-25 15:03 | 显示全部楼层
本帖最后由 delete_007 于 2015-8-25 15:21 编辑

    1.1    “有点”情况
    在“有点”的前提下,又有两种可能:“X点"和”牛“。
    根据剩余两张牌点数和对10取余的结果来判断,由于另外三张牌是10的整数倍,剩余两张牌与五张牌之和除10的余数相同,问题转化为5张牌点数之和除10的余数为0时,结果为”牛“,非0时,为"X点”。
    43字符:
  1. TEXT(MOD(SUM(A2:E2*(A2:E2<10)),10),"0点;;牛")
复制代码
    39字符:
  1. TEXT(RIGHT(SUMIF(A2:E2,"<10")),"0点;;牛")
复制代码
    1.2    “无点”情况
    这部分公式没有技巧,比较简单:
  1. MAX(A2:E2)&"大"
复制代码

第2章 IFNA+TEXT+HLOOKUP


    这个思路的核心是将条件判断与“有点”情况两部分合并在一起进行,最后用IFNA容错来处理“无点”情况。关键是数组构建,将参与条件判断的牌的张数、条件判断部分牌的点数之和以及剩余牌的点数之和在一个数据中反映。11楼头版的公式是此思路下的极致,现简单解析一下。(wangg913)
  1. 100+(A2:E2<10)*A2:E2
复制代码
    其中百位表示参与条件判断的牌的张数。
  1. MMULT(100+(A2:E2<10)*A2:E2,1000^ISODD(COLUMN(N:BD)/2^ROW($1:$5)))
复制代码
    组合计算结果为6位数,暂以abcdef表示,其中,a表示参与条件判断的牌的张数,此处应为3;bc是参与条件判断的牌的点数之和,就判断是否是10的整数倍,即判断c是否为0;d是剩余牌的张数,应为2;ef是剩余牌的点数之和,可据此判断“X点”或“牛”。
    使用HLOOKUP模糊查找”3?0*",如果没有找到,则返回错误值#N/A,表示“无点”,利用IFNA处理得到”无点“情况的结果;如果找到了则返回这个值,通过RIGHT函数,根据其末位判断,若等于0,就是“牛”,若非0,则为“X点",最终利用TEXT函数返回结果。
  1. =IFNA(TEXT(RIGHT(HLOOKUP("3?0*",""&MMULT(100+(A2:E2<10)*A2:E2,1000^ISODD(COLUMN(N:BD)/2^ROW($1:$5))),1,)),"0点;;牛"),MAX(A2:E2)&"大")
复制代码

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-8-26 08:23 | 显示全部楼层
本帖最后由 丢丢表格 于 2015-8-26 08:27 编辑

我的第一思路是:
=TEXT(MIN(MMULT({10,1}^6,MOD(ABS({0;1}*SUM(IF(A2:E2>9,10,A2:E2))-TEXT(MMULT(IF(A2:E2>9,10,A2:E2)+100,--MID(DEC2BIN(COLUMN(AI:BH)),ROW($2:$6),1))-300,"[>99]9;9;0")),10)),MAX(A2:E2)*1000),"[>1000]0,大;[>]0点;牛")
先列出所有的组合,再求组合中的最小值, 这样写法就是长了。
后来列一个所有符合要求的数据表, 发现符合要求的数据都是同一值,那就简单了,可以用 HLOOKUP 来解决了,

这个 TEXT(X,"[>1000]0,大;[>]0点;牛")  不常用吧.

TA的精华主题

TA的得分主题

发表于 2015-8-26 09:21 | 显示全部楼层
delete_007 发表于 2015-8-25 15:03
1.1    “有点”情况    在“有点”的前提下,又有两种可能:“X点"和”牛“。    根据剩余两张牌点数 ...

COLUMN(N:BD) 这个里面有啥学问。。。楼上各位大神取的是五花八门。。。

TA的精华主题

TA的得分主题

发表于 2015-8-26 09:32 | 显示全部楼层
本帖最后由 delete_007 于 2015-8-26 09:50 编辑
丢丢表格 发表于 2015-8-26 08:23
我的第一思路是:
=TEXT(MIN(MMULT({10,1}^6,MOD(ABS({0;1}*SUM(IF(A2:E2>9,10,A2:E2))-TEXT(MMULT(IF(A2: ...

这个问题我也考虑过,即不同的牌组合,是否会产生不同的结果,答案是否定的。
简单证明如下:
    1.对于“无点”的情况,任意三张牌组合都不能被10整除,五张牌的最大值是确定的,唯一的,答案也是唯一的。
    2.对于“有点”的情况,设五张牌分别为ABCDE,假设其中有三张牌ABC(称之为“旧三张”)之和能被10整除,那么D+E确定结果是“X点”或“牛”。如果有另外三张牌(称之为“新三张”)之和能被10整除,会是什么情况呢?
    由于总共五张牌,那么“新三张”与“旧三张”至少有一张牌是相同的。分两种情况讨论:
    “新三张”与“旧三张”只有一张牌相同,假设A相同,那么“新三张”必然是ADE,B+C确定结果。    设A+B+C=10x,A+D+E=10y(x为非负整数),两式相减得,B+C=10(x-y)+(D+E),两边同时MOD,即MOD(B+C,10)=MOD(10(x-y)+D+E,10)=MOD(D+E,10),所以B+C与D+E确定的结果相同。
    “新三张”与“旧三张”有两张牌相同,假设AB相同,那么“新三张”可能是ABD或ABE。
    设A+B+C=10x,A+B+D=10y,两式相减,C-D=10(x-y),0<C<=10,-10<=-D<0,-10<C-D<10,-1<x-y<1.由于x、y都是整数,x-y也是整数,所以x-y=0,即C=D,即D+E=C+E,结果相同,同理可证"新三张“ABE。
    结论:斗牛游戏结果是唯一的,找到一个正确组合结果即可。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-8-26 09:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 丢丢表格 于 2015-8-26 12:22 编辑
首席打杂 发表于 2015-8-26 09:21
COLUMN(N:BD) 这个里面有啥学问。。。楼上各位大神取的是五花八门。。。

就是 取 这里的数 作 2 进制 处理

TA的精华主题

TA的得分主题

发表于 2015-8-26 09:48 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
首席打杂 发表于 2015-8-26 09:21
COLUMN(N:BD) 这个里面有啥学问。。。楼上各位大神取的是五花八门。。。

5张牌,选或者不选,总共2^5=32种情况,即COLUMN(A:AF),其它的都是手动掐头去尾,去掉了一些明显不满足要求的组合。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-22 07:06 , Processed in 0.042961 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表