我正在做一个处理国际象棋游戏的项目。在对数据进行一些处理后,我需要获取特定位置的 FEN( https://en.wikipedia.org/wiki/Forsyth%E2%80%93Edwards_Notation )符号。我已经为每个 FEN 编码编写了代码,但是我很难对代表未占用的连续方块数的字符进行编码。
以以下 FEN 代码为例:
"rnbq1rk1/pppp1ppp/1b11pn11/11111111/11PP1111/11111NP1/PP11PPBP/RNBQ1RK1 w KQkq c6 0 2"
每个 1 代表棋盘内的一个空方格。因此,例如:11111111
告诉我们棋盘内的这一行没有被棋子占据。
问题是,使用 FEN 作为输入来绘制棋盘的 R 包不喜欢这种表示法,他们想要更活跃的原始表示法,其中所有1
s 都由一个字符表示:所有这些连续1
s 的总和。对于前面的示例,这将是:
"rnbq1rk1/pppp1ppp/1b2pn2/8/2PP4/5NP1/PP2PPBP/RNBQ1RK1 w KQkq c6 0 2"
请注意,例如,11111111
序列被替换为8
,所有连续1
s的总和
我已经尝试使用mapply
withgsub
来完成替换,但它一次迭代一个应用模式替换对的字符串。结果如下:
代码:
pattern <- c("11111111","1111111","111111","111111","1111","111","11")
replacement <- c("8","7","6","5","4","3","2")
FENCodeToBeChanged <- "rnbq1rk1/pppp1ppp/1b11pn11/11111111/11PP1111/11111NP1/PP11PPBP/RNBQ1RK1 w KQkq c6 0 2"
mapply(gsub,pattern,replacement,FENCodeToBeChanged)
结果:
11111111
"rnbq1rk1/pppp1ppp/1b11pn11/8/11PP1111/11111NP1/PP11PPBP/RNBQ1RK1 w KQkq c6 0 2"
1111111
"rnbq1rk1/pppp1ppp/1b11pn11/71/11PP1111/11111NP1/PP11PPBP/RNBQ1RK1 w KQkq c6 0 2"
111111
"rnbq1rk1/pppp1ppp/1b11pn11/611/11PP1111/11111NP1/PP11PPBP/RNBQ1RK1 w KQkq c6 0 2"
111111
"rnbq1rk1/pppp1ppp/1b11pn11/511/11PP1111/11111NP1/PP11PPBP/RNBQ1RK1 w KQkq c6 0 2"
1111
"rnbq1rk1/pppp1ppp/1b11pn11/44/11PP4/41NP1/PP11PPBP/RNBQ1RK1 w KQkq c6 0 2"
111
"rnbq1rk1/pppp1ppp/1b11pn11/3311/11PP31/311NP1/PP11PPBP/RNBQ1RK1 w KQkq c6 0 2"
11
"rnbq1rk1/pppp1ppp/1b2pn2/2222/2PP22/221NP1/PP2PPBP/RNBQ1RK1 w KQkq c6 0 2"
正如您所看到的,它一次进行一个替换,并且对于下一个模式替换对,它从原始字符串开始,它不会按照我在模式中指定的顺序累积它们 - 替换向量。
我已经尝试过这里和这里描述的策略,但它们也没有奏效。正如在最后一个链接中提到的那样,我试图不惜一切代价避免循环 gsubs 来完成工作,因为它似乎效率很低。
关于如何进行的任何想法?
谢谢!