読者です 読者をやめる 読者になる 読者になる

Tamflexの貯蔵庫

やる気のない備忘録

codeIQ 2751

contest contest-codeIQ


図形に関して, 3*7の長方形を3個つなげた対称性の高い空間だと言える.
これらの長方形をそれぞれworld 0,1,2として範囲外に出たら「奈落」/「ワープ」させる条件分岐を書けばわかりやすいかもしれない.
文字の変換についてだが, こちらもASCIIコードを駆使してあげれば綺麗に書ける.
あとは数値を'F'*数値に置き換えてfor文を回せばあとはやるだけ.

char conv(int w, int i)
{
  switch (w) {
    case 0:
      if(i<10) return '0'+i;
      else return 'a'+i-10;
    case 1:
      if(i<15) return 'l'+i;
      else return 'A'+i-15;
    case 2:
      if(i<20) return 'G'+i;
      else return '@';
    default :
      return ' ';
  }
}

int main()
{
  string s, t=""; cin >> s;
  string str = "";
  int dx[] = {1,0,-1,0,0};
  int dy[] = {0,1,0,-1,0};
  int x=0, y=0, d=0, w=0;
  REP(i,s.size())
  {
    switch(s[i])
    {
      case 'R':
        t += s[i];
        break;
      case 'L':
        t += s[i];
        break;
      default :
        REP(j,s[i]-'0') t += 'F';
        break;
    }
  }
  t += "F";
  REP(i,t.size())
  {
    if(x<0||x>6||y<0||y>2)
    {
      if(y==3&&x>=0&&x<=2)
      {
        y = x;
        x = 6;
        w = (w+2)%3;
        d = 2;
      }
      else if(x==7&&y>=0&&y<=2)
      {
        x = y;
        y = 2;
        w = (w+1)%3;
        d = 3;
      }
      else
      {
        str += "!";
        break;
      }
    }
    switch (t[i])
    {
      case 'R':
        d = (d+1)%4;
        break;
      case 'L':
        d = (d+3)%4;
        break;
      case 'F':
        str += conv(w,x*3+y);
        x += dx[d];
        y += dy[d];
        break;
      default :
        break;
    }
  }
  cout << str << endl;
}