Talk:Passtune
Jump to navigation
Jump to search
turncount
If I recall well, playing passtune doesn't increase turn count, am I right? If so, I suppose it should be mentioned there. --Lukky513 14:19, 4 July 2009 (UTC)
perl solver
Here is something you may find interesting.
#!/usr/bin/env perl
# This code is hereby released into the public domain.
# Use as you wish, at your own risk.
use strict 'vars';
my $colors = 7;
my $positions = 5;
sub randomtune() {
my $ret;
my $i;
for ($i = 0; $i < $positions; $i++) {
$ret .= chr(65 + int(rand() * 7));
}
return $ret;
}
sub score($$) {
my ($true, $guess) = @_;
my $gears = 0;
my $tumblers = 0;
my @true = split //, $true;
my @guess = split //, $guess;
for (my $i = 0; $i < $positions; $i++) {
if ($true[$i] eq $guess[$i]) {
$gears++;
$true[$i] = $guess[$i] = 'X';
}
}
for (my $i = 0; $i < $positions; $i++) {
if ($guess[$i] ne 'X') {
for (my $j = 0; $j < $positions; $j++) {
if ($true[$j] eq $guess[$i]) {
$tumblers++;
$true[$j] = $guess[$i] = 'X';
last;
}
}
}
}
return ($gears, $tumblers);
}
my %possible;
sub initpossible() {
for (my $i = 0; $i < $colors ** $positions; $i++) {
my $possible = "";
my $j = $i;
for (my $k = 0; $k < $positions; $k++) {
$possible .= chr(65 + ($j % $colors));
$j /= $colors;
}
$possible{$possible} = 1;
}
}
sub test() {
initpossible();
my $tru = randomtune();
while (1) {
my @keys = keys(%possible);
my $nkeys = $#keys + 1;
print "$nkeys\n";
my $i = int(rand() * $nkeys);
my $gue = $keys[$i];
print "$tru\n$gue\n";
my ($gea, $tum) = score($tru, $gue);
print "$gea $tum\n";
print "\n";
if ($gea != $positions) {
delete $possible{$gue};
for (my $j = 0; $j < $nkeys; $j++) {
if ($j != $i) {
my ($g, $t) = score($gue, $keys[$j]);
if ($g != $gea || $t != $tum) {
delete $possible{$keys[$j]};
}
}
}
}
else {
last;
}
}
}
sub solver() {
initpossible();
while (1) {
my @keys = keys(%possible);
my $nkeys = $#keys + 1;
print "$nkeys\n";
my $i = int(rand() * $nkeys);
my $gue = $keys[$i];
print "REMAIN: $nkeys\n";
print "GUESS : $gue\n";
my $input = readline(STDIN);
$input =~ s/[\x0a\x0d]//g;
my ($gea, $tum) = split / /, $input;
if ($gea != $positions) {
delete $possible{$gue};
for (my $j = 0; $j < $nkeys; $j++) {
if ($j != $i) {
my ($g, $t) = score($gue, $keys[$j]);
if ($g != $gea || $t != $tum) {
delete $possible{$keys[$j]};
}
}
}
}
else {
last;
}
}
}
#test();
solver();