Solve triangle solitaire puzzle: Difference between revisions

Added Perl example
(Added VisualBasic.Net version, brute force method)
(Added Perl example)
Line 853:
</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}}==
{{works with|Rakudo|2017.05}}
2,392

edits