#include <stdio.h>
int main() {
    int ix, j = -1;
    char id, stk[4000];
    while (scanf("%hhd-%d", &id, &ix) == 2 && id && ix) {
        for (id--; j >= 0 && ix > 0 && (stk[j]^id) == 1; ix--, j--);
        while (ix-- > 0) stk[++j] = id;
    }
    while (j >= 0) {
        for (ix = 0, id = stk[j]; j >= 0 && stk[j] == id; j--, ix++);
        printf("%c-%d ", '1' + (id ^ 1), ix);
    }
}

只需消除回头路,相邻的相反方向操作抵消,用栈。

方便起见每1步作为一项(严格来说可能爆栈),方向1-4减1变成0-3方便位操作检查是否是相反方向。