- 描述:
- - 这个任务是Arthur C.Clarke[http://en.wikipedia.org/wiki/The_Nine_Billion_Names_of_God#Plot_summary]短篇故事的变种(解决者应该意识到完成这个任务的后果)。详细地,为了明确"名字"的意思:
- 整数1有1个名字: "1"
- 整数2有2个名字: "1+1", "2"
- 整数3有3个名字: "1+1+1", "2+1", "3"
- 整数4有5个名字: "1+1+1+1", "2+1+1", "2+2", "3+1", "4"
- 整数5有7个名字: "1+1+1+1+1", "2+1+1+1", "2+2+1", "3+1+1", "3+2", "4+1", "5"
- 任务:
- - 任务就是打印前25行的整数三角形,它开始于:
- 1
- 1 1
- 1 1 1
- 1 2 1 1
- 1 2 2 1 1
- 1 3 3 2 1 1
- 第n行对应整数n,m行中的每一列C从左到右依次对应以C开始的名字的个数
- 函数G(n)应当返回第n行的和,作为展示打印G(23), G(123), G(1234)和G(12345)。注意P(n)是一个整数拆分函数?[http://mathworld.wolfram.com/PartitionFunctionP.html],
- 展示打印P(23), P(123), P(1234)和P(12345),证明和G(n)相等。
- #!/usr/bin/env perl6
- class Triangle::Number {
- has Int $!n;
- has Int @!sum;
- has Array[Int] @!rows;
- method new(Int :$n, Bool :$init = True) {
- return self.bless(n => $n)!initialize if $init;
- return self.bless(n => $n);
- }
- submethod BUILD (:$!n = 0) {}
- method Str() returns Str {
- "Triangle::Number.new(n => " ~ $!n.perl ~ ", rows => " ~ @!rows.perl ~ ')';
- }
- method show(&print-func = &print) {
- my Int $count = $!n;
- my Int $wide = @!rows[* - 1].max.log10.ceiling;
- my Str $wfmt = '%' ~ $wide ~ 's';
- my Str $space = sprintf($wfmt, ' ');
- my Str $nfmt = '%s%' ~ $wide ~ 'd';
- my Str $number;
- for 1 .. $count -> $i {
- &print-func($space) for ^($count - $i);
- $number = '';
- for 1 .. $i -> $j {
- $number ~= sprintf($nfmt, $space, self!value($i, $j));
- }
- &print-func($number ~ "\\n");
- }
- }
- method sum(Int $n = $!n) {
- return @!sum[$n] if @!sum[$n];
- for 1 .. $n -> $col {
- @!sum[$n] += self!value($n, $col);
- }
- return @!sum[$n];
- }
- method !initialize() {
- @!rows.push: Array[Int].new(self!value(3,1) + self!value(2,2));
- for 1 .. $!n - 1 -> $i {
- @!rows.push: Array[Int].new(); # add a new line
- # $i, $j -> row,col($i + 4, $j + 2)
- # $half = ($i + 4) / 2 + 1
- # $baser[ow] = $i + 4 - 1
- # $offr[ow] = $i + 4
- my ($base, $off, $half) = ($i + 3, $i + 2, ($i +> 1) + 1);
- for ^$half -> $j {
- @!rows[$i].push: self!value($base, $j + 1) + self!value($off - $j, $j + 2);
- }
- }
- self;
- }
- # start from 1, 1
- method !value(Int $n, Int $k) returns Int {
- return 0 if $k > $n;
- return 1 if $k == 1 || $n - $k < 2;
- return @!rows[($n - $k - 2) +< 1][* - 1] if $k > ($n +> 1);
- # start from 4th line
- return @!rows[$n - 4][$k - 2];
- }
- }
- my $triangle = Triangle::Number.new(n => 25);
- $triangle.show;
- say $triangle.sum;
- #该片段来自于http://www.codesnippet.cn/detail/2801201614505.html
来源: http://www.codesnippet.cn/detail/2801201614505.html