Board logo

标题: [游戏娱乐] 三八二十四:批处理计算24点 [打印本页]

作者: wxcute    时间: 2008-10-2 16:37     标题: 三八二十四:批处理计算24点

生成四个1-9的随机数,再进行计算。
代码有缺陷,欢迎大家测试,也欢迎大家帮忙修改。
  1. @echo off
  2. title 三八二十四
  3. cd/d "%~dp0"
  4. ::临时文件→
  5. echo +^
  6. -^
  7. *^
  8. />TMP_fh
  9. if not #%1==# %0
  10. ::思路
  11. ::%4 %1 %5 %2 %6 %3 %7
  12. :: A + B + C + D
  13. ::ABCD做排列
  14. ::符号做循环,并用以下公式加括号
  15. echo %%4%%1%%5%%2%%6%%3%%7^
  16. (%%4%%1%%5)%%2%%6%%3%%7^
  17. (%%4%%1%%5%%2%%6)%%3%%7^
  18. %%4%%1(%%5%%2%%6)%%3%%7^
  19. %%4%%1(%%5%%2%%6%%3%%7)^
  20. %%4%%1%%5%%2(%%6%%3%%7)^
  21. (%%4%%1%%5)%%2(%%6%%3%%7)>TMP_gs
  22. attrib +s +h "TMP_fh"
  23. attrib +s +h "TMP_gs"
  24. ::←临时文件
  25. :bg
  26. endlocal
  27. cls
  28. setlocal enabledelayedexpansion
  29. ::生成四个1-9的数→
  30. set/a a=%random%%%9+1,b=%random%%%9+1,c=%random%%%9+1,d=%random%%%9+1
  31. echo 四个随机数:%a% %b% %c% %d%
  32. ::←
  33. set/p=正在计算,请等待...<nul
  34. set sr1=a b c d
  35. ::排列(plp626方案)→
  36. for %%a in (!sr1!) do (set sr2=!sr1:%%a =!
  37.  for %%b in (!sr2!) do (set sr3=!sr2:%%b =!
  38.   for %%c in (!sr3!) do (set sr4=!sr3:%%c =!
  39.    call :pl %%a %%b %%c !sr4!
  40.    if defined flag goto :show
  41. ) ) )
  42. ::←排列
  43. :show
  44.  if defined flag (
  45.   set/p=其中一结果:!fhvar!=%jg%<nul
  46.  ) else (
  47.   set/p=不好意思,没有算出来...<nul
  48.  )
  49. pause>nul
  50. goto :bg
  51. ::调用标签→
  52. :pl
  53. ::echo !%1! !%2! !%3! !%4!
  54.  call :fh !%1! !%2! !%3! !%4!
  55.  goto :eof
  56. ::符号循环→
  57. :fh
  58. for /f %%i in (TMP_fh) do (
  59.  for /f %%j in (TMP_fh) do (
  60.   for /f %%k in (TMP_fh) do (
  61.    call :crfh %%i %%j %%k %1 %2 %3 %4
  62.    if defined flag goto :eof
  63.   )
  64.  )
  65. )
  66. goto :eof
  67. ::←符号循环
  68. :crfh
  69. ::判断整除(不完善)→
  70.  if not %1==/ (
  71.   if not %2==/ (
  72.    if %3==/ (
  73.     set/a mod=%6%%%7
  74.     if !mod! neq 0 goto :eof
  75.    )
  76.   ) else (
  77.    set/a mod=%5%%%6
  78.    if !mod! neq 0 goto :eof
  79.   )
  80.  ) else (
  81.   set/a mod=%4%%%5
  82.   if !mod! neq 0 goto :eof
  83.  )
  84. ::←判断整除
  85. ::七个公式→
  86.  for /f %%g in (TMP_gs) do (
  87.   call :isR "%%g"
  88.   if defined flag goto :eof
  89.  )
  90.  goto :eof
  91. ::←七个公式
  92. :isR
  93.  set fhvar=%~1
  94.  set/a jg=%fhvar% 2>nul
  95.  if #!jg!==#24 set flag=1
  96.  goto :eof
复制代码

作者: pusofalse    时间: 2008-10-2 17:01

测试信息:
  1. 四个随机数:8 5 7 3
  2. 正在计算,请等待...系统找不到文件 +。
  3. 系统找不到文件 +。
  4. 系统找不到文件 +。
  5. 系统找不到文件 +。
  6. 系统找不到文件 +。
  7. 系统找不到文件 +。
  8. 系统找不到文件 +。
  9. 系统找不到文件 +。
  10. 系统找不到文件 +。
  11. 系统找不到文件 +。
  12. 系统找不到文件 +。
  13. 系统找不到文件 +。
  14. 系统找不到文件 +。
  15. 系统找不到文件 +。
  16. 系统找不到文件 +。
  17. 系统找不到文件 +。
  18. 系统找不到文件 +。
  19. 系统找不到文件 +。
  20. 系统找不到文件 +。
  21. 系统找不到文件 +。
  22. 系统找不到文件 +。
  23. 系统找不到文件 +。
  24. 系统找不到文件 +。
  25. 系统找不到文件 +。
  26. 不好意思,没有算出来...
复制代码

作者: wxcute    时间: 2008-10-2 17:29

特殊符号看来不大好用,我原来用了 + - 两个符号做文件名
已改成TMP_fh和TMP_gs
真是
作者: pusofalse    时间: 2008-10-2 18:48

生成的数列是1 1 7 7,运算结果:
7*7/(1+1)=24
个人建议,如果是相除得24,应该判断余数是否是0,为0才set flag=1,若不为0,flag依然保持空值。
作者: yslyxqysl    时间: 2008-10-2 18:53

运行结果:
四个随机数:1 8 8 5
不好意思,没有算出来...

我都算出来了,(8-5)*8*1

[ 本帖最后由 yslyxqysl 于 2008-10-2 18:55 编辑 ]
作者: wxcute    时间: 2008-10-2 19:26

5楼的1 8 8 5应该不会算错,原因如下
有的时候其他程序运行得紧会影响计算,这点不知道怎么改进。

另:整除问题很头疼,简单的是处理了,
像这样的已经被先加减后乘除的循环和一般整除判断剔除了。
6/5*6*4

像 4 楼 [ 7 7 1 1] [7 2 1 7]这样的还是不好判断
7/1*7/2

[ 本帖最后由 wxcute 于 2008-10-2 19:34 编辑 ]
作者: yslyxqysl    时间: 2008-10-2 21:22

四个随机数:9 7 1 8
不好意思,没有算出来...

正确答案:(9-7+1)*8
四个随机数:8 8 2 4
不好意思,没有算出来...

正确答案:(8+8-4)*2
四个随机数:3 3 9 7
不好意思,没有算出来...

正确答案:3*7+9/3
作何解释?
作者: youxi01    时间: 2008-10-3 00:03

在联盟的帖子里,有关于四项基本运算的,有很多人写过
namejm和其他高人写过,本人也写过,看看,或许对你有点启发
作者: wxcute    时间: 2008-10-3 11:42

======回7楼
我这儿都能给出你的三个例子的正确答案:
四个随机数:9 7 1 8
其中一结果:9+7+1*8=24
四个随机数:8 8 2 4
其中一结果:8+8+2*4=24
四个随机数:3 3 9 7
其中一结果:3+9/3*7=24

请列出测试环境,我这儿是XP SP3

======回8楼
我就去看看。
作者: yslyxqysl    时间: 2008-10-3 12:20     标题: 回复 9楼 的帖子

我的系统是XP SP2
把后缀名从bat改成cmd就好了,奇怪。

[ 本帖最后由 yslyxqysl 于 2008-10-3 12:25 编辑 ]
作者: wxcute    时间: 2008-10-5 17:04

1-10 以内随机 4 个数基本上都能算出来,完善了整除判断,不过花的时间比原来 1 楼长了。

超过 10(如最大到 12 或更大)就会出现整除判断的错误,还好不是很多。

增加了手动输入

中间过程负数未判断,如下:
(5-8)*(2-10)=24
作者: 523066680    时间: 2008-12-31 17:16

http://www.cn-dos.net/forum/viewthread.php?tid=45488&fpage=1
[原创]批处理算24点




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2