Board logo

标题: [原创]批处理算24点 [打印本页]

作者: 523066680     时间: 2008-12-31 18:20    标题: [原创]批处理算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 ]
作者: 523066680     时间: 2008-12-31 18:26    标题: 尽量列举版


@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 ]
作者: dddyjq1     时间: 2008-12-31 23:56
可是很多没有答案啊,如1 5 5 5,1 4 5 6
作者: 523066680     时间: 2009-1-1 10:55
如果确认 1555 可以算出24 ,请给出计算公式
我会给加10分,然后想办法解决问题.

[ Last edited by 523066680 on 2009-1-1 at 10:59 ]
作者: HAT     时间: 2009-1-1 11:09
5*5-1^5=24
接分^_^
作者: 523066680     时间: 2009-1-1 11:13
被挑骨头拉!!! 没话说, 加个限制, 之后的贴子只讨论加减乘除
作者: BC     时间: 2009-1-1 15:08
要是加上其他运算符,可要累死人了.
作者: terse     时间: 2009-1-1 15:45
(5-(1/5))*5
作者: BC     时间: 2009-1-1 16:44
terse大侠还来个浮点的。。。
作者: dmwan180     时间: 2009-1-2 15:26    标题: 学习了

谢谢学习了
作者: Helloworld     时间: 2009-1-2 19:13
那就调用vbs吧^_^
作者: sun0451789     时间: 2009-1-2 20:00
8楼的nb,真没想到你这么想,楼主,浮点运算啊,看你怎么办??
改一下,把存储方式改以下
作者: dddyjq1     时间: 2009-1-2 20:45
vbs 要如何写?
作者: wxcute     时间: 2009-1-3 13:52
比我写的那个强多了。{通过逆运算检验答案}这个好。
作者: 523066680     时间: 2009-1-10 10:45
各位,小数很分数的情况已经考虑
例如
特别例子 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分
作者: 523066680     时间: 2009-1-10 14:36
同学们,我寒窗苦读去了 这一个寒假谁见着我发帖,随便扣分。

留下一东西   压缩文件里有一些没发表的东西。


文章

[讨论]Batch Rename's Bug
http://www.cn-dos.net/forum/viewthread.php?tid=45655

[讨论]TalkAboutString
http://www.cn-dos.net/forum/viewthread.php?tid=45654

[分享][讨论]段落重定向方式改进
http://www.cn-dos.net/forum/viewthread.php?tid=45409

[讨论]2次ping1 不等于 1次ping2
http://www.cn-dos.net/forum/viewthread.php?tid=45410

[分享]%var%代替语句执行
http://www.cn-dos.net/forum/viewthread.php?tid=45240

贪吃蛇思路解析 (23楼)
http://www.cn-dos.net/forum/viewthread.php?tid=43369

建立永久的畸形盘符
http://www.cn-dos.net/forum/viewthread.php?tid=41796


数学相关:
[原创]不限制位数,10进制内同进制的两个数之间相乘
http://www.cn-dos.net/forum/viewthread.php?tid=46288

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

[数值计算]1-99内整数开根
http://www.cn-dos.net/forum/viewthread.php?tid=43046


应用:

[已解决]能否更改批处理脚本的进程名称? (已找到解答,在24楼链接。)
http://www.cn-dos.net/forum/viewthread.php?tid=42169

[求助]如何用脚本实现待机?打开屏保?
http://www.cn-dos.net/forum/viewthread.php?tid=45522

[原创]批处理脚本打包工具
http://www.cn-dos.net/forum/viewthread.php?tid=44620

[vbs]满1小时就关机
http://www.cn-dos.net/forum/viewthread.php?tid=45242

[分享]生成待编写的测试脚本
http://www.cn-dos.net/forum/viewthread.php?tid=45250

[原创]举出当前最小和最大的bat文件
http://www.cn-dos.net/forum/viewthread.php?tid=41517

[原创]001,002,003式的批量重命名
http://www.cn-dos.net/forum/viewthread.php?tid=41643


娱乐,特效:

[特效]数字阵逐点显现,随机
http://www.cn-dos.net/forum/viewthread.php?tid=45878

[原创]批处理写大字效果--新年贺卡
http://www.cn-dos.net/forum/viewthread.php?tid=45411

动画特效:画圆、弹球、进度条、起落等
http://www.cn-dos.net/forum/viewthread.php?tid=42124

[原创]纯批处理版贪吃蛇
http://www.cn-dos.net/forum/viewthread.php?tid=43369

[原创]中间渐渐变大的圆
http://www.cn-dos.net/forum/viewthread.php?tid=44785

空间随机游动粒子+贪吃蛇初版
http://www.cn-dos.net/forum/viewthread.php?tid=43059

【视觉类】前进中的道路+飞机大炮
http://www.cn-dos.net/forum/viewthread.php?tid=41333

【视觉类】从中间逐渐扩大再变小的方形框框+变色   
http://www.cn-dos.net/forum/viewthread.php?tid=40711

时钟--斜体+毫秒(更新,减少cpu和闪烁)   
http://www.cn-dos.net/forum/viewthread.php?tid=41833

[原创]潜水数天,完成了自己满意的数码雨
http://www.cn-dos.net/forum/viewthread.php?tid=42113

【算是月贴】我尽量减少闪烁的批处理大时钟
http://www.cn-dos.net/forum/viewthread.php?tid=41757

[动画]一路小跑,第一集,跳!
http://www.cn-dos.net/forum/viewthread.php?tid=41981

做了一个自己满意的滚动字幕
http://www.cn-dos.net/forum/viewthread.php?tid=39780


回帖:

【挑战】用批处理画出正方形和抛物线   14楼  15楼 18楼
http://bbs.bathome.cn/thread-3537-2-1.html

  [出题]批处理趣味数学之n阶蛇形方阵  28楼
http://www.cn-dos.net/forum/viewthread.php?tid=42472

  [已结]怎样生成一个纯数字的密码字典 6楼
http://www.cn-dos.net/forum/viewthread.php?tid=33139

  [已结]排列组合  27楼
http://www.cn-dos.net/forum/viewthread.php?tid=41243


水区:

[分享]徒手编数独阵
http://www.cn-dos.net/forum/viewthread.php?tid=45817

以歧视之道还治歧视之身
http://www.cn-dos.net/forum/viewthread.php?tid=45986

523066680语录
http://www.cn-dos.net/forum/viewthread.php?tid=46304

[分享][转载]半截故事
http://www.cn-dos.net/forum/viewthread.php?tid=45521

光速矛盾
http://www.cn-dos.net/forum/viewthread.php?tid=44789

1=0.9999999……?  
http://www.cn-dos.net/forum/viewthread.php?tid=43058

[ Last edited by 523066680 on 2009-5-1 at 23:05 ]
附件 1: 523066680作品.rar (2009-1-10 14:51, 85.04 K, 下载附件所需积分 1点 ,下载次数: 31)

作者: 523066680     时间: 2009-1-22 17:25
我被菜了~  请看
http://tieba.baidu.com/f?kz=522864657
10楼
作者: yishanju     时间: 2009-1-22 17:45
我终于忍扣你分冲动
还是加分吧
作者: yishanju     时间: 2009-1-22 17:54
好孩子,有前途的
我看好你,努力吧
作者: BaseCoder     时间: 2009-1-22 18:10
10 10 4 4

((10*10)-4)/4
作者: 523066680     时间: 2009-1-23 12:11
楼上的可以啊
作者: zch1366     时间: 2009-1-25 13:54
要是加上其他运算符,可要累死人了.
作者: 523066680     时间: 2009-1-25 15:52
那我可不干 我还要 happy 牛 year !
作者: pzwren     时间: 2009-1-25 17:23
谢谢学习了
作者: solid     时间: 2009-1-25 21:40
进来膜拜楼主
作者: yishanju     时间: 2009-1-26 00:37


  Quote:
Originally posted by 523066680 at 2009-1-25 18:12:
真受不了呢……  这样的水贴……

所以说呢,哈哈,我扣你分
作者: 54cml     时间: 2009-5-27 03:28
(3+3/7)*7=24
3377
作者: dnntgmfd     时间: 2009-5-27 04:44
楼主好狂啊!
作者: 54cml     时间: 2009-5-27 11:13
(4-4/7)*7
作者: 523066680     时间: 2009-5-27 21:41
呜呜…… 就那个式子类型都……
哎,别人那个代码比我的短很多,我也就没改了

  Quote:
回复:【精品】我也来写批处理 ...  
@echo off
setlocal enableextensions enabledelayedexpansion
title 作者:liuzhaonan11
echo 批处理算24点&echo.
:loop
set /p "n=输入四个数用空格分开: "
set /a "lzn=0"
for %%i in (!n!) do set /a "lzn+=1"&set /a "lz!lzn!z=%%i,lz!lzn!m=1,lz!lzn!s=%%i"
call:liuzhaonan11 lz
if not errorlevel 1 echo 结果: 没有答案
goto loop
原理说明:使用有理数进行计算,选择算式中最先结合的两数和它们之间的运算,并递归.
:liuzhaonan11
setlocal
set "f1=+"&set "f2=-"&set "f3=*"&set "f4=/"
for /l %%i in (1,1,!%1n!) do for /l %%j in (1,1,!%1n!) do if %%i neq %%j (
for /l %%k in (1,1,4) do (
setlocal
if %%k leq 2 set /a "z=%1%%jz*%1%%im!f%%k!%1%%jm*%1%%iz,m=%1%%jm*%1%%im"
if %%k equ 3 set /a "z=%1%%jz*%1%%iz,m=%1%%jm*%1%%im"
if %%k equ 4 set /a "z=%1%%jz*%1%%im,m=%1%%jm*%1%%iz"
if !%1n! equ 2 (
set /a "t=!z!-24*!m!"
if !t! equ 0 if !m! neq 0 echo 结果: !%1%%js! !f%%k! !%1%%is! = 24&exit /b 1
) else (
set "s=(!%1%%js! !f%%k! !%1%%is!)"&set /a "n=0"
for /l %%l in (1,1,!%1n!) do if %%l neq %%i if %%l neq %%j (
set /a "n+=1"&set "%1!n!z=!%1%%lz!"&set "%1!n!m=!%1%%lm!"&set "%1!n!s=!%1%%ls!"
)
set /a "n+=1"&set "%1!n!z=!z!"&set "%1!n!m=!m!"&set "%1!n!s=!s!"
set "%1n=!n!"&call%0 %1
if errorlevel 1 exit /b 1
)
endlocal
)
)
exit /b 0  

  
作者:liuzhaonan11    2009-1-11 17:17   回复此发言   

--------------------------------------------------------------------------------


作者: renchmin     时间: 2009-5-27 21:43
原来这里的dos高手还是真的多啊,这个也能用批处理来完成啊。
作者: yovie     时间: 2009-6-9 00:29
拜一个。
作者: Declan     时间: 2009-6-15 23:23
继续努力....目标就是你....
作者: Fair     时间: 2009-8-21 12:30
文章整理的不错 慢慢看看代码