免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 81201 | 回复: 104
打印 上一主题 下一主题

ChinaUnix技术实践之三——Perl编程大赛 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-02-24 16:43 |只看该作者 |倒序浏览
获奖名单已公布,详情请看:http://bbs.chinaunix.net/thread-2293632-1-1.html   

Perl版块在ChinaUnix社区内一直是CU的技术讨论比较热烈的版块。之前我们已经成功举办了PHP和C/C++的程序设计大赛,今天我们举办第三期perl的程序设计大赛,发挥您的技术之长,赢取我们为优胜者准备的丰富奖品,欢迎大家踊跃参加!

第一期:PHP编程大赛 http://bbs.chinaunix.net/thread-1788191-1-1.html
第二期:C/C++编程大赛http://bbs.chinaunix.net/thread-1820953-1-1.html

参赛要求:参与活动必须是chinaunix社区的注册会员

点击注册: http://sso.chinaunix.net/Register

大赛日程:

参赛时间:2011.2.24~2011.03.16

评选时间:2011.3.17~2011.3.24

结果公布:2011.03.25

奖项设置:
一等奖:3名,赠送KingCamp威尼斯户外背包(25升)一件,市场价328元。        
二等奖:10名,赠送特别定制版ChinaUnix商务衬衫,获奖者为最先正确完成7道试题的十名用户,市场价258元。
三等奖:15名,赠送ChinaUnix 9周年限量版ChinaUnix春秋长袖T恤,获奖者为最先正确完成6道试题的十名用户,市场价198元。

活动细则:
(1)代码规范:使用标准Perl语言,采用编程标准可以使项目更加顺利地完成。
(2)性能:应用程序可以运行与高效运行是两个层次,保证程序的最佳效率。
(3)简洁:写代码是一种艺术。除了正确的缩进、大小写、命名规则之外,请时刻牢记爱因斯坦的名言--简单就是美。
(4)每位会员可以发表多个代码,以最高评价为准,不可重复获奖;
(5)提交代码请跟帖发表,并附相关系统环境及编译环境说明。
评选获奖的依据:答题的时间及答题的质量为依据,邀请嘉宾作为评选人。

代码提交:
参赛者以跟帖的方式提交代码,相似代码以最先提交为准,谁最早提交谁优秀。
注:严禁抄袭,一经发现,取消评选资格;


大赛评委团:

兰花仙子:ChinaUnix Perl资深版主,10年Perl编程经验,用Perl实际参与过许多大型系统的设计开发
Flw:       ChinaUnix Perl资深版主,网友熟知Perl版牛人。
2gua:    研究各种开源软件/语言技术,从Perl 5.0开始关注Perl。
更多嘉宾正在邀请中,欢迎自荐。

大赛联系人:
无风之谷 xuguangyao@it68.com QQ:19721714

大赛试题:

1. 请正确的精简如下代码。

sub myfunc {
    # $x = ...;

    if ( $x ) {
        return 1;
    } else {
        return;
    }
}


2. $x=()结果是什么?列表位于标量上下文是什么情况?()是不是用来创建空的list?请解释原因。

3. 1,2,3,5,6,7,8 如何合并成1-3,5-8?

4.@x=(5,7,9); $x[1]与@x[1]的区别是什么?

5. 用最短和优的perl代码对当前目录下的文件和子目录按修改时间进行排序。

6.传入一串数字并返回所有大于平均值的数字。

7.让用户不断猜测范围从1到100的秘密数字,直到猜中为止。程序应该以魔术公式lnt(1+rand 100)来随机产生秘密数字。当用户猜错时,程序应相应“too high”或者“too low”。如果用户quit或者exit或者键入一个空白行程序就中止。当然如果用户猜到了,程序也应该中止。

8. 写一个简单的TCP Echo Server,在linux/unix环境运行,侦听在特定端口,接受用户的网络输入,并返回同样的数据给对方,能接受quit命令。
基本要求:
(1)无阻塞IO。
(2)daemon方式运行。
(3)能接受kill -HUP重启信号。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2011-02-24 17:19 |只看该作者
我靠,这里面的题目我都不会,仙子香吻估计只能通过私人渠道了。

论坛徽章:
224
2022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32操作系统版块每日发帖之星
日期:2016-02-18 06:20:00操作系统版块每日发帖之星
日期:2016-03-01 06:20:00操作系统版块每日发帖之星
日期:2016-03-02 06:20:0015-16赛季CBA联赛之上海
日期:2019-09-20 12:29:3219周年集字徽章-周
日期:2019-10-01 20:47:4815-16赛季CBA联赛之八一
日期:2020-10-23 18:30:5320周年集字徽章-20	
日期:2020-10-28 14:14:2615-16赛季CBA联赛之广夏
日期:2023-02-25 16:26:26CU十四周年纪念徽章
日期:2023-04-13 12:23:1015-16赛季CBA联赛之四川
日期:2023-07-25 16:53:45操作系统版块每日发帖之星
日期:2016-05-10 19:22:58
3 [报告]
发表于 2011-02-24 17:25 |只看该作者
1. 请正确的精简如下代码。

sub myfunc {
    # $x = ...;

    if ( $x ) {
        return 1;
    } else {
        return; // perl 可以直接 return novalue?
    }
}

论坛徽章:
7
巳蛇
日期:2014-04-10 08:54:57白羊座
日期:2014-04-22 20:06:262015年亚洲杯之沙特阿拉伯
日期:2015-02-10 14:18:532015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之吉达阿赫利
日期:2015-06-02 11:34:112015亚冠之武里南联
日期:2015-06-24 12:13:082015亚冠之阿尔纳斯尔
日期:2015-08-03 09:08:25
4 [报告]
发表于 2011-02-24 17:37 |只看该作者
我试着回答一下吧,看我可以完成多少。一题一贴:
1.

  1. sub myfunc {
  2.     # $x = ...;

  3.     $x and 1;
  4. }
复制代码

论坛徽章:
7
巳蛇
日期:2014-04-10 08:54:57白羊座
日期:2014-04-22 20:06:262015年亚洲杯之沙特阿拉伯
日期:2015-02-10 14:18:532015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之吉达阿赫利
日期:2015-06-02 11:34:112015亚冠之武里南联
日期:2015-06-24 12:13:082015亚冠之阿尔纳斯尔
日期:2015-08-03 09:08:25
5 [报告]
发表于 2011-02-24 17:38 |只看该作者
2. 结果是 undef。列表在标量上下文中返回最后一个元素。() 是用来创建空的 list 的。原因:

在 Perl 5 中,数组在标量上下文中返回它的大小,但是列表与数组不同,它会返回列表的最后一个无素。不像 Perl 6 中,构建列表的是 ",",在 Perl 5 中,列表由 “(” 和 “)“ 创建,() 创建的是空列表,它没有元素,也就是无定义,因此在标量环境下返回的是 undef。

