Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Apr 30th, 2012  |  syntax: None  |  size: 1.62 KB  |  hits: 14  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. use Test;
  2.  
  3. class Node {
  4.     has @.parents;
  5. }
  6.  
  7. sub dump(Node $s) {
  8.     my %color;
  9.     my $index = 0;
  10.     my @result;
  11.  
  12.     sub visit(Node $n) {
  13.         return if %color.exists($n);
  14.         %color{$n} = "being visited";
  15.         for $n.parents.flat -> $p {
  16.             visit($p);
  17.         }
  18.         %color{$n} = ++$index;
  19.         my $parents = $n.parents
  20.                         ?? "(" ~ join(" ", %color{$n.parents.list}.sort) ~ ")"
  21.                         !! "";
  22.         push @result, $index ~ $parents;
  23.     }
  24.  
  25.     visit($s);
  26.     return join " ", @result;
  27. }
  28.  
  29. sub sierp(Int $size, Node $u = Node.new) {
  30.     if $size <= 1 {
  31.         return $u, $u;
  32.     }
  33.  
  34.     my ($lp1, $lp2, $r) = chipped($size, $u);
  35.     my $l = Node.new(:parents($lp1, $lp2));
  36.  
  37.     return $l, $r;
  38. }
  39.  
  40. sub chipped(Int $size, Node $u, $rp1?, $rp2?) {
  41.     if $size <= 2 {
  42.         my $r = defined($rp1) ?? Node.new(:parents($u, $rp1, $rp2))
  43.                               !! Node.new(:parents($u));
  44.         return $u, $r, $r;
  45.     }
  46.  
  47.     my ($Ul, $Ur)          = sierp($size - 1, $u);
  48.     my ($Rlp1, $Rlp2, $Rr) = chipped($size - 1, $Ur);
  49.     my ($Llp1, $Llp2, $Lr) = chipped($size - 1, $Ul, $Rlp1, $Rlp2);
  50.  
  51.     return $Llp1, $Llp2, $Rr;
  52. }
  53.  
  54. {
  55.     my ($s) = sierp(1);
  56.     is dump($s), "1", "sierp triangle of size 1";
  57. }
  58.  
  59. {
  60.     my ($s) = sierp(2);
  61.     is dump($s), "1 2(1) 3(1 2)", "sierp triangle of size 2";
  62. }
  63.  
  64. {
  65.     my ($s) = sierp(3);
  66.     is dump($s), "1 2(1) 3(1 2) 4(2) 5(2 3 4) 6(3 5)",
  67.                  "sierp triangle of size 3";
  68. }
  69.  
  70. {
  71.     my ($s) = sierp(4);
  72.     is dump($s), "1 2(1) 3(1 2) 4(2) 5(2 3 4) 6(3 5) 7(6) 8(6 7) 9(7) 10(7 8 9) 11(8 10)",
  73.                  "sierp triangle of size 4";
  74. }