module shogi.constants; enum Teban { SENTE = 0, GOTE = -1 }; const string[14] KOMA = [ "FU", "KY", "KE", "GI", "KA", "HI", "KI", "OU", "pFU", "pKY", "pKE", "pGI", "pKA", "pHI" ]; const string[10] KOMA_BB = [ "FU", "KY", "KE", "GI", "KA", "HI", "KI", "OU", "pKA", "pHI" ]; mixin({ import std.format, std.algorithm, std.array; string s1 = "enum komaType{none=0,"; string s2 = "enum komaTypeWP{none=0,"; foreach (i, k; KOMA.dup.map !(a => [ "B" ~a, "W" ~a ]).join) { s1 ~= format("%s=%d,", k, i + 4); s2 ~= format("%s=cast(int)komaType.%s<<1,", k, k); if (i < 12) s2 ~= format("%sp=cast(int)%s+1,", k, k); } return s1 ~"};" ~s2 ~"};"; }()); string generateReplace(string qs, string target, in string[] list) { import std.algorithm, std..string; return list.map !(a => qs.replace(target, a)).join; } string generateReplace(string qs, string target1, string target2, in string[2] list) { import std.algorithm, std..string, std.range; return list.array.permutations.map !(a => qs.replace(target1, a[0]).replace(target2, a[1])).join; } unittest { assert("TestXX".generateReplace("XX", [ "aaa", "bbb", "ccc" ]) == "TestaaaTestbbbTestccc"); assert("TestYYZZ".generateReplace("YY", "ZZ", [ "B", "W" ]) == "TestBWTestWB"); }