免费注册 查看新帖 |

Chinaunix

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

perl实例精解的一道题,求解 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2011-03-26 12:09 |只看该作者
本帖最后由 guap514 于 2011-03-26 12:14 编辑
  1. @color=('梅花','方块','红桃','黑桃');
  2. @number=('A',2..10,'J','Q','K');
  3. foreach $a (@color) {
  4.     foreach $b (@number) {
  5.         push (@c,$a.$b);
  6.     }
  7. }
  8. #$r = int(rand(52)) and @c[ $_, $r ] = @c[ $r, $_ ] for 0..9;
  9. $r = int(rand(52)) , @c[ $_, $r ] = @c[ $r, $_ ] for 0..9;
  10. print @c[0..9];
复制代码

论坛徽章:
0
12 [报告]
发表于 2017-03-22 12:54 |只看该作者
以下是我的实现方法,请指教!


  1. @huase=qw(Mei Fang Hong Hei);
  2. @numbers=('A', 2..10, 'J', 'Q', 'K');
  3. foreach $huase(@huase){                                          #生成52张牌;
  4.         foreach $numbers(@numbers){
  5.                 push @pai,"$huase"."$numbers";
  6.                 }
  7.         }
  8. print "@pai\n";                                      #打印出52张牌;

  9. print "10 randed pai is belowed:\n";

  10. $rand= int rand 52;
  11. push @rand10, $rand;
  12. #$i=0;

  13. #下面这个循环是用来生成10个不重复的52以内的随机整数。
  14. #然后再用这10个整数从52张牌中抽取10张不重复的牌。
  15. OUT: while(1){                                       
  16.         $rand=int rand 52;       
  17.         $geshu=@rand10;
  18.         foreach(@rand10){
  19.                 if ($rand==$_){
  20.                         $i=0;
  21.                         next OUT;
  22.                         }
  23.                 if($rand !=$_){
  24.                         $i++;
  25.                         if($i==$geshu){
  26.                                 push @rand10, $rand;
  27.                                 $geshu=@rand10;
  28.                                 last OUT if $geshu==10;
  29.                                 if ($geshu<10){
  30.                                         $i=0;
  31.                                         next OUT;
  32.                                         }
  33.                                 }
  34.                         }
  35.                 }
  36.         }
  37. print "@rand10","\n";   #打印出这10个不重复的52以内的随机整数。

  38. foreach (@rand10){
  39.         print "$pai[$_]\n";   #打印出这10张不重复的牌。
  40.         }
复制代码


论坛徽章:
0
13 [报告]
发表于 2017-03-22 12:54 |只看该作者
以下是我的实现方法,请指教!


  1. @huase=qw(Mei Fang Hong Hei);
  2. @numbers=('A', 2..10, 'J', 'Q', 'K');
  3. foreach $huase(@huase){                                          #生成52张牌;
  4.         foreach $numbers(@numbers){
  5.                 push @pai,"$huase"."$numbers";
  6.                 }
  7.         }
  8. print "@pai\n";                                      #打印出52张牌;

  9. print "10 randed pai is belowed:\n";

  10. $rand= int rand 52;
  11. push @rand10, $rand;
  12. #$i=0;

  13. #下面这个循环是用来生成10个不重复的52以内的随机整数。
  14. #然后再用这10个整数从52张牌中抽取10张不重复的牌。
  15. OUT: while(1){                                       
  16.         $rand=int rand 52;       
  17.         $geshu=@rand10;
  18.         foreach(@rand10){
  19.                 if ($rand==$_){
  20.                         $i=0;
  21.                         next OUT;
  22.                         }
  23.                 if($rand !=$_){
  24.                         $i++;
  25.                         if($i==$geshu){
  26.                                 push @rand10, $rand;
  27.                                 $geshu=@rand10;
  28.                                 last OUT if $geshu==10;
  29.                                 if ($geshu<10){
  30.                                         $i=0;
  31.                                         next OUT;
  32.                                         }
  33.                                 }
  34.                         }
  35.                 }
  36.         }
  37. print "@rand10","\n";   #打印出这10个不重复的52以内的随机整数。

  38. foreach (@rand10){
  39.         print "$pai[$_]\n";   #打印出这10张不重复的牌。
  40.         }