论坛徽章:
7
巳蛇
日期:2014-04-10 08:54:57白羊座
日期:2014-04-22 20:06:262015年亚洲杯之沙特阿拉伯
日期:2015-02-10 14:18:532015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之吉达阿赫利
日期:2015-06-02 11:34:112015亚冠之武里南联
日期:2015-06-24 12:13:082015亚冠之阿尔纳斯尔
日期:2015-08-03 09:08:25
6 [报告]
发表于 2011-02-24 17:38 |只看该作者
3.

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my @numbers = (1,2,3, 5,6,7,8);
  5. my $last_no = shift @numbers;
  6. my @tmp = [$last_no, $last_no];
  7. for my $no (@numbers) {
  8.     if ($no - $last_no == 1) {
  9.         $tmp[$#tmp][1] = $last_no = $no
  10.     } else {
  11.         push @tmp, [$no, $no];
  12.         $last_no = $no;
  13.     }
  14. }

  15. my @result;
  16. for my $r_range (@tmp) {
  17.     push @result, $r_range->[0] == $r_range->[1] ? $r_range->[0] : join "-", @$r_range;
  18. }
  19. print join ",", @result;
复制代码

论坛徽章:
7
巳蛇
日期:2014-04-10 08:54:57白羊座
日期:2014-04-22 20:06:262015年亚洲杯之沙特阿拉伯
日期:2015-02-10 14:18:532015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之吉达阿赫利
日期:2015-06-02 11:34:112015亚冠之武里南联
日期:2015-06-24 12:13:082015亚冠之阿尔纳斯尔
日期:2015-08-03 09:08:25
7 [报告]
发表于 2011-02-24 17:39 |只看该作者
4. $x[1] 是标量,@x[1] 是 slice,也就是列表,尽管它的长度为1。

论坛徽章:
7
巳蛇
日期:2014-04-10 08:54:57白羊座
日期:2014-04-22 20:06:262015年亚洲杯之沙特阿拉伯
日期:2015-02-10 14:18:532015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之吉达阿赫利
日期:2015-06-02 11:34:112015亚冠之武里南联
日期:2015-06-24 12:13:082015亚冠之阿尔纳斯尔
日期:2015-08-03 09:08:25
8 [报告]
发表于 2011-02-24 17:50 |只看该作者
第五题先空着,之后在写,
6.

  1. #!/usr/bin/env perl

  2. use 5.12.0;

  3. my @numbers = @ARGV;
  4. my $average = 0;
  5. $average   += $_ for @numbers;
  6. $average   /= @numbers;
  7. say $average;

  8. say join "\t", grep { $_ > $average} @numbers;
复制代码
把要处理的数字从命令行传入。

论坛徽章:
0
9 [报告]
发表于 2011-02-24 18:08 |只看该作者
先声明下,我是新手,正在看Learning Perl 第五版,来凑个热闹 。。。

1. 请正确的精简如下代码。

sub myfunc {
    # $x = ...;

    if ( $x ) {
        return 1;
    } else {
        return;
    }
}
#########################################
sub myfunc{
    #$x= ...;
    $x?1:return;
}
#########################################

2. $x=()结果是什么?列表位于标量上下文是什么情况?()是不是用来创建空的list?请解释原因。
#########################################
$x 是 undef
列表位于标量上下文应该返回最后一个元素,此处()空列表所以返回undef
#########################################

3. 1,2,3,5,6,7,8 如何合并成1-3,5-8?

4.@x=(5,7,9); $x[1]与@x[1]的区别是什么?
#########################################
@x[1]还没见过。。。
#########################################

5. 用最短和优的perl代码对当前目录下的文件和子目录按修改时间进行排序。
#########################################
最短的 my @sorted=sort {(-M $a)<=>(-M $b)} (<*>);

最优的 opendir? 不会优化, 等待高手。。。
#########################################

6.传入一串数字并返回所有大于平均值的数字。
#########################################
sub hi_everage
{
    my ($everage,$sum)=(0,0);
    my @high=();
    foreach(@_)
    {
        $sum+=$_;
    }
    $everage=$sum/@_;
   
    foreach(@_)
    {
        if($_>$everage)
        {
            push @high,$_;
        }
    }
   
    return @high;
}
#########################################

7.让用户不断猜测范围从1到100的秘密数字,直到猜中为止。程序应该以魔术公式lnt(1+rand 100)来随机产生秘密数字。当用户猜错时,程序应相应“too high”或者“too low”。如果用户quit或者exit或者键入一个空白行程序就中止。当然如果用户猜到了,程序也应该中止。
#########################################
#!/usr/bin/perl -w
use strict;
use 5.010;

my $secret=int(1+rand 100);
my $guess;

print "Guess the secret: ";
while($guess=<STDIN>)
{
     chomp $guess;
     given($guess)
     {
        when(/[^\d+]|^\s*$/){say "input error";}
        when($_==$secret){say "you got it!";last}
        when($_<$secret){say "too low";}
        when($_>$secret){say "too high"}
        when(/exit|quit/){say "bye~";}
     }
}
#########################################


8. 写一个简单的TCP Echo Server,在linux/unix环境运行,侦听在特定端口,接受用户的网络输入,并返回同样的数据给对方,能接受quit命令。
基本要求:
(1)无阻塞IO。
(2)daemon方式运行。
(3)能接受kill -HUP重启信号。

#########################################
Learning Perl 还没看完,完全不会。。。
#########################################

论坛徽章:
7
巳蛇
日期:2014-04-10 08:54:57白羊座
日期:2014-04-22 20:06:262015年亚洲杯之沙特阿拉伯
日期:2015-02-10 14:18:532015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之吉达阿赫利
日期:2015-06-02 11:34:112015亚冠之武里南联
日期:2015-06-24 12:13:082015亚冠之阿尔纳斯尔
日期:2015-08-03 09:08:25
10 [报告]
发表于 2011-02-24 18:09 |只看该作者
7.
  1. #!/usr/bin/env perl

  2. use 5.12.0;

  3. my $secret = int (1+rand 100);

  4. print "Your guess: ";
  5. while (my $guess = <>) {
  6.     chomp $guess;
  7.     exit unless $guess;
  8.     exit if $guess ~~ ['quit', 'exit'];
  9.     exit if $guess == $secret;
  10.     $guess > $secret ? print "Too high. You guess again: " : print "Too low. Your guess again: ";
  11. }
复制代码
吃饭去了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP