Board logo

标题: [文本处理] [已解决]批处理怎样把一组数据排列组合? [打印本页]

作者: wxyz0001    时间: 2019-10-27 18:20     标题: [已解决]批处理怎样把一组数据排列组合?

有一组数据:[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

作者: terse    时间: 2019-10-27 19:04

明确的说 就是 5选4  然后 FOR
代码前面已经给了吧
作者: ivor    时间: 2019-10-27 20:25

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种组合
作者: Batcher    时间: 2019-10-28 14:37

  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
复制代码

作者: wxyz0001    时间: 2019-10-28 14:48

回复 4# Batcher

谢谢
作者: wxyz0001    时间: 2019-10-28 14:50

回复 3# ivor


    谢谢回复,我不会python,看不懂,暂时不学python
作者: Batcher    时间: 2019-10-30 09:25

回复 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
复制代码

作者: wxyz0001    时间: 2021-5-31 14:12

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))
复制代码





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