背景:在微博上见到一道简单的数学题 ,最近一直在学Perl编程,用Perl实现之,在代码中应用了几个高级技巧,加深了对Perl数组的理解。
问题: 一个将字符串“ ABCDEFG ”变成字符串“ CDABFGE ”的置换定义为一次运算, 则从字符 “一行白鹭上青天”开始, 经过 2011 次运算后得到的字符串为
Perl代码:
######################################## Desc: 用Perl解一道高中数学题(函数) ## Author: thinkhy ## Date: 05/26/2012 Sat ## Reference:#######################################use strict ;use utf8 ;
my $str = "一行白鹭上青天" ;my @fun = ( 2 , 3 , 0 , 1 , 5 , 6 , 4 );my @tran = ( split "" , $str )[ @fun ];
my @tranArray ;push @tranArray , $str ;
while ( $str ne ( join "" , @tran )){push @tranArray , ( join "" , @tran );@tran = @tran [ @fun ];}binmode ( STDOUT , ':encoding(gb2312)' );print join "\n" , @tranArray ;my $cnt = 2011 % @ tranArray ;print "\nFinal: " . $tranArray [ $cnt ] . "\n" ;
程序输出如下:
一行白鹭上青天
白鹭一行青天上
一行白鹭天上青
白鹭一行上青天
一行白鹭青天上
白鹭一行天上青
Final: 白鹭一行青天上
Reference:
1. 善科题库 http://www.mysanco.com/tiku/index.php?class=index&action=special_subject&tid=13997&rid=10
2. 《Perl高效编程》 http://book.douban.com/subject/6146346/