开篇词,贴一个刚写的24点牌程序作为实验
2012-12-25 11:08
302 查看
前几天突然决定在CSDN开一个博客。以前在其它地方也开过,可都无疾而终。最近大半年在CSDN看过很多朋友写的技术帖,深羡慕之,遂也决定自己开个一亩三分地。一来,将自己学到的一些东西做一个整理,二来,也可与大家分享。
前几天决定认真学习一下perl语言。以前也看过几页书,但一直都没有很严肃地去学,多是三天打鱼,两天晒网。人说要想学好一门语言,必须亲手写代码,而且要多写。我深以为然,所以这次用perl写了个算24点牌的程序。程序很简单,没什么可多说的,也没什么技术可言,纯属熟悉语言。另外,一个更重要的目的是来试试这个新博客的排版。
代码如下:
前几天决定认真学习一下perl语言。以前也看过几页书,但一直都没有很严肃地去学,多是三天打鱼,两天晒网。人说要想学好一门语言,必须亲手写代码,而且要多写。我深以为然,所以这次用perl写了个算24点牌的程序。程序很简单,没什么可多说的,也没什么技术可言,纯属熟悉语言。另外,一个更重要的目的是来试试这个新博客的排版。
代码如下:
#!/usr/bin/perl -w use strict; use warnings; sub build_new_array { (my $i, my $j, my @nums) = @_; my @new_array; for (my $k = 0; $k < @nums; $k ++) { if ($k != $i && $k != $j) { push @new_array, $nums[$k]; } } return @new_array; } # do_cacl(n, numbers) sub do_calc { (my $n, my @numbers) = @_; my $err = 0.00001; if (scalar @numbers == 1) { if ($n < $numbers[0]{"num"} - $err || $n > $numbers[0]{"num"} + $err) { return undef; } else { return $numbers[0]{"expr"}; } } # if more than one numbers, try for (my $i = 0; $i < @numbers - 1; $i ++) { for (my $j = $i + 1; $j < @numbers; $j ++) { my $a = $numbers[$i]{"num"}; my $b = $numbers[$j]{"num"}; my $expra = $numbers[$i]{"expr"}; my $exprb = $numbers[$j]{"expr"}; my @new_num = build_new_array($i, $j, @numbers); # try plus push @new_num, { "num" => $a + $b, "expr" => "$expra $exprb +" }; my $result = do_calc($n, @new_num); return $result if defined $result; pop @new_num; # try minus if ($a > $b) { push @new_num, { "num" => $a - $b, "expr" => "$expra $exprb -" }; } else { push @new_num, { "num" => $b - $a, "expr" => "$exprb $expra -" }; } $result = do_calc($n, @new_num); return $result if defined $result; pop @new_num; # try multiplication push @new_num, { "num" => $a * $b, "expr" => "$expra $exprb *" }; $result = do_calc($n, @new_num); return $result if defined $result; pop @new_num; # try dividend if ($b > $err) { push @new_num, { "num" => $a / $b, "expr" => "$expra $exprb /" }; $result = do_calc($n, @new_num); return $result if defined $result; pop @new_num; } if ($a > $err) { push @new_num, { "num" => $b / $a, "expr" => "$exprb $expra /" }; $result = do_calc($n, @new_num); return $result if defined $result; } } } return undef; } sub convert { my $postfix = shift; my @tokens = split /\s+/, $postfix; my @expr_stack = (); my @priority_stack = (); # priority of ADD and SUB is 1 and priority of MUL and DIV is 2 foreach my $token (@tokens) { # if the token is a operator if ($token =~ /[+\-*\/]/) { my $rhs_expr = pop @expr_stack; my $rhs_pri = pop @priority_stack; my $lhs_expr = pop @expr_stack; my $lhs_pri = pop @priority_stack; my $expr; my $pri; if ($token =~ /[*\/]/) { if ($lhs_pri == 1) { $lhs_expr = "($lhs_expr)"; } if ($rhs_pri == 1 || ($rhs_pri == 2 && $token eq "/")) { $rhs_expr = "($rhs_expr)"; } $pri = 2; } else { if ($rhs_pri == 1 && $token eq "-") { $rhs_expr = "($rhs_expr)"; } $pri = 1; } $expr = "$lhs_expr $token $rhs_expr"; push @expr_stack, $expr; push @priority_stack, $pri; } else { push @expr_stack, $token; push @priority_stack, 0; } } return $expr_stack[0]; } while (defined(my $n = <STDIN>)) { chomp $n; $n =~ s/^\s+//; $n =~ s/\s+$//; my @n = split /\s+/, $n; next if scalar @n == 0; my @numbers; foreach my $one (@n) { push @numbers, { "num" => $one, "expr" => "$one" }; } my $seq = do_calc(24, @numbers); if (defined $seq) { print convert($seq), "\n"; } else { print "No answer!\n"; } }
相关文章推荐
- struts2入门-第一个例子==》第一个struts2实例——HelloWorld==》Struts2.0搭建和简单实例==>写一个Steuts2的经典入门案例,做了一个登陆程序作为入门例子
- 完成一个学生管理程序,使用学号作为键添加5个学生对象,并可以将全部信息保存在文件中,可以实现对学生信息的学号查找,输出全部学生信息的功能。
- 帖一个根据服务器时间作为起始,显示时钟的小程序
- [Embedded] [FL2440] ADS实验三:LED跑马灯:增加了一个程序启动声音 (运行程序时beep一声)
- 作为一个程序猿猴,我也来开通博客了!
- 使用Olami SDK实现一个语音输入数字进行24点计算的iOS程序
- 一个连接数据库完整程序可以作为模板(从csdn中获得)
- Linux内核如何装载和启动一个可执行程序-----实验7
- 编译原理实验一:为PL/0语言编写一个词法分析程序
- 完成一个学生管理程序,使用学号作为键添加5个学生对象,并可以将全部信息保存在文件中,可以实现对学生信息的学号查找,输出全部学生信息的功能。
- C++实验——参赛歌手计算平均分问题:去掉一个最高分,去掉一个最低分,将剩下分数的平均值作为选手的最后成绩。这里假设共有10位评委,都是按照百分制打分。
- 实验报告一:写一个hello world小程序
- 练习1-20:请编写程序detab,将输入中的制表符替换成适当数目的空格,适空格充满到下一个制表符中止的地方。假设制表符终止位的位置是固定的,比如每隔n列就会出现一个制表符终止位。n应该作为变量还是符号常量呢?
- 实验6 数组1 设计一个程序,利用二维数组输出3x2矩阵
- 完成一个学生管理程序,使用学号作为键添加5个学生对象,并可以将全部信息保存在文件中,可以实现对学生信息的学号查找,输出全部学生信息的功能。
- LED实验&&I/O口实验--将 P0 作为输出口,连接 8 个 LED,编写程序,使 LED 循环点亮。(LED1 亮,其余灭->ED2 亮,其余灭……,如此循环 5 次后,进行全灭-全亮
- 实验一:写一个hello world小程序实验要求
- 以前写的一个sniffer网络监听程序(作为备忘)
- 一个连接数据库完整程序可以作为模板(从csdn中获得)
- Rhino 是一个完全使用Java语言编写的开源JavaScript实现。Rhino通常用于在Java程序中,为最终用户提供脚本化能力。它被作为J2SE 6上的默认Java脚本化引擎。