Help us understand the problem. What is going on with this article?

第3回 オフラインリアルタイムどう書く解答(C++)

More than 5 years have passed since last update.

オフラインリアルタイムどう書く。三度目。
問題は http://nabetani.sakura.ne.jp/hena/ord3ynode/
コードをアップするところまでが勉強会( see http://qiita.com/items/1815701039050f42bbc1 ) ということで、その場で書いた C++11 版を

ynode.cpp
#include <iostream>
#include <utility>
#include <string>
#include <map>
#include <cassert>

using namespace std;

struct testdata_t
{
  string in;
  string expected;
};
testdata_t testdata[]{
// 略
/*30*/ {"rrrrbllrlrbrbrr", "ACBACABCFDEDADFC" },
};

string turn_r{ "BACBA ADFCAD EBCFEB DABEDA FDEFD" };
string turn_l{ turn_r.rbegin(), turn_r.rend() };

string turn( string const & state, string const & course )
{
  auto pos = course.find( state );
  assert( pos != string::npos );
  return course.substr(pos+2,1);
}

string solv( string const & in )
{
  string r{"BA"};
  for( auto ch : in ){
    string state{ r.end()-2, r.end() };
    switch( ch ){
    case 'b':
      r+=state[0];
      break;
    default:
      r+=turn( state, ch=='r' ? turn_r : turn_l );
      break;
    }
  }
  return {r.begin()+1, r.end()};
}
int main()
{
  for( auto t : testdata ){
    auto actual = solv(t.in);
    cout << t.in << "->" << actual;
    if ( actual != t.expected ){
      cout << "**FAIL** expected : " << t.expected;
    }
    cout << endl;
  }
  return 0;
}

turn_r は、右に曲がり続けたらこうなるよというシーケンス。
turn_l は、左。
ということで、turn_r から "AB" を見つけ出すと、その次の文字が AB の後で右に曲がったら到達する Y字路。というロジック。

C++11 の機能をちょっと使ってだいぶ楽をしている。

Nabetani
横浜へなちょこプログラミング勉強会をやっていました。 / CodeIQ の出題者でした。 / 日経 WinPC に連載を持っていました(名義が違うけど) / Yokohama rb に半分ぐらい参加しています。 / twitter : http://twitter.com/Nabetani
https://nabetani.hatenadiary.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away