Chinaunix

标题: 求助:请大家帮忙写段N选6排列组合的perl代码 [打印本页]

作者: apkood    时间: 2013-01-23 10:54
标题: 求助:请大家帮忙写段N选6排列组合的perl代码
本帖最后由 apkood 于 2013-01-23 10:59 编辑

想请大家帮忙写段N选6排列组合的perl代码,具体文件与要求如下:
     这是文档a.txt的内容,有很多行这里只取了10行作样式,每一行大约是12-28个自然数,需要将毎一行的数按6个为一组进行排列组合,将其结果保存为b.txt,其中关健是毎一行的组合结果要达到b.txt的样式,也就是将组合结果连在一起,希望大家在百忙中抽些时间帮帮我,谢谢大家!

a.txt文档样式
01 06 07 08 09 10 12 15 16 17 21 22 23 25 26 27 28 29 30         
03 04 05 06 08 09 11 12 16 18 22 23 24 25 29 30 31 32      
01 02 03 04 05 08 09 13 14 17 20 21 22 25 26 28 29 30 31 32 33     
02 03 05 07 11 15 18 20 21 22 24 28 30 33           
01 06 07 08 09 10 12 15 16 17 21 22 25 27 29 30         
01 02 03 07 09 10 11 12 14 19 22 24 29 30 31 32 33        
01 02 03 04 05 06 07 12 14 15 20 21 25 26 27 29 31        
01 03 05 06 09 12 14 16 17 18 21 22 23 29 31 33         
01 03 08 10 12 14 15 16 17 18 25 29 30 31 32 33         

b.txt文档样式  (下面这个结果是用vba运行岀来的,受excel行数限制处理不了)

01 06 07 08 09 10   (a.txt第一行n迭6排列组合的开始行)
·
·这里的组合省略了
·
25 26 27 28 29 30   (a.txt第一行n迭6排列组合的结束行)
03 04 05 06 08 09   (a.txt第二行n迭6排列组合的开始行)
·
·这里的组合省略了
·
24 25 29 30 31 32   (a.txt第二行n迭6排列组合的结束行)
01 02 03 04 05 08   (a.txt第三行n迭6排列组合的开始行)
·
·这里的组合省略了
·
28 29 30 31 32 33   (a.txt第三行n迭6排列组合的结束行)
02 03 05 07 11 15   (a.txt第四行n迭6排列组合的开始行)
·
下面的组合也省略了
·
·
·
作者: mcshell    时间: 2013-01-23 11:30
本帖最后由 mcshell 于 2013-01-23 12:55 编辑

跳过这里{:3_194:} 前面误解题意了
作者: cecial    时间: 2013-01-23 11:35
回复 2# mcshell

不懂这个匹配啊。。
这个应该不能随机?


   
作者: rubyish    时间: 2013-01-23 11:43
如下:
  1. #!/usr/bin/perl
  2. use 5.016;

  3. open my $fa, '<', 'a.txt';
  4. open my $fb, '>', 'b.txt';

  5. while (<$fa>) {
  6.     say $fb "@$_" for cb( 6, split );
  7. }

  8. sub cb {
  9.     my ( $n, $h, @t ) = @_;
  10.     $n ? $h ? undef : return : return [];
  11.     map( { [ $h, @$_ ] } cb( $n - 1, @t ) ), cb( $n, @t );
  12. }
复制代码

作者: mcshell    时间: 2013-01-23 12:53
如果排列组合的话。。。{:3_190:}
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Math::Combinatorics;
  5. open FA,'a.txt' or die "$!";
  6. open FB,'>b.txt' or die "$!";
  7. while(<FA>){
  8.    my @arr = split;
  9. print FB join( "\n", map { join( " ", @{$_} ) } combine( 6, @arr ) ), "\n";
  10. }
  11. close FA;
  12. close FB;
复制代码

作者: jiang870320    时间: 2013-01-23 13:19
#!/usr/bin/perl
use strict;
use warnings;
open TXT,">test111.txt" or die "$!\n";
while (<DATA>){
my $str=/((\d\d\s){5}\d\d).*/;
$str=$1;
print TXT "$str\n";
}
close TXT;













__DATA__
01 06 07 08 09 10 12 15 16 17 21 22 23 25 26 27 28 29 30         
03 04 05 06 08 09 11 12 16 18 22 23 24 25 29 30 31 32      
01 02 03 04 05 08 09 13 14 17 20 21 22 25 26 28 29 30 31 32 33     
02 03 05 07 11 15 18 20 21 22 24 28 30 33           
01 06 07 08 09 10 12 15 16 17 21 22 25 27 29 30         
01 02 03 07 09 10 11 12 14 19 22 24 29 30 31 32 33        
01 02 03 04 05 06 07 12 14 15 20 21 25 26 27 29 31        
01 03 05 06 09 12 14 16 17 18 21 22 23 29 31 33         
01 03 08 10 12 14 15 16 17 18 25 29 30 31 32 33
作者: zhlong8    时间: 2013-01-23 13:42
本帖最后由 zhlong8 于 2013-01-23 13:44 编辑

你算过数量级没有,一行28项仅组合就 37万组,排列两亿多
作者: wsxedcer    时间: 2013-01-23 14:14
本帖最后由 wsxedcer 于 2013-01-23 14:16 编辑

回复 7# zhlong8


    我艹,跳过吧
作者: apkood    时间: 2013-01-23 14:35
本帖最后由 apkood 于 2013-01-23 15:29 编辑

谢谢大家的回复!我用的是windows xp下perl -v5.8.8运行出错,不知是什么原因?


[attachimg]636358[/attachimg     





  


诚请各位大侠指点一下,谢谢!

pt.JPG (26.58 KB, 下载次数: 2)

pt.JPG

作者: mcshell    时间: 2013-01-23 15:01
{:3_199:}貌似看起来又是彩票
作者: zhlong8    时间: 2013-01-23 18:33
回复 9# apkood


    say 相当于 print 然后再打印个换行,你稍微改下就是了。那个模块可以在命令行用 “cpan 模块名” 安装
作者: gaoyang636    时间: 2013-01-24 09:54
回复 5# mcshell


    学习了这个module {:3_182:} 3q!





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2