Created
January 26, 2018 15:30
-
-
Save niklasf/424f3ae95fbc94e46070e57c5f5c77cd to your computer and use it in GitHub Desktop.
Revisions
-
niklasf created this gist
Jan 26, 2018 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,99 @@ import sys import chess.syzygy import itertools PCHR = chess.syzygy.PCHR NORMAL = set(chess.syzygy.filenames()) def swap(egname): w, b = egname.split("v") return b + "v" + w def normalize(egname): if egname in NORMAL: return egname else: return swap(egname) def _ch(counts): return "".join(ch * counts.get(ch, 0) for ch in PCHR) def _counts(ch): return {p: ch.count(p) for p in PCHR if ch.count(p)} def _promotion_deps(egname): w, b = egname.split("v") wc, bc = _counts(w), _counts(b) if wc.get("P", 0): wc["P"] -= 1 for promotion in PCHR: if promotion != "P" and promotion != "K": wc[promotion] = wc.get(promotion, 0) + 1 subeg = _ch(wc) + "v" + b yield normalize(subeg) yield from _promotion_deps(subeg) wc[promotion] -= 1 wc["P"] += 1 if bc.get("P", 0): bc["P"] -= 1 for promotion in PCHR: if promotion != "P" and promotion != "K": bc[promotion] = bc.get(promotion, 0) + 1 subeg = w + "v" + _ch(bc) yield normalize(subeg) yield from _promotion_deps(subeg) bc[promotion] -= 1 bc["P"] += 1 def _deps(egname): w, b = egname.split("v") wc, bc = _counts(w), _counts(b) for p in PCHR: if p != "K" and p in wc: wc[p] -= 1 yield normalize(_ch(wc) + "v" + b) wc[p] += 1 def deps(egname): closed = set() closed.add("KvK") for eg in itertools.chain(_deps(egname), _deps(swap(egname)), _promotion_deps(egname)): if not eg in closed: closed.add(eg) yield eg def fname(egname): return "%s.dtz" % (egname, ) def main(egnames): print("TBGEN = ../tbgen -s -t 6") print("TBGENP = ../tbgenp -s -t 6") print() closed = set() closed.add("KvK") open_list = list(egnames) while open_list: egname = normalize(open_list.pop(0)) if not egname in closed: closed.add(egname) dep_list = list(deps(egname)) if dep_list: print("%s: %s" % (fname(egname), " ".join(fname(eg) for eg in dep_list))) else: print(fname(egname)) if "P" in egname: print("\t$(TBGENP) %s" % (egname, )) else: print("\t$(TBGEN) %s" % (egname, )) for dep in dep_list: open_list.append(dep) if __name__ == "__main__": main(sys.argv[1:])