Skip to content

Instantly share code, notes, and snippets.

@simmsb
Last active November 14, 2016 11:56
Show Gist options
  • Save simmsb/565c69cea737de586f44899dc388a9b0 to your computer and use it in GitHub Desktop.
Save simmsb/565c69cea737de586f44899dc388a9b0 to your computer and use it in GitHub Desktop.
def generate_fen(board :list=list(), turn :str='W'):
def format_rank(rank :list):
return map(lambda x: x[1].__getattribute__({"B":"lower", "W":"upper"}[x[0]])() if str(x).isalpha() else None, rank)
def collate_rank(rank :list):
string = [[k, list(g)] for k,g in groupby(format_rank(rank[1:]))]
return str().join(map(lambda x: str(len(x[1])) if not x[0] else str().join(x[1]), string))
return "{}\{}".format('\\'.join(list(map(collate_rank, board[1:]))), turn)
def decode_fen(fenStr :str=""):
def unpack_rank(rank :str):
def format(x):
return " "*int(x.group())
return map(lambda x: x*2 if not x.isalpha() else x, re.sub(re.compile('\d'), format , rank))
def format_rank(rank :str):
return list(map(lambda x: "{}{}".format("b" if x.islower() else 'W', x).upper() if x.isalpha() else x, rank))
def fix_list(array :list):
return [ [" " for i in range(BOARDDIMENSION+1)], *list(map(lambda x: [" "] + x, array))]
validate = re.compile(r"([\w\d]+\\)+[WB]")
if not re.match(validate, fenStr):
return None, None
# verify that the fen string is complete
chain_funcs = lambda x: format_rank(unpack_rank(x))
fen_list = fenStr.split("\\")
return fix_list(map(chain_funcs, fen_list[:-1])), fen_list[-1]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment