string getMinProgram(vector actions) {
string instr = "";
map bar;
//まとめて格納.
char tabC[5] = "N-/|"; char tabR[5] = "SLFR";
for(int i = 0; i < 4; i++) {
bar[tabC[i] ] = i;
}
string act = "";
for(int i = 0; i < actions.size(); i++) {
act += actions[i];
}
for(int i = 1; i < act.length(); i++) {
int diff = (bar[ act[i] ] - bar[ act[i-1] ]+ 4) % 4;
//まとめて文字を格納したときの効果がここで現れる.
instr += tabR[diff];
}
instr = '.' + instr;
string ans = "";
cout << instr << endl;
int cnt = 1;
//後ろから探索していく.S50S99とかにしなきゃいけないので、前から探索すると複雑になってしまう.
for(int i = instr.length()-1; i >= 1; i--) {
if(instr[i] == instr[i-1] && cnt < 99) {
cnt++;
} else {
char ch[3];
sprintf(ch, "%02d", cnt);
ans = instr[i] + string(ch) + ans;
cnt = 1;
}
}
if(ans.length() > 100) ans = ans.substr(0, 97) + "...";
return ans;
}