Skip to content

Instantly share code, notes, and snippets.

@ddugovic
Last active June 13, 2017 16:43
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ddugovic/e1381cfe60843f1aab15f880e6ae4eea to your computer and use it in GitHub Desktop.
Save ddugovic/e1381cfe60843f1aab15f880e6ae4eea to your computer and use it in GitHub Desktop.
Encode white pawns and black pawns into bitmasks
# Program to encode pawns as bitmasks from a FEN
# Usage: ruby pawn_encoder.rb "rn3rk1/4bpp1/pq2bn1p/2pp4/B6B/2N1PN2/PP3PPP/2RQ1RK1"
def encode(fen)
board = fen.gsub("8"," 7").gsub("7"," 6").gsub("6"," 5").gsub("5"," 4").gsub("4"," 3").gsub("3"," 2").gsub("2"," 1").gsub("1"," ")
wpawnsA = board.gsub(/[^P\/]/,"0").gsub(/P/,"1").split("/")
bpawnsA = board.gsub(/[^p\/]/,"0").gsub(/p/,"1").split("/")
wpawnsB = wpawnsA.rotate
bpawnsB = bpawnsA.rotate(-1)
wpawns1 = wpawnsA.join.split(//).map {|c| c.ord - '0'.ord}
bpawns1 = bpawnsA.join.split(//).map {|c| c.ord - '0'.ord}
wpawns2 = wpawnsB.join.split(//).map {|c| c.ord - '0'.ord}
bpawns2 = bpawnsB.join.split(//).map {|c| c.ord - '0'.ord}
wpawns = wpawns1.zip(wpawns2).map {|i, j| (i+j+1)/2}
bpawns = bpawns1.zip(bpawns2).map {|i, j| (i+j+1)/2}
[wpawns.map {|i| i.to_s}.join.slice(24, 32), bpawns.map {|i| i.to_s}.join.slice(8, 32)].join
end
puts encode(ARGV[0])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment