The game code itself:
@g=map{$_=sprintf"%04o",$_;$_=~y@0-7@A-H@;$_}0..4095;for($|=1;@g>1;){ +print$f=$g [@g*rand],$";($S=<>)=~/^[0-4]{2}$/?(@g=grep{$d=4-($a=($f^($e=$_))=~y@\ +0@@);$d-= ($c=index$e,$_)<0||(substr($e,$c,1)="")for(split'',$f);$&eq$a.$d}@g):p +rint"\7"}
How to play it:
  1. Think of a string [A-H]{4}
  2. Start: perl game.pl
  3. The computer prints a guess [A-H]{4}
  4. You evaluate its guess by two digits (and <Enter>). The first digit is the number of common letters in good positions, and the 2nd digit is the number of common letters in wrong position. For example, the guess FFGA has value 21 if the string is DFGF.
  5. If the value wasn't 40, go back to step 3.
Enjoy! (But the computer always wins.)

Replies are listed 'Best First'.
Re: a 240-byte game for you
by K_M_McMahon (Hermit) on May 05, 2005 at 04:23 UTC
    I like the game, but unfortunately, it doesn't always win..... I was thinking AAAA
    C:\game.pl DHEC 00 GFGB 00
    it lost, gave up after the second 00 but it did win on several other tries.

    -Kevin
    my $a='62696c6c77667269656e6440676d61696c2e636f6d'; while ($a=~m/(^.{2})/s) {print unpack('A',pack('H*',"$1"));$a=~s/^.{2}//s;}
      Fencepost bug. for($|=1;@g>1;) in the first line should be for($|=1;@g>=1;) or for($|=1;@g>0;).

      Sorry, that change causes an infinite loop. Of course you could always control-C out of it...

      Update: If the player is honest (or at least consistent), for($|=1;$&<40;) works at the expense of an additional character. Or you could combine this condition with one of the struck-out conditions above for a total of 248 or 247 characters.

      Another fix that seems more natural to me involves using one of the struck-out conditions in combination with splice for a total of 250 or 249 characters.

      It seems more natural to format this in four lines, though (take your pick):
      @g=map{$_=sprintf"%04o",$_;$_=~y@0-7@A-H@;$_}0..4095;for($|= 1;@g>0;){print$f=splice(@g,@g*rand,1),$";($S=<>)=~/^[0-4]{2}$ /?(@g=grep{$d=4-($a=($f^($e=$_))=~y@\0@@);$d-=($c=index$e,$_)< 0||(substr($e,$c,1)="")for(split'',$f);$&eq$a.$d}@g):print"\7"}
      or
      @g=map{$_=sprintf"%04o",$_;$_=~y@0-7@A-H@;$_}0..4095;for($|=1;@ g>0;){print$f=splice(@g,@g*rand,1),$";($S=<>)=~/^[0-4]{2}$/?(@ g=grep{$d=4-($a=($f^($e=$_))=~y@\0@@);$d-=($c=index$e,$_)<0|| (substr($e,$c,1)="")for(split'',$f);$&eq$a.$d}@g):print"\7"}
Re: a 240-byte game for you
by polettix (Vicar) on May 05, 2005 at 16:15 UTC
    Hey! This way... I'm the game and the computer's enjoying me! He even tried to halt me after a few run, but luckily he had not enough privileges...

    Flavio (perl -e 'print(scalar(reverse("\nti.xittelop\@oivalf")))')

    Don't fool yourself.