简体   繁体   English

如何修改 java 中的 fen 字符串?

[英]how to modify a fen string in java?

So i have this string StringBuilder fenToString = new StringBuilder("1P111Pr1")所以我有这个字符串StringBuilder fenToString = new StringBuilder("1P111Pr1")

now how can i change it to a = "1P3Pr1" ?现在我怎样才能将其更改为a = "1P3Pr1"

i tried this我试过这个

int fenNum = 0;
for(int i = 0; i < fenToString.length(); i++){
        if(Character.isDigit(fenToString.charAt(i))){
            fenNum += 1;
            fenToString.setCharAt(i, (char)(fenNum+'0'));
        }else{
            fenNum = 0;
        }
    }

i get "1P123Pr1" instead of "1P3Pr1"我得到"1P123Pr1"而不是"1P3Pr1"

So to explicitly state the task: You want to convert a sequence of two or more digits into the sum of those digits.因此,要明确 state 的任务:您希望将两个或多个数字的序列转换为这些数字的总和。 The sum is guaranteed to be 8 or less, ie to also be a single digit.总和保证为 8 或更少,即也是一位数。

There are many ways to do that, but the closest to what you're trying would likely be:有很多方法可以做到这一点,但最接近您尝试的方法可能是:

static String normalizeFen(String fen) {
    StringBuilder buf = new StringBuilder(fen);
    for (int i = 1; i < buf.length(); i++) {
        if (Character.isDigit(buf.charAt(i)) && Character.isDigit(buf.charAt(i - 1))) {
            // Found 2 consecutive digits, so sum them
            int sum = Character.digit(buf.charAt(i - 1), 10)
                    + Character.digit(buf.charAt(i), 10);
            buf.setCharAt(i - 1, Character.forDigit(sum, 10));
            buf.deleteCharAt(i); // Remove second digit
            i--; // Go back to reprocess the same index position again
        }
    }
    return buf.toString();
}

Tests测试

System.out.println(normalizeFen("1P111Pr1"));
System.out.println(normalizeFen("rnbqkbnr/pp1ppppp/11111111/11p11111/1111P111/11111111/PPPP1PPP/RNBQKBNR"));

Output Output

1P3Pr1
rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR

It is possible to transform the FEN string without removing characters in the StringBuilder :可以在不删除StringBuilder中的字符的情况下转换 FEN 字符串:

static String fixFenString(String fen) {
    // debug print
    System.out.print(fen + " -> ");

    StringBuilder fenToString = new StringBuilder(fen.length());
    int fenNum = 0;
    for (int i = 0; i < fen.length(); i++) {
        if(Character.isDigit(fen.charAt(i))) {
            fenNum += fen.charAt(i) - '0';
        } else {
            if (fenNum > 0) {
                fenToString.append(fenNum);
                fenNum = 0;
            }
            fenToString.append(fen.charAt(i));
        }
    }
    // add last digit if available
    if (fenNum > 0) {
        fenToString.append(fenNum);
    }
    return fenToString.toString();
}

Tests:测试:

System.out.println(getFenString("1P111P11"));
System.out.println(getFenString("1P12PP1"));
System.out.println(getFenString("1P131P"));
System.out.println(getFenString("rnbqkbnr/pp1ppppp/11111111/11p11111/1111P111/11111111/PPPP1PPP/RNBQKBNR"));

Output: Output:

1P111P11 -> 1P3P2
1P12PP1 -> 1P3PP1
1P131P -> 1P5P
rnbqkbnr/pp1ppppp/11111111/11p11111/1111P111/11111111/PPPP1PPP/RNBQKBNR ->
rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM