Board logo

标题: 三八二十四 [打印本页]

作者: wxcute     时间: 2008-10-10 21:17    标题: 三八二十四

首发:三八二十四@批处理之家
::code by wxcute @ bathome
@echo off
title 三八二十四
mode con cols=56 lines=7
cd/d "%~dp0"

::临时文件→
echo j+^

i-^

c*^

h/>TMP_fh
if not #%1==# %0
::思路
::%4 %_1% %5 %_2% %6 %_3% %7
:: A  +  B  +  C  +  D
::ABCD做排列
::符号做循环,并用以下公式加括号
echo %%4%%_1%%%%5%%_2%%%%6%%_3%%%%7^

(%%4%%_1%%%%5)%%_2%%%%6%%_3%%%%7^

(%%4%%_1%%%%5%%_2%%%%6)%%_3%%%%7^

%%4%%_1%%(%%5%%_2%%%%6)%%_3%%%%7^

%%4%%_1%%(%%5%%_2%%%%6%%_3%%%%7)^

%%4%%_1%%%%5%%_2%%(%%6%%_3%%%%7)^

(%%4%%_1%%%%5)%%_2%%(%%6%%_3%%%%7)>TMP_gs
::←临时文件

:bg
endlocal
cls

setlocal enabledelayedexpansion
set sr1=a b c d
::输入或生成四个1-10的数→
echo 直接回车将随机生成4个数
set/p shuru=输入四个1-10的数(用空格空开):
if "%shuru%"=="exit" del/q TMP_fh TMP_gs&goto :eof
if "%shuru%"=="" (
 set sw=随机&for %%s in (%sr1%) do call :setR %%s
) else (
 echo !shuru: =!|findstr "[^0-9]">nul&&goto err
 for %%r in (%shuru%) do call :setS %%r num
 for /l %%f in (1 1 4) do (
  if not defined num%%f goto :err
  if !num%%f! lss 1 goto :err
  if !num%%f! gtr 10 goto :err
 )
 set/a a=!num1!,b=!num2!,c=!num3!,d=!num4!
 set sw=输入
)
cls
echo.
echo.
echo     四个%sw%数:%a% %b% %c% %d%
::←
set/p=    正在计算,请稍后...<nul

::排列→
for %%a in (!sr1!) do (set sr2=!sr1:%%a =!
 for %%b in (!sr2!) do (set sr3=!sr2:%%b =!
  for %%c in (!sr3!) do (set sr4=!sr3:%%c =!
   call :pl %%a %%b %%c !sr4!
   if defined flag goto :show
) ) )
::←排列

:show
 if defined flag (
  set/p=          <nul
  echo.
::运算符号替换→
  for /f "tokens=1-4 delims=*" %%c in ("!gs!") do set gs_=%%c×%%d×%%e×%%f
  set/a xn=_c-3
  call set gs_=%%gs_:~,!xn!%%
  set gs=!gs_:+=+!
  set gs=!gs:-=-!
  set gs=!gs:/=÷!
::←运算符号替换
  set/p=    其中一结果:!gs!=%jg%<nul
 ) else (
  set/p=          <nul
  echo.
  set/p=    不好意思,没有算出来=_=^|<nul
 )
pause>nul
goto :bg

::调用标签→
:pl
 call :fh !%1! !%2! !%3! !%4!
 goto :eof

::符号循环→
:fh
set/a _j=0,_i=0,_c=0,_h=0
for /f %%i in (TMP_fh) do (
 for /f %%j in (TMP_fh) do (
  for /f %%k in (TMP_fh) do (
   call :crfh %%i %%j %%k %1 %2 %3 %4
   if defined flag goto :eof
  )
 )
)
goto :eof
::←符号循环

:crfh
 set fh1=%1&set fh2=%2&set fh3=%3
 set _1=!fh1:~-1!&set _2=!fh2:~-1!&set _3=!fh3:~-1!
 set/a _!fh1:~,1!+=1,_!fh2:~,1!+=1,_!fh3:~,1!+=1
 set/a he=_j+_i+_c+_h

::七个公式→
 for /f %%g in (TMP_gs) do (
  call :isR "%%g" %4 %5 %6 %7
  if defined flag goto :eof
 )
 if !he! equ 3 set/a _j=0,_i=0,_c=0,_h=0
 goto :eof
::←七个公式

::判断24整除→
:isR
 if %_i% equ 3 goto :eof
 if %_h% equ 3 goto :eof
 set gs=%~1
 set/a jg=%gs% 2>nul
 if "%jg%"=="24" (
  set flag=1
  if %_h% equ 1 (
   if not "%gs:(=%"=="%gs%" (
    if "%gs:/(=%"=="%gs%" (
     if "%gs:)/=%"=="%gs%" (
      call :gh0 %2 %3 %4 %5
     ) else call :ch1 gs gs2
    ) else call :ch1 gs gs2
   ) else call :gh0 %2 %3 %4 %5
  ) else if %_h% equ 2 call :ch2 gs gs2
 )
 goto :eof
:gh0
 if %_3%==/ set/a mod=%3%%%4&if not !mod!#==0# set flag=&goto :eof
 if %_2%==/ set/a mod=%2%%%3&if not !mod!#==0# set flag=&goto :eof
 if %_1%==/ set/a mod=%1%%%2&if not !mod!#==0# set flag=&goto :eof
 goto :eof
:ch1
 set "%2=!%1:/=%%!"
 set/a gs2=%gs2% 2>nul
 if not #%gs2%==#0 set flag=
 goto :eof
:ch2
 set "%11=!%1:(=!"
 if not "%gs1%"=="%gs%" set flag=&goto :eof
 set "%2=!%1:/1=!"
 set "gs2=!gs2:/=%%!"
 set/a gs2=%gs2% 2>nul
 if not #%gs2% equ #0 set flag=
 goto :eof
:setR
 set/a %1=%random%%%10+1
 goto :eof
:setS
 set/a %2+=1
 set num%num%=%1
 goto :eof
:err
 echo 输入有误!请重新输入
 ping -n 2 127.1>nul
 goto :bg
::←判断整除
[ Last edited by wxcute on 2008-10-10 at 21:21 ]
附件 1: 三八二十四.rar (2008-10-10 21:19, 1.67 K,下载次数: 11)

作者: HAT     时间: 2008-10-10 21:23
http://www.cn-dos.net/forum/viewthread.php?tid=38826
作者: wxcute     时间: 2008-10-10 21:26
我的可以处理整除。

请测试一下就知道了。比如 2 楼帖子里说的 10 10 4 4
作者: dddyjq1     时间: 2008-12-16 23:44
1 5 5 5就算不出来了
作者: moniuming     时间: 2008-12-17 15:30
怎么会是这种结果呢?

  Quote:
 四个输入数:2 3 4 1
           
 其中一结果:+=+=24



  Quote:
 四个输入数:1 2 3 4
           
 其中一结果:(1+2+3)×4=24