Convert a pawn promotion from algebraic to ICCF numeric notation

2

Input

A single string, which contains no whitespace, as a command-line argument.

Output

If the string is not a valid algebraic notation pawn promotion, produce no output and exit. If the string is a valid pawn promotion, convert it to ICCF numeric notation and print the result, followed by a newline.

A valid algebraic notation pawn promotion consists of:

  • A letter from a to h indicating the pawn's departure column (known as a "file" in chess);
  • Optionally, "x" followed by the file of the pawn's arrival square if it has captured a piece in promoting;
  • "1" or "8" depending on which side promoted; and
  • "=" followed by one of "Q", "R", "B", "N" to indicate the chosen piece;
  • Optionally, "+" to indicate the move was a check or "#" to indicate the move was a checkmate.

An valid ICCF numeric notation pawn promotion consists of:

  • Two digits indicating the coordinates of the square from which the pawn departed (the files are numbered and not lettered as in algebraic notation);
  • One digit indicating the file on which the pawn arrived, in case it has captured a piece while promoting (this does not officially comply with the standard, but I prefer keeping all moves as 4 digits for simplicity); and
  • One digit to indicate the chosen piece: 1 for queen, 2 for rook, 3 for bishop, 4 for knight.

Examples

e1=Q   => 5251
cxd8=B => 3743
axh8=R => no output (a-pawns cannot capture on h-file)
h8=N+  => 8784

EMBLEM

Posted 2016-03-15T02:56:23.433

Reputation: 2 179

Could we have some test cases? – Doorknob – 2016-03-15T02:56:45.500

@Doorknob Added. – EMBLEM – 2016-03-15T03:00:07.137

Can we exit with an error if the input is invalid? Does # for checkmate need to be supported? – Doorknob – 2016-03-15T03:02:15.627

@Doorknob No, you must produce no output and exit without errors. # does need to be supported. – EMBLEM – 2016-03-15T03:03:08.340

Why the input restriction? – CalculatorFeline – 2017-06-21T03:23:48.243

Answers

1

JavaScript (ES6), 166 bytes

s=>(g=n=>parseInt(m[n][0],19)-9,m=s.match(/^([a-h]x)?([a-h][18]=[QRBN])[+#]?$/))?m[1]&&g(2)+~g(0)&&g(0)+~g(2)?'':''+g(0)+(m[2][1]-1|2)+g(2)+" QRBN".search(m[2][3]):''

The validation makes this horribly long. Without validation, it's only 108 bytes:

s=>s.replace(/(.x)?(..=.).*/,([a],_,[c,d,,f])=>g(a)+(d-1|2)+g(c)+" QRBN".search(f),g=f=>parseInt(f,19)-9+'')

Neil

Posted 2016-03-15T02:56:23.433

Reputation: 95 035