免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: forward_ding
打印 上一主题 下一主题

算法问题求解。 [复制链接]

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
11 [报告]
发表于 2011-06-27 19:43 |只看该作者
本帖最后由 zhlong8 于 2011-06-27 19:49 编辑

所以写了个简单的编译器……显示不出连续两个 $ 见谅
  1. my @a = (
  2.     [1,2,3],
  3.     [12,343,'a'],
  4.     ['k' .. 'm']);

  5. '' =~ compile(@a);


  6. sub compile {
  7.     my @ary = @_;
  8.     my $re = '^';
  9.     my $name = 'a';
  10.     for my $items (@ary) {
  11.         $re .= '(?:';
  12.         $name ++;
  13.         $re .= join '|', map {qq,(?{local \$name = "$_"}),} @$items; # 两个 $
  14.         $re .= ')';
  15.     }

  16.     my $show = join '|', map "\$_", 'b' .. $name;  # 是两个 $
  17.     $show .= '\n';

  18.     $re .= qq,(?{print "$show"})(*F)\$,;

  19.     return qr/$re/x;
  20. }
复制代码

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
12 [报告]
发表于 2011-06-27 19:58 |只看该作者
本帖最后由 zhlong8 于 2011-06-27 20:21 编辑

幸福的童年啊
  1. my @a = (
  2.     [qw(瓜瓜 jason680 仙子)],
  3.     [qw(在)],
  4.     [qw(马路上 山顶 课堂上)],
  5.     [qw(吃饭 照镜子 逛街 跳舞 翻跟头)],
  6. );

  7. '' =~ compile @a;
复制代码
瓜瓜|在|马路上|吃饭
瓜瓜|在|马路上|照镜子
瓜瓜|在|马路上|逛街
瓜瓜|在|马路上|跳舞
瓜瓜|在|马路上|翻跟头
瓜瓜|在|山顶|吃饭
瓜瓜|在|山顶|照镜子
瓜瓜|在|山顶|逛街
瓜瓜|在|山顶|跳舞
瓜瓜|在|山顶|翻跟头
瓜瓜|在|课堂上|吃饭
瓜瓜|在|课堂上|照镜子
瓜瓜|在|课堂上|逛街
瓜瓜|在|课堂上|跳舞
瓜瓜|在|课堂上|翻跟头
jason680|在|马路上|吃饭
jason680|在|马路上|照镜子
jason680|在|马路上|逛街
jason680|在|马路上|跳舞
jason680|在|马路上|翻跟头
jason680|在|山顶|吃饭
jason680|在|山顶|照镜子
jason680|在|山顶|逛街
jason680|在|山顶|跳舞
jason680|在|山顶|翻跟头
jason680|在|课堂上|吃饭
jason680|在|课堂上|照镜子
jason680|在|课堂上|逛街
jason680|在|课堂上|跳舞
jason680|在|课堂上|翻跟头
仙子|在|马路上|吃饭
仙子|在|马路上|照镜子
仙子|在|马路上|逛街
仙子|在|马路上|跳舞
仙子|在|马路上|翻跟头
仙子|在|山顶|吃饭
仙子|在|山顶|照镜子
仙子|在|山顶|逛街
仙子|在|山顶|跳舞
仙子|在|山顶|翻跟头
仙子|在|课堂上|吃饭
仙子|在|课堂上|照镜子
仙子|在|课堂上|逛街
仙子|在|课堂上|跳舞
仙子|在|课堂上|翻跟头

论坛徽章:
3
15-16赛季CBA联赛之同曦
日期:2016-04-02 22:00:3915-16赛季CBA联赛之江苏
日期:2016-04-07 12:09:0015-16赛季CBA联赛之天津
日期:2016-05-04 01:20:19
13 [报告]
发表于 2011-06-27 19:59 |只看该作者
本帖最后由 3P用户 于 2011-06-27 23:01 编辑

用“进位制转化法”来做。

假令所有数组等长,如果数组长度为P,数组个数为N,我们只需将十进制数从小到大依次转成N位P进制数。再根据P进制数依次取出对应数组的对应元素,即可得楼主排列。
此法对数组数据类型无限制。仅为演示,可根据实际状况修改数据。
  1. #!/usr/bin/perl
  2. use strict;

  3. #十进制转换P进制函数,P除取余法
  4. my @arr; #转换时,单个P进制存于此数组,每元素存一位
  5. sub d_to_p{
  6.         my $quotient = int $_[0]/$_[1];
  7.         my $remainder = $_[0] - $quotient*$_[1];
  8.         unshift @arr,$remainder;
  9.         unless ($quotient) {
  10.                 return 1;
  11.         }else{
  12.                 d_to_p($quotient,$_[1]);
  13.         }
  14. }

  15. my @a1 = qw(1 2 3);
  16. my @a2 = qw(4 5 6);
  17. my @a3 = qw(6 7);

  18. my $P = 3;                  #数组长度
  19. my $arrCount = 3;           #数组个数
  20. my $total = $P**$arrCount;  #需要转换P进制数的总个数

  21. my @result = ();       #转换后P进制数列存于此,每元素一个P进制,每P进制数各位以逗号隔开
  22. foreach  ((0..$total-1)) {
  23.         @arr = ();
  24.         d_to_p($_,$P);
  25.         while($arrCount-$#arr-1){   #P进制位数不足者,左端补0
  26.                 unshift @arr,0;
  27.         }
  28.         push @result,join(",",@arr);
  29. }


  30. #输出演示
  31. foreach  (@result) {
  32.         my @tmpArr = split(",",$_);
  33.         if($a1[$tmpArr[0]] and $a2[$tmpArr[1]] and $a3[$tmpArr[2]])  #实际数组长度不等,当且仅当各位P进制位对应数组元素有定义时才输出。
  34.         {
  35.         print $a1[$tmpArr[0]],"|";
  36.         print $a2[$tmpArr[1]],"|";
  37.         print $a3[$tmpArr[2]],"\n";
  38.         }
  39. }
复制代码

评分

参与人数 1可用积分 +1 收起 理由
zhlong8 + 1 进制这种问题不需要每一位都一样

查看全部评分

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
14 [报告]
发表于 2011-06-27 21:18 |只看该作者
...
jason680|在|马路上|吃饭
jason680|在|马路上|照镜子
jason680|在|马路上|逛街
...
看到自己的ID.....吓了一跳....

  [qw(瓜瓜 jason680 仙子)],
而且跟两个版主并列....

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
15 [报告]
发表于 2011-06-28 07:23 |只看该作者
Using "echo", just for fun!
  1. #!/usr/bin/perl
  2. use strict;

  3. my @a1=(1,2,3);
  4. my @a2=(4,5,6);
  5. my @a3=(6,7);
  6. my $p;
  7. my @total;


  8. @total =("{", map {$_=~/[{}]/?$_:$_.","} (map {$_=~/#/?"}\\|{":$_} (@a1,"#",@a2,"#",@a3),"}"));
  9. $p= join "", map {$_} @total; $p=~s/,}/}/g;$p=~s/{([^,]+)}/$1/g;
  10. system("echo -e \"\\n\"$p")
复制代码

论坛徽章:
0
16 [报告]
发表于 2011-06-28 08:58 |只看该作者
  1. my $c = C->new( [1..3], ['a'..'c'], [], ['A'..'C'] );
  2. while( my $str = $c->get() ){
  3.     print $str, "\n";
  4. }

  5. package C;
  6. my (@array,@int,@func,$over);
  7. sub new {
  8.     my $self    = bless {}, shift;
  9.     return $self->add( @_ );
  10. }
  11. sub add {
  12.     my $self    = shift;
  13.     push @array, @_;
  14.     return $self;
  15. }
  16. sub get {
  17.     my $self    = shift;
  18.     $self->_init if ! @func;
  19.     my $string  = join '|', reverse map { $_->() } @func;
  20.     return $over ? undef : $string;
  21. }
  22. sub _init {
  23.     my $self    = shift;
  24.     foreach my $i( 0..$#array ){
  25.         my @arr = @{ $array[ $i ] } ? @{ $array[ $i ] } : ('');
  26.         unshift @func, sub {
  27.             if( $int[ $i ] > $#arr ){
  28.                 $int[ $i ] = 0;
  29.                 $int[ $i - 1 ] ++;
  30.                 $over = 1 if $i == 0;
  31.             }
  32.             my $ret = $arr[ $int[ $i ] ];
  33.             $int[ $i ]++ if $i == $#array;
  34.             return $ret;
  35.         };
  36.     }
  37. }
  38. 1;
复制代码

论坛徽章:
0
17 [报告]
发表于 2011-06-28 15:31 |只看该作者
谢谢各位,都很猛,我得抽时间好好研究一下,突然发现自己的基础很差{:3_201:}

另外问下zhlong8 在11楼里缺少的$是哪个变量的?

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
18 [报告]
发表于 2011-06-28 18:14 |只看该作者
谢谢各位,都很猛,我得抽时间好好研究一下,突然发现自己的基础很差

另外问下zhlong8 在11楼里 ...
forward_ding 发表于 2011-06-28 15:31



    就是标出来那两行 \ 后面应该是两个 $ 可是只显示出来一个。

    谁能解决显示不出来两个 $ 的问题?有奖 {:2_168:}

论坛徽章:
0
19 [报告]
发表于 2011-06-28 18:50 |只看该作者
test
  1. $$
复制代码

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
20 [报告]
发表于 2011-06-28 22:42 |只看该作者
本帖最后由 yinyuemi 于 2011-06-28 23:13 编辑
  1. \$$
复制代码
斑竹的代码:
  1. my @a = (
  2.     [1,2,3],
  3.     [12,343,'a'],
  4.     ['k' .. 'm']);

  5. '' =~ compile(@a);


  6. sub compile {
  7.     my @ary = @_;
  8.     my $re = '^';
  9.     my $name = 'a';
  10.     for my $items (@ary) {
  11.         $re .= '(?:';
  12.         $name ++;
  13.         $re .= join '|', map {qq,(?{local \$$name = "$_"}),} @$items; # 两个 $
  14.         $re .= ')';
  15.     }

  16.     my $show = join '|', map "\$$_", 'b' .. $name;  # 是两个 $
  17.     $show .= '\n';

  18.     $re .= qq,(?{print "$show"})(*F)\$,;

  19.     return qr/$re/x;
  20. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP