Your skill will accomplishwhat the force of many cannot PerlMonks

### Re: Re: Parsing Chess Algebra Notation

by cyocum (Curate)
 on May 07, 2004 at 14:05 UTC ( #351458=note: print w/replies, xml ) Need Help??

in reply to Re: Parsing Chess Algebra Notation
in thread Parsing Chess Algebra Notation

I took your advice and tried it backwards. As you will notice, I did this in a step by step fashion. I am sure that there are much more effient ways to do this. Also, it does not yet support the edge cases that you are talking about (that includes promotion). I just wanted to layout a bit more code for general commments and improvments. Also, thanks for all the help. I really appreciate it!

```use strict;
use warnings;

my \$move = "Qe4++";

#reverse as per dragonchild's suggestion
my @parsed = reverse split //, \$move;

print join('', @parsed) . "\n";

my \$check;
my \$row;
my \$col;
my \$piece;

#convert the letters into appropriate numbers
#there is probably a faster way to to this
my %col_convert = (a => 0,
b => 1,
c => 2,
d => 3,
e => 4,
f => 5,
g => 6,
h => 7);

foreach my \$elem (@parsed) {
#check for, well, check
if(\$elem eq '+') {
#start the process to see if this is a checkmate
my \$nextElem = shift @parsed;
print "nextElem \$nextElem" . "\n";

#if it is then print
if(\$nextElem eq '+') {
print "Checkmate\n";
next;
} else {
#otherwise put it back on the stack for the next
#iteration
unshift @parsed, \$nextElem;
}

#then print check in this instance
print "Check\n";
}elsif(\$elem =~ m/[1-8]/) {
\$row = \$elem;
print "Row: \$row\n";
}elsif(\$elem =~ /[a-h]/) {
#convert to number
\$col = \$col_convert{\$elem};
print "Col: \$col\n";
}elsif(\$elem =~ m/x/) {
#this is a capture to that square
print "Capture on \$col \$row\n";
}elsif(\$elem =~ /[KQRNB]/) {
\$piece = \$elem;
print "Piece to move is \$piece\n";
} else {
die "not a valid move\n";
}
}

Replies are listed 'Best First'.
Re: Re: Re: Parsing Chess Algebra Notation
by dragonchild (Archbishop) on May 07, 2004 at 15:22 UTC
Why are you making it so complicated for yourself? All you want to do is build a string that corresponds to the move. This means that you're attempting to build a state representation by parsing another state representation, one character at a time. The following may or may not be complete, but it's a good start. (I didn't do castling, leaving that as an exercise for the reader. I'd probably special-case it.)

And the test code ...

Create A New User
Node Status?
node history
Node Type: note [id://351458]
help
Chatterbox?
 [Corion]: Also, of course, his biggest hit, Smooth Criminal :-D

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (8)
As of 2017-08-18 14:39 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
Who is your favorite scientist and why?

Results (303 votes). Check out past polls.

Notices?