Board logo

标题: [其他] 批处理答[思考题]凶手、被害、帮凶、目击者 [打印本页]

作者: aa77dd@163.com    时间: 2015-6-4 17:49     标题: 批处理答[思考题]凶手、被害、帮凶、目击者

答  [思考题]凶手、被害、帮凶、目击者http://bbs.bathome.net/viewthread.php?tid=35974

问题规模不是很大, 所以以循环穷举来解

对以下各变量, 以单词首字母表示:
youngest 最年轻者
accessary 帮凶
victim 受害人
killer 凶手
eyewitness 目击者

1、帮凶和目击者性别不同
A == !E  <==>  A ^ E == TRUE

5、父亲年纪最大
O := F

2、最年长者和目击者性别不同
O == !E <==>  O ^ E == TRUE

3、最年轻者和被害者性别不同
Y == !V <==>  Y ^ V == TRUE

4、帮凶年纪比被害者大
必要条件:
Y <> A 且 V <> O

6、最年轻的不是凶手
Y <> K
  1. @echo off & setlocal enabledelayedexpansion
  2. set "$F=父" & set "$M=母" & set "$S=儿子" & set "$D=女儿"
  3. set /a "F=S=0, M=D=1" & REM 性别 男=0, 女=1
  4. set /a "@F=16, @M=8, @S=4, @D=2"
  5. set "P1=F M S D" & rem 父 母 子 女
  6. set "kids=S D" & rem 儿子和女儿
  7. FOR %%O IN (F) DO ( REM 父亲年纪最大
  8.    FOR %%Y IN (%KIDS%) DO ( REM youngest 最年轻者
  9.       FOR %%A IN (!P1!) DO ( REM accessary 帮凶
  10.          SET "P2=!P1:%%A=!"
  11.          FOR %%V IN (!P2!) DO ( REM victim 受害人
  12.             SET "P3=!P2:%%V=!"
  13.             FOR %%K IN (!P3!) DO ( REM killer 凶手
  14.                SET "P4=!P3:%%K=!"
  15.                FOR %%E IN (!P4!) DO ( REM eyewitness 目击者
  16.                   SET /A "TEST= (%%A ^^ %%E) & (%%O ^^ %%E) & (%%Y ^^ %%V) & (^!(@%%Y & @%%A) & ^!(@%%V & @%%O)) & ^!(@%%Y & @%%K)"
  17.   IF !TEST!==1 (
  18. ECHO 帮凶:!$%%A!, 受害人:!$%%V!, 凶手:!$%%K!, 目击者:!$%%E!, 最年轻:!$%%Y!
  19.   )
  20.                )
  21.             )
  22.          )
  23.       )
  24.    )
  25. )
  26. pause
  27. exit
复制代码
结果
帮凶:父, 受害人:儿子, 凶手:母, 目击者:女儿, 最年轻:女儿

作者: 523066680    时间: 2015-6-4 18:28

斯国一
作者: Bella    时间: 2015-6-4 21:34

本帖最后由 Bella 于 2015-6-5 11:46 编辑

出题区回不了贴
作者: 523066680    时间: 2015-6-4 21:46

回复 3# Bella


    难怪单独开帖,以前水的人太多。
作者: bailong360    时间: 2015-6-6 12:20

回复 12# aa77dd@163.com


    lz还是快点删掉这些无意义回复吧,不然等会反倒被扣分就不好了
作者: aa77dd@163.com    时间: 2015-6-6 15:38

本帖最后由 aa77dd@163.com 于 2015-6-6 15:44 编辑

本想刷分到 50, 结果一小时里只能发 10 帖, 也到不了, 而且删帖后分也没了.
OK, 慢慢等吧

以下答 [思考题]0-9在这10句话中出现的次数
http://www.bathome.net/redirect.php?tid=35997&goto=lastpost#lastpost

找到两个结果.
1,11,2,1,1,1,1,1,1,1
1,7,3,2,1,1,1,2,1,1
  1. @echo off & setlocal enabledelayedexpansion
  2. set /a "fsum_rem=30"
  3. for /l %%i in (9 -1 0) do set /a "g%%i = 1"
  4. call :f_search 9
  5. pause&exit
  6. :f_search
  7. setlocal
  8. set /a "t=%1 - 2 >> 31, fi_up=t & 21 | ~t & (19 + %1) / (t | (%1 - 1))"
  9. if %1==0 if !fi_up! gtr 3 set "fi_up=3"
  10. set /a "t=fsum_rem - %1, t1=(t - fi_up) >> 31, fi_up=(t1 & t) | (~t1 & fi_up)"
  11. if %1 lss 0 (
  12. echo !f0!,!f1!,!f2!,!f3!,!f4!,!f5!,!f6!,!f7!,!f8!,!f9!
  13. if "!f0!,!f1!,!f2!,!f3!,!f4!,!f5!,!f6!,!f7!,!f8!,!f9!"=="!g0!,!g1!,!g2!,!g3!,!g4!,!g5!,!g6!,!g7!,!g8!,!g9!" (
  14. echo 
  15. >>result.txt echo !f0!,!f1!,!f2!,!f3!,!f4!,!f5!,!f6!,!f7!,!f8!,!f9!
  16. )
  17. exit /b
  18. ) else (
  19. set /a next = %1 - 1
  20. for /l %%i in (!g%1! 1 !fi_up!) do (
  21. set /a "f%1 = %%i"
  22. set /a "fsum_rem -= f%1"
  23. set /a "a=f%1 / 10, b=f%1 %% 10"
  24. set /a "g!a! += ^!^! a, g!b! += 1"
  25. call :f_search !next!
  26. set /a "g!a! -= ^!^! a, g!b! -= 1"
  27. set /a "fsum_rem += f%1"
  28. )
  29. )
  30. endlocal& exit /b
复制代码





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