复制代码


论坛徽章:
0
14 [报告]
发表于 2017-03-22 12:55 |只看该作者
以下是我的实现方法,请指教!


  1. <div>@huase=qw(Mei Fang Hong Hei);</div><div>@numbers=('A', 2..10, 'J', 'Q', 'K');</div><div>foreach $huase(@huase){  <span class="Apple-tab-span" style="white-space:pre">                                        </span>#生成52张牌;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>foreach $numbers(@numbers){</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>push @pai,"$huase"."$numbers";</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div>print "@pai\n";              <span class="Apple-tab-span" style="white-space:pre">                        </span>#打印出52张牌;</div><div>
  2. </div><div>print "10 randed pai is belowed:\n";</div><div>
  3. </div><div>$rand= int rand 52;</div><div>push @rand10, $rand;</div><div>#$i=0;</div><div>
  4. </div><div>#下面这个循环是用来生成10个不重复的52以内的随机整数。</div><div>#然后再用这10个整数从52张牌中抽取10张不重复的牌。</div><div>OUT: while(1){<span class="Apple-tab-span" style="white-space:pre">                                        </span></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>$rand=int rand 52;<span class="Apple-tab-span" style="white-space:pre">        </span></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>$geshu=@rand10;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>foreach(@rand10){</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if ($rand==$_){</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>$i=0;</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>next OUT;</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if($rand !=$_){</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>$i++;</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>if($i==$geshu){</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>push @rand10, $rand;</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>$geshu=@rand10;</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>last OUT if $geshu==10;</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>if ($geshu<10){</div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>$i=0;</div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>next OUT;</div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div>print "@rand10","\n";   #打印出这10个不重复的52以内的随机整数。</div><div>
  5. </div><div>foreach (@rand10){</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>print "$pai[$_]\n";   #打印出这10张不重复的牌。</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div></div>
复制代码


论坛徽章:
0
15 [报告]
发表于 2017-03-22 12:56 |只看该作者
以下是我的实现方式,请指教!


  1. @huase=qw(Mei Fang Hong Hei);
  2. @numbers=('A', 2..10, 'J', 'Q', 'K');
  3. foreach $huase(@huase){                                          #生成52张牌;
  4.         foreach $numbers(@numbers){
  5.                 push @pai,"$huase"."$numbers";
  6.                 }
  7.         }
  8. print "@pai\n";                                      #打印出52张牌;

  9. print "10 randed pai is belowed:\n";

  10. $rand= int rand 52;
  11. push @rand10, $rand;
  12. #$i=0;

  13. #下面这个循环是用来生成10个不重复的52以内的随机整数。
  14. #然后再用这10个整数从52张牌中抽取10张不重复的牌。
  15. OUT: while(1){                                       
  16.         $rand=int rand 52;       
  17.         $geshu=@rand10;
  18.         foreach(@rand10){
  19.                 if ($rand==$_){
  20.                         $i=0;
  21.                         next OUT;
  22.                         }
  23.                 if($rand !=$_){
  24.                         $i++;
  25.                         if($i==$geshu){
  26.                                 push @rand10, $rand;
  27.                                 $geshu=@rand10;
  28.                                 last OUT if $geshu==10;
  29.                                 if ($geshu<10){
  30.                                         $i=0;
  31.                                         next OUT;
  32.                                         }
  33.                                 }
  34.                         }
  35.                 }
  36.         }
  37. print "@rand10","\n";   #打印出这10个不重复的52以内的随机整数。

  38. foreach (@rand10){
  39.         print "$pai[$_]\n";   #打印出这10张不重复的牌。
  40.         }
复制代码

论坛徽章:
0
16 [报告]
发表于 2017-03-22 12:56 |只看该作者
以下是我的实现方法,请指教!


@huase=qw(Mei Fang Hong Hei);
@numbers=('A', 2..10, 'J', 'Q', 'K');
foreach $huase(@huase){                                          #生成52张牌;
        foreach $numbers(@numbers){
                push @pai,"$huase"."$numbers";
                }
        }
print "@pai\n";                                      #打印出52张牌;

print "10 randed pai is belowed:\n";

$rand= int rand 52;
push @rand10, $rand;
#$i=0;

#下面这个循环是用来生成10个不重复的52以内的随机整数。
#然后再用这10个整数从52张牌中抽取10张不重复的牌。
OUT: while(1){                                       
        $rand=int rand 52;       
        $geshu=@rand10;
        foreach(@rand10){
                if ($rand==$_){
                        $i=0;
                        next OUT;
                        }
                if($rand !=$_){
                        $i++;
                        if($i==$geshu){
                                push @rand10, $rand;
                                $geshu=@rand10;
                                last OUT if $geshu==10;
                                if ($geshu<10){
                                        $i=0;
                                        next OUT;
                                        }
                                }
                        }
                }
        }
print "@rand10","\n";   #打印出这10个不重复的52以内的随机整数。

foreach (@rand10){
        print "$pai[$_]\n";   #打印出这10张不重复的牌。
        }

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
17 [报告]
发表于 2017-03-22 14:24 |只看该作者

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use utf8;
  5. use List::Util qw /shuffle/;

  6. sub Builder{
  7.         foreach my $suit ('黑桃', '红心', '梅花', '方块'){
  8.                 foreach my $point ('A', 2 .. 10, 'J', 'Q', 'K'){
  9.                         push (@_, [$suit, $point]);
  10.                 }
  11.         }
  12.         @_;
  13. }

  14. binmode (STDOUT, ':encoding(cp936)');
  15. my @aCards = Builder ();
  16. my @aRand = shuffle (0 .. $#aCards);
  17. my @aTen = splice (@aRand, 0, 10);
  18. print @{$aCards[$_]}, "\n" for @aTen;
复制代码

perl abc.pl
----------------------------
梅花A
梅花8
红心7
黑桃8
红心J
梅花7
梅花3
黑桃7
红心K
梅花6

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
18 [报告]
发表于 2017-03-24 01:50 |只看该作者
本帖最后由 rubyish 于 2017-03-23 21:53 编辑
  1. #!/usr/bin/perl

  2. sub Card {
  3.     my @map = map {
  4.         my $it = $_;
  5.         map $it . $_, 'A', 2 .. 10, 'J', 'Q', 'K'
  6.     } qw[♠ ♥ ♦ ♣];
  7.     \@map;
  8. }

  9. sub Pick {
  10.     my ( $card, $num ) = @_;
  11.     return [] if $num <= 0;
  12.     my @pick = ( 0 .. $#$card );
  13.     my $it   = @pick;
  14.     $num = $it if $num > $it;

  15.     for my $i ( 0 .. $num - 1 ) {
  16.         my $j = $i + rand $it--;
  17.         @pick[ $i, $j ] = @pick[ $j, $i ];
  18.     }
  19.     [ @$card[ @pick[ 0 .. $num - 1 ] ] ];
  20. }

  21. my $card = Card;
  22. my $pick = Pick $card, 10;
  23. print "@$pick\n";

  24. __DATA__

复制代码

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
19 [报告]
发表于 2017-03-24 02:19 |只看该作者
perl6
  1. #!perl6

  2. sub Card { <♠ ♥ ♦ ♣> X~ 'A', |(2 .. 10), 'J', 'Q', 'K' }
  3. my @card = Card;
  4. my @pick = @card.pick(10);
  5. say @pick;
复制代码


perl5: sub Card

  1. sub Card { glob '{♠,♥,♦,♣}{A,2,3,4,5,6,7,8,9,10,J,Q,K}' }
复制代码

论坛徽章:
0
20 [报告]
发表于 2017-03-24 10:43 |只看该作者
回复 1# 超级细菌

  1. <div>use List::Util 'shuffle';</div><div>use v5.10;</div><div>my @cards = glob '{♥,♠,♦,♣,}{2,3,4,5,6,7,8,9,10,A,J,Q,K}';</div><div>say @{[shuffle @cards]}[0..9];</div>
复制代码



您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP