Solve triangle solitaire puzzle: Difference between revisions
Content added Content deleted
(Added VisualBasic.Net version, brute force method) |
SqrtNegInf (talk | contribs) (Added Perl example) |
||
Line 853: | Line 853: | ||
</pre> |
</pre> |
||
=={{header|Perl}}== |
|||
{{trans|Perl 6}} |
|||
<lang perl>@start = qw< |
|||
0 |
|||
1 1 |
|||
1 1 1 |
|||
1 1 1 1 |
|||
1 1 1 1 1 |
|||
>; |
|||
@moves = ( |
|||
[ 0, 1, 3], [ 0, 2, 5], [ 1, 3, 6], |
|||
[ 1, 4, 8], [ 2, 4, 7], [ 2, 5, 9], |
|||
[ 3, 4, 5], [ 3, 6,10], [ 3, 7,12], |
|||
[ 4, 7,11], [ 4, 8,13], [ 5, 8,12], |
|||
[ 5, 9,14], [ 6, 7, 8], [ 7, 8, 9], |
|||
[10,11,12], [11,12,13], [12,13,14] |
|||
); |
|||
$format .= (" " x (5-$_)) . ("%d " x $_) . "\n" for 1..5; |
|||
sub solve { |
|||
my ($move, $turns, @board) = @_; |
|||
$turns = 1 unless $turns; |
|||
return "\nSolved" if $turns + 1 == @board; |
|||
return undef if $board[$$move[1]] == 0; |
|||
my $valid = do { |
|||
if ($board[$$move[0]] == 0) { |
|||
return undef if $board[$$move[2]] == 0; |
|||
"\nmove $$move[2] to $$move[0]\n"; |
|||
} else { |
|||
return undef if $board[$$move[2]] == 1; |
|||
"\nmove $$move[0] to $$move[2]\n"; |
|||
} |
|||
}; |
|||
my $new_result; |
|||
my @new_layout = @board; |
|||
@new_layout[$_] = 1 - @new_layout[$_] for @$move; |
|||
for $this_move (@moves) { |
|||
$new_result = solve(\@$this_move, $turns + 1, @new_layout); |
|||
last if $new_result |
|||
} |
|||
$new_result ? "$valid\n" . sprintf($format, @new_layout) . $new_result : $new_result} |
|||
$result = "Starting with\n\n" . sprintf($format, @start), "\n"; |
|||
for $this_move (@moves) { |
|||
$result .= solve(\@$this_move, 1, @start); |
|||
last if $result |
|||
} |
|||
print $result ? $result : "No solution found"; |
|||
</lang> |
|||
{{out}} |
|||
<pre style="height:60ex;overflow:scroll;">Starting with |
|||
0 |
|||
1 1 |
|||
1 1 1 |
|||
1 1 1 1 |
|||
1 1 1 1 1 |
|||
move 3 to 0 |
|||
1 |
|||
0 1 |
|||
0 1 1 |
|||
1 1 1 1 |
|||
1 1 1 1 1 |
|||
move 8 to 1 |
|||
1 |
|||
1 1 |
|||
0 0 1 |
|||
1 1 0 1 |
|||
1 1 1 1 1 |
|||
move 10 to 3 |
|||
1 |
|||
1 1 |
|||
1 0 1 |
|||
0 1 0 1 |
|||
0 1 1 1 1 |
|||
move 1 to 6 |
|||
1 |
|||
0 1 |
|||
0 0 1 |
|||
1 1 0 1 |
|||
0 1 1 1 1 |
|||
move 11 to 4 |
|||
1 |
|||
0 1 |
|||
0 1 1 |
|||
1 0 0 1 |
|||
0 0 1 1 1 |
|||
move 2 to 7 |
|||
1 |
|||
0 0 |
|||
0 0 1 |
|||
1 1 0 1 |
|||
0 0 1 1 1 |
|||
move 9 to 2 |
|||
1 |
|||
0 1 |
|||
0 0 0 |
|||
1 1 0 0 |
|||
0 0 1 1 1 |
|||
move 0 to 5 |
|||
0 |
|||
0 0 |
|||
0 0 1 |
|||
1 1 0 0 |
|||
0 0 1 1 1 |
|||
move 6 to 8 |
|||
0 |
|||
0 0 |
|||
0 0 1 |
|||
0 0 1 0 |
|||
0 0 1 1 1 |
|||
move 13 to 11 |
|||
0 |
|||
0 0 |
|||
0 0 1 |
|||
0 0 1 0 |
|||
0 1 0 0 1 |
|||
move 5 to 12 |
|||
0 |
|||
0 0 |
|||
0 0 0 |
|||
0 0 0 0 |
|||
0 1 1 0 1 |
|||
move 11 to 13 |
|||
0 |
|||
0 0 |
|||
0 0 0 |
|||
0 0 0 0 |
|||
0 0 0 1 1 |
|||
move 14 to 12 |
|||
0 |
|||
0 0 |
|||
0 0 0 |
|||
0 0 0 0 |
|||
0 0 1 0 0 |
|||
Solved</pre> |
|||
=={{header|Perl 6}}== |
=={{header|Perl 6}}== |
||
{{works with|Rakudo|2017.05}} |
{{works with|Rakudo|2017.05}} |