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

Untitled

By: a guest on May 9th, 2012  |  syntax: None  |  size: 2.08 KB  |  hits: 10  |  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.  
  2. #! /usr/bin/perl
  3. use 5.010;
  4. use strict;
  5. use warnings;
  6.  
  7. my $SIZE = 8;
  8.  
  9. my %pieces = (
  10.     'F1' => <<"EOP",
  11. .XX
  12. XX.
  13. .X.
  14. EOP
  15.  
  16.     'F2' => <<"EOP",
  17. XX.
  18. .XX
  19. .X.
  20. EOP
  21.  
  22.     'I' => <<"EOP",
  23. X
  24. X
  25. X
  26. X
  27. X
  28. EOP
  29.  
  30.     'L1' => <<"EOP",
  31. X.
  32. X.
  33. X.
  34. XX
  35. EOP
  36.  
  37.     'L2' => <<"EOP",
  38. .X
  39. .X
  40. .X
  41. XX
  42. EOP
  43.  
  44.     'P1' => <<"EOP",
  45. XX
  46. XX
  47. X.
  48. EOP
  49.  
  50.     'P2' => <<"EOP",
  51. XX
  52. XX
  53. .X
  54. EOP
  55.  
  56.     'N1' => <<"EOP",
  57. X..
  58. XXX
  59. ..X
  60. EOP
  61.  
  62.     'N2' => <<"EOP",
  63. ..X
  64. XXX
  65. X..
  66. EOP
  67.  
  68.     'T' => <<"EOP",
  69. XXX
  70. .X.
  71. .X.
  72. EOP
  73.  
  74.     'U' => <<"EOP",
  75. X.X
  76. XXX
  77. EOP
  78.  
  79.     'V' => <<"EOP",
  80. X..
  81. X..
  82. XXX
  83. EOP
  84.  
  85.     'W' => <<"EOP",
  86. X..
  87. XX.
  88. .XX
  89. EOP
  90.  
  91.     'X' => <<"EOP",
  92. .X.
  93. XXX
  94. .X.
  95. EOP
  96.  
  97.     'Y1' => <<"EOP",
  98. .X
  99. XX
  100. .X
  101. .X
  102. EOP
  103.  
  104.     'Y2' => <<"EOP",
  105. X.
  106. XX
  107. X.
  108. X.
  109. EOP
  110.  
  111.     'Z1' => <<"EOP",
  112. ..XX
  113. XXX.
  114. EOP
  115.  
  116.     'Z2' => <<"EOP",
  117. XX..
  118. .XXX
  119. EOP
  120. );
  121.  
  122. sub fits {
  123.     my ($piece, $sr, $sc) = @_;
  124.     my @rows = split /\n/, $piece;
  125.     my $width = length($rows[0]);
  126.     return if $sr + @rows - 1 > $SIZE - 1;
  127.     return if $sc + $width - 1 > $SIZE - 1;
  128.     for my $r (0..@rows-1) {
  129.         my $row = $rows[$r];
  130.         for my $c (0..$width-1) {
  131.             if (substr($row, $c, 1) eq "X") {
  132.                 return if (3 == $sr + $r || 4 == $sr + $r)
  133.                        && (3 == $sc + $c || 4 == $sc + $c);
  134.             }
  135.         }
  136.     }
  137.     return 1;
  138. }
  139.  
  140. sub rotate {
  141.     my ($piece, $rotations) = @_;
  142.     for (1..$rotations) {
  143.         my @rows = split /\n/, $piece;
  144.         my $width = length($rows[0]);
  145.         my @new_piece;
  146.         for my $c (reverse 0..$width-1) {
  147.             push @new_piece, join "", map { substr($_, $c, 1) } @rows;
  148.         }
  149.         $piece = join "\n", @new_piece;
  150.     }
  151.     return $piece;
  152. }
  153.  
  154. my $rows;
  155. for my $name (keys %pieces) {
  156.     my $piece = $pieces{$name};
  157.     chomp $piece;
  158.     my $rotations = 4;
  159.     $rotations = 2 if $name eq "I" || $name eq "N1" || $name eq "N2";
  160.     $rotations = 1 if $name eq "X";
  161.     for my $a (0..$rotations-1) {
  162.         my $rotated_piece = rotate($piece, $a);
  163.         for my $r (0..$SIZE-1) {
  164.             for my $c (0..$SIZE-1) {
  165.                 if (fits($rotated_piece, $r, $c)) {
  166.                     $rows++;
  167.                 }
  168.             }
  169.         }
  170.     }
  171. }
  172. say $rows;