找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 34159|回复: 7

[文本处理] [已解决]批处理怎样把一组数据排列组合?

[复制链接]
发表于 2019-10-27 18:20:03 | 显示全部楼层 |阅读模式
有一组数据:[01,02,04,08,09,12,13,14,15,19,20,22,23,25,28,30,31,34,35]
每5个数字一行,
中间用逗号隔开,
每行数据不同,
还要排序
用XP批处理代码编写>>a.txt
格式如下:
01,02,04,08,09
01,02,04,08,12
01,02,04,08,13
......
01,02,04,08,35
01,02,04,09,12
01,02,04,09,13
.......

var[01,02,04,08,09,12,13,14,15,19,20,22,23,25,28,30,31,34,35]


参照@terse写的代码
________________________________________________

  1. @echo off&setlocal enabledelayedexpansion
  2. set " var=01 02 03 04 05 06 07 08 09 10"
  3. set "m=5"
  4. for %%i in (%var%) do (
  5.     set /a n+=1&set #!n!=%%i
  6.     if !n! leq !m! (set s=1!s!)else set s=!s!0
  7. )
  8. set/a r=n-m,i=j=1
  9. for /l %%i in (1,1,%r%) do set /a "i*=(n-%%i+1),j*=%%i"
  10. set s=0!s!&set /a "i/=j"
  11. (for /l %%i in (1 1 !i!) do (
  12.     for /l %%j in (1 1 !n!) do (
  13.         if "!s:~%%j,1!" == "1" set $=!$!,!#%%j!
  14.     )
  15.            for /f %%a in ("!s:10= !") do set "j=%%a"
  16.            set s=0!j:0=!!j:1=!1!s:*10=!
  17.            echo!$!&set "$="
  18. ))>$#.t
  19. sort $#.t /o a.txt
  20. del $#.t
  21. pause
复制代码
________________________________________________
排列组合公式:
set /a "i*=(n-%%i+1),j*=%%i"
C [10,5] =10*9*8*7*6/(5*4*3*2*1)=252
set /a "i/=j"
i=i(30240)/j(120)
i=252
发表于 2019-10-27 19:04:56 | 显示全部楼层
明确的说 就是 5选4  然后 FOR
代码前面已经给了吧

评分

参与人数 1技术 +1 收起 理由
wxyz0001 + 1 你太厉害了

查看全部评分

发表于 2019-10-27 20:25:45 | 显示全部楼层
python版本的
  1. import itertools

  2. for i in list(itertools.permutations(['01','02','04','08','09','12','13','14','15','19','20','22','23','25','28','30','31','34','35'],5)):
  3.     print(i)
复制代码
1395360种组合
发表于 2019-10-28 14:37:41 | 显示全部楼层
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "var=01 02 03 04 05 06 07 08 09 10"
  4. set "m=5"
  5. for %%i in (%var%) do (
  6.     set /a n+=1
  7.     set #!n!=%%i
  8.     if !n! leq !m! (
  9.         set s=1!s!
  10.     ) else (
  11.         set s=!s!0
  12.     )
  13.     echo --- 正在处理的var值:%%i
  14.     REM n没有初值,从0开始,每次循环加1
  15.     echo 当前n的值:!n!
  16.     REM s没有初值,从空字符串开始,每次循环在左边插入1或者在右边插入0
  17.     echo 当前s的值:!s!
  18. )
  19. pause
复制代码
 楼主| 发表于 2019-10-28 14:48:25 | 显示全部楼层
回复 4# Batcher

谢谢
 楼主| 发表于 2019-10-28 14:50:07 | 显示全部楼层
回复 3# ivor


    谢谢回复,我不会python,看不懂,暂时不学python
发表于 2019-10-30 09:25:41 | 显示全部楼层
回复 5# wxyz0001


如果不知道j的值是多少,观察一下:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "var=01 02 03 04 05 06 07 08 09 10"
  4. set "m=5"
  5. for %%i in (%var%) do (
  6.     set /a n+=1
  7.     set #!n!=%%i
  8.     if !n! leq !m! (
  9.         set s=1!s!
  10.     ) else (
  11.         set s=!s!0
  12.     )
  13.     echo --- 正在处理的var值:%%i
  14.     REM n没有初值,从0开始,每次循环加1
  15.     echo 当前n的值:!n!
  16.     REM s没有初值,从空字符串开始,每次循环在左边插入1或者在右边插入0
  17.     echo 当前s的值:!s!
  18. )
  19. echo,
  20. set /a r=n-m,i=j=1
  21. for /l %%i in (1,1,%r%) do (
  22.     set /a "i*=(n-%%i+1)"
  23.     set /a "j*=%%i"
  24. )
  25. set s=0!s!
  26. set /a "i/=j"
  27. (for /l %%i in (1 1 !i!) do (
  28.     for /l %%j in (1 1 !n!) do (
  29.         if "!s:~%%j,1!" == "1" (
  30.             set $=!$!,!#%%j!
  31.         )
  32.     )
  33.     for /f %%a in ("!s:10= !") do (
  34.         set "j=%%a"
  35.     )
  36.     echo j的值是:!j!
  37.     echo 替换之前s的值是:!s!
  38.     set s=0!j:0=!!j:1=!1!s:*10=!
  39.     echo 替换之后s的值是:!s!
  40.     echo !$!
  41.     set "$="
  42.     pause
  43. ))
  44. REM >$#.t
  45. REM sort $#.t /o a.txt
  46. REM del $#.t
  47. REM pause
复制代码

评分

参与人数 1技术 +1 收起 理由
wxyz0001 + 1 乐于助人

查看全部评分

 楼主| 发表于 2021-5-31 14:12:42 | 显示全部楼层
python版本的1395360种组合
ivor 发表于 2019-10-27 20:25

你的这个库用起来真方便
我没用库写的,代码可能还不够优化
  1. # 如果x小于10,前面加0
  2. def zero(x):
  3.     if x < 10:
  4.         return '0' + str(x)
  5.     else:
  6.         return str(x)

  7. # 相邻的数不重复
  8. def matrix(i, j, k, m, n):
  9.     if ((i != j) and (i != k) and (i != m) and (i != n) \
  10.             and (j != k) and (j != m) and (j != n) \
  11.             and (k != m) and (k != n) and (m != n)):
  12.         return i, j, k, m, n

  13. # 输出矩阵
  14. lottery = [3, 4, 6, 8, 9, 10, 13, 15, 16, 18]
  15. for a in lottery:
  16.     for b in lottery:
  17.         for c in lottery:
  18.             for d in lottery:
  19.                 for e in lottery:
  20.                     if matrix(a, b, c, d, e) != None:
  21.                         print(zero(a), zero(b), zero(c), zero(d), zero(e))
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 16:04 , Processed in 0.018303 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表