中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
« [1] [2] [3] »
作者:
标题: [原创]批处理算24点 上一主题 | 下一主题
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『楼 主』:  [原创]批处理算24点

经过各位找出缺点,我自己列出了多种特殊情况,基本搞定
已经允许小数,分数了。 例如 8/(3-8/3)=24 这个口算出现分数的。
                                         (3-8/3=1/3 ->8/(1/3)=8*3/1=24)
接下来能找到一个例子加减乘除算24 而此批处理又算不到的同学
我给+15分
@echo off &setlocal enabledelayedexpansion
title made by 523066680@www.cn-dos.net - 算24.bat
::::::::::::::::::::::::::::::::::::
::批处理算24.bat
::作者:523066680
::blog http://hi.baidu.com/523066680
::首发于:http://www.cn-dos.net/forum/viewthread.php?tid=45488&fpage=1
::::::::::::::::::::::::::::::::::::
:input
for /f "tokens=1 delims==" %%a in ('set') do (set "%%a=")
set "pexit=&pause &cls &goto :input"
set /a i=10,j=11,q=12,k=13
set _+=-
set _-=+
set _*=/
set _/=*
echo, &echo, 算24.bat
echo, &echo, 输入4个扑克牌的数字,[范围: 1 2 3 4 5 6 7 8 9 i j q k ]
echo, &echo, 其中1-9代表1-9 , i代表10 , j代表11 , q代表12 , k代表13
echo, &echo,请正确输入。 示例:  q q 1 2 (或者qq12)
echo, &set /p "str=可以用空格隔开,也可以不用 [exit 退出]: "
echo,
if "%str%"=="" (cls &goto :input)
if "%str%"=="exit" (exit)
call :fo "%str: =%" ""
if "%have%"=="" (echo, &echo,没有答案)
echo,
pause
cls &goto :input

:://////递进结合递归//////列举数字的排列组合//////
:fo
if %1=="" (
    if not "!defx%~2!"=="def" (call :next %~2 &set defx%~2=def)
    goto :eof
)
if not defined _%~1 (set _%~1=-1)
set str=%~1

:foa
  set /a _%~1+=1,foa=_%~1,fob=foa+1
  call :fo "!str:~0,%foa%!!str:~%fob%!" "%~2!str:~%foa%,1!"
  set str=%~1
  set /a foa=_%~1
if not "!str:~%foa%,-1!"=="" (goto :foa)
set "_%~1="
goto :eof

:://////组合运算符的所有排列形式//////对接收到的4个数字进行计算
:next
set num=%~1
set /a na=%num:~0,1%,nb=%num:~1,1%,nc=%num:~2,1%,nd=%num:~3,1%

set /a yn=nb*100/nc*nc,yn2=24*nb/nc*nc-24*nb
set "do=::"
if %yn% equ %nb%00 (set "do=")
%do% set /a spea=(na*10-nb*10/nc)*nd,speb=(na*10+nb*10/nc)*nd
%do% if %spea% equ 240 echo,        [ %na% - %nb% / %nc% ] * %nd% = 24 &set have=have %pexit%
%do% if %speb% equ 240 echo,        [ %na% + %nb% / %nc% ] * %nd% = 24 &set have=have %pexit%

set /a spec=(na-(nb*nc))*nd
if %spec% equ 24 echo,        [ %na% - %nb% * %nc% ] * %nd% = 24 &set have=have %pexit%

if %yn2% equ 0 (set "do=") else (set "do=::")
%do% set /a spef=24*nb/nc-24*nd,speg=-spef
%do% if %spef% equ %na% echo,        %na% / [ %nb% / %nc% - %nd% ] = 24  &set have=have %pexit%
%do% if %speg% equ %na% echo,        %na% / [ %nd% - %nb% / %nc% ] = 24  &set have=have %pexit%

set "fu=+ - x /"
for %%a in (%fu%) do (
for %%b in (%fu%) do (
  for %%c in (%fu%) do (
  set "fa=%%a" &set "fb=%%b" &set "fc=%%c"
  call :next-1 !fa:x=*! !fb:x=*! !fc:x=*!
  )
)
)
goto :eof

:next-1
set /a count=((na %1 nb) %2 nc) %3 nd
set "do=::"
if %count% equ 24 (set "do=")
::////通过逆运算检验答案,例如,批处理中 3/2 = 1 而 1*2 不等于 3。
%do% set /a test=((count !_%3! nd) !_%2! nc) !_%1! nb
%do% if %test% neq %na% (goto :next-2)
if %count% equ 24 (echo,        { [%na% %1 %nb%] %2 %nc% } %3 %nd% = 24 &set have=have %pexit%)

:next-2
set /a ca=na %1 nb,cb=nc %3 nd,pca=ca !_%1! nb,pcb=cb !_%3! nd
if %cb% equ 0 (goto :eof)
if %pca% neq %na% (goto :eof)
if %pcb% neq %nc% (goto :eof)
set /a count2=ca %2 cb,pcount2=count2 !_%2! cb
if %pcount2% neq %ca% (goto :eof)
if %count2% equ 24 (echo,        [%na% %1 %nb%] %2 [%nc% %3 %nd%] = 24 &set have=have %pexit%)
[ Last edited by 523066680 on 2009-1-10 at 10:49 ]

   此帖被 +30 点积分      点击查看详情   
评分人:【 moniuming 分数: +15  时间:2008-12-31 20:01
评分人:【 HAT 分数: +4  时间:2009-1-1 01:04
评分人:【 wxcute 分数: +4  时间:2009-1-3 13:51
评分人:【 xing7749 分数: +6  时间:2009-2-3 22:57
评分人:【 yovie 分数: +2  时间:2009-6-9 00:27
评分人:【 greeting 分数: -1  时间:2010-1-12 22:08




综合型编程论坛

我的作品索引
  
2008-12-31 18:20
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 2 楼』:  尽量列举版


@echo off &setlocal enabledelayedexpansion
title made by 523066680@[url]www.cn-dos.net[/url] - 算24.bat 尽量列举版
::::::::::::::::::::::::::::::::::::
::批处理算24.bat 尽量列举版
::作者:523066680
::blog [url]http://hi.baidu.com/523066680[/url]
::首发于:[url]http://www.cn-dos.net/forum/viewthread.php?tid=45488&fpage=1[/url]
::::::::::::::::::::::::::::::::::::
:input
for /f "tokens=1 delims==" %%a in ('set') do (set "%%a=")
set "pexit=&echo,"
set /a i=10,j=11,q=12,k=13
set _+=-
set _-=+
set _*=/
set _/=*
echo, &echo, 很多时候答案有重复,因为是对数字和运算符排列...
echo, &echo, 输入4个扑克牌的数字,[范围: 1 2 3 4 5 6 7 8 9 i j q k ]
echo, &echo, 其中1-9代表1-9 , i代表10 , j代表11 , q代表12 , k代表13
echo, &echo,请正确输入。 示例:  q q 1 2 (或者qq12)
echo, &set /p "str=可以用空格隔开,也可以不用 [exit 退出]: "
echo,
if "%str%"=="" (cls &goto :input)
if "%str%"=="exit" (exit)
call :fo "%str: =%" ""
if "%have%"=="" (echo, &echo,没有答案)
echo,
pause
cls &goto :input

:://////递进结合递归//////列举数字的排列组合//////
:fo
if %1=="" (
    if not "!defx%~2!"=="def" (call :next %~2 &set defx%~2=def)
    goto :eof
)
if not defined _%~1 (set _%~1=-1)
set str=%~1

:foa
  set /a _%~1+=1,foa=_%~1,fob=foa+1
  call :fo "!str:~0,%foa%!!str:~%fob%!" "%~2!str:~%foa%,1!"
  set str=%~1
  set /a foa=_%~1
if not "!str:~%foa%,-1!"=="" (goto :foa)
set "_%~1="
goto :eof

:://////组合运算符的所有排列形式//////对接收到的4个数字进行计算
:next
set num=%~1
set /a na=%num:~0,1%,nb=%num:~1,1%,nc=%num:~2,1%,nd=%num:~3,1%

set /a yn=nb*100/nc*nc,yn2=24*nb/nc*nc-24*nb
set "do=::"
if %yn% equ %nb%00 (set "do=")
%do% set /a spea=(na*10-nb*10/nc)*nd,speb=(na*10+nb*10/nc)*nd
%do% if %spea% equ 240 echo,        [ %na% - %nb% / %nc% ] * %nd% = 24 &set have=have %pexit%
%do% if %speb% equ 240 echo,        [ %na% + %nb% / %nc% ] * %nd% = 24 &set have=have %pexit%

set /a spec=(na-(nb*nc))*nd
if %spec% equ 24 echo,        [ %na% - %nb% * %nc% ] * %nd% = 24 &set have=have %pexit%

if %yn2% equ 0 (set "do=") else (set "do=::")
%do% set /a spef=24*nb/nc-24*nd,speg=-spef
%do% if %spef% equ %na% echo,        %na% / [ %nb% / %nc% - %nd% ] = 24  &set have=have %pexit%
%do% if %speg% equ %na% echo,        %na% / [ %nd% - %nb% / %nc% ] = 24  &set have=have %pexit%

set "fu=+ - x /"
for %%a in (%fu%) do (
for %%b in (%fu%) do (
  for %%c in (%fu%) do (
  set "fa=%%a" &set "fb=%%b" &set "fc=%%c"
  call :next-1 !fa:x=*! !fb:x=*! !fc:x=*!
  )
)
)
goto :eof

:next-1
set /a count=((na %1 nb) %2 nc) %3 nd
set "do=::"
if %count% equ 24 (set "do=")
::////通过逆运算检验答案,例如,批处理中 3/2 = 1 而 1*2 不等于 3。
%do% set /a test=((count !_%3! nd) !_%2! nc) !_%1! nb
%do% if %test% neq %na% (goto :next-2)
if %count% equ 24 (echo,        { [%na% %1 %nb%] %2 %nc% } %3 %nd% = 24 &set have=have %pexit%)

:next-2
set /a ca=na %1 nb,cb=nc %3 nd,pca=ca !_%1! nb,pcb=cb !_%3! nd
if %cb% equ 0 (goto :eof)
if %pca% neq %na% (goto :eof)
if %pcb% neq %nc% (goto :eof)
set /a count2=ca %2 cb,pcount2=count2 !_%2! cb
if %pcount2% neq %ca% (goto :eof)
if %count2% equ 24 (echo,        [%na% %1 %nb%] %2 [%nc% %3 %nd%] = 24 &set have=have %pexit%)
[ Last edited by 523066680 on 2009-1-10 at 10:52 ]



综合型编程论坛

我的作品索引
  
2008-12-31 18:26
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
dddyjq1
初级用户





积分 175
发帖 108
注册 2008-5-19
状态 离线
『第 3 楼』:  

可是很多没有答案啊,如1 5 5 5,1 4 5 6

   此帖被 +5 点积分      点击查看详情   
评分人:【 523066680 分数: +5  时间:2009-1-1 11:12


2008-12-31 23:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 4 楼』:  

如果确认 1555 可以算出24 ,请给出计算公式
我会给加10分,然后想办法解决问题.

[ Last edited by 523066680 on 2009-1-1 at 10:59 ]



综合型编程论坛

我的作品索引
  
2009-1-1 10:55
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 5 楼』:  

5*5-1^5=24
接分^_^

   此帖被 +11 点积分        点击查看详情   
评分人:【 523066680 分数: +11  时间:2009-1-1 11:11




2009-1-1 11:09
查看资料  发短消息 网志   编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 6 楼』:  

被挑骨头拉!!! 没话说, 加个限制, 之后的贴子只讨论加减乘除



综合型编程论坛

我的作品索引
  
2009-1-1 11:13
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
BC
中级用户




积分 338
发帖 175
注册 2007-10-21
状态 离线
『第 7 楼』:  

要是加上其他运算符,可要累死人了.



C:\
C:\Del BC
2009-1-1 15:08
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 8 楼』:  

(5-(1/5))*5

   此帖被 +15 点积分        点击查看详情   
评分人:【 BC 分数: +4  时间:2009-1-1 16:44
评分人:【 523066680 分数: +11  时间:2009-1-2 14:08




简单!简单!再简单!
2009-1-1 15:45
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
BC
中级用户




积分 338
发帖 175
注册 2007-10-21
状态 离线
『第 9 楼』:  

terse大侠还来个浮点的。。。



C:\
C:\Del BC
2009-1-1 16:44
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dmwan180
新手上路





积分 1
发帖 1
注册 2008-12-17
状态 离线
『第 10 楼』:  学习了

谢谢学习了

2009-1-2 15:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Helloworld
新手上路





积分 9
发帖 9
注册 2008-11-29
状态 离线
『第 11 楼』:  

那就调用vbs吧^_^

2009-1-2 19:13
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
sun0451789
新手上路





积分 5
发帖 3
注册 2007-10-14
状态 离线
『第 12 楼』:  

8楼的nb,真没想到你这么想,楼主,浮点运算啊,看你怎么办??
改一下,把存储方式改以下

2009-1-2 20:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dddyjq1
初级用户





积分 175
发帖 108
注册 2008-5-19
状态 离线
『第 13 楼』:  

vbs 要如何写?

2009-1-2 20:45
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wxcute
中级用户





积分 458
发帖 211
注册 2006-7-26
状态 离线
『第 14 楼』:  

比我写的那个强多了。{通过逆运算检验答案}这个好。



┌───────┐
├→学习→实践→┤
└───────┘
2009-1-3 13:52
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 15 楼』:  

各位,小数很分数的情况已经考虑
例如
特别例子 qq81 (12 12 8 1)
8 8 3 3
6 5 4 1
6 4 3 1
5 5 5 1
6 6 5 5
6 4 k 3
...

都可以算了

接下来能找到一个例子加减乘除算24 而此批处理又算不到的
我给+15分



综合型编程论坛

我的作品索引
  
2009-1-10 10:45
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
« [1] [2] [3] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: