[モータースポーツ] 2010年モータースポーツカレンダー作ったよ

Googleカレンダー用です。

Googleの公開カレンダー検索が使えなくなり、ネット上で公開してる人も見つからなかったので作ってみた。

来年はどうするかわからないので2010年限定で。気が向いたら来年以降もそのまま使えるようにするかも。

間違いや変更があったら教えてもらえるとうれしい。

[プログラミング]人生を書き換える人もいるらしい問題

http://okajima.air-nifty.com/b/2010/01/post-abc6.html

良かった、解けて。


最短性は保証してるはず。


0:40開始、1:40終了。ちょうど一時間かかった。
会社で問題見て、あとで暇なときにやろうと思っててさっき始めたから、実際には一時間強ってところかなあ。


試験の形式としてはとても良いと思った。
普段使ってる環境とネットが使える状態でコードを書いて提出するというのは、限りなく仕事でプログラミングする環境に近い。


僕の場合、ネット使えなかったら解けてないしw
std::cinって改行とかどうなるん?(結局std::getline()を使用)とか、gdbで実行時に標準入力をリダイレクトするのってどうやるんだっけ?とか検索した(ちなみにrun < hoge.txt)。

回答
**************************
*S* *$$$$                *
*$* *$ *$ *************  *
*$*$$$* $  ************  *
*$$$ *  $$$$$$$          *
**************$***********
* $$$$$$$$$$$$$          *
**$***********************
* $$$  *$$$$$$$$$$$$$$$  *
*  *$$$$$ *********** *  *
*    *        ******* *  *
*       *                *
**************************
#include <iostream>
#include <cassert>

class Meiro
{
public:
  static const size_t WIDTH_MAX = 256;
  static const size_t HEIGHT_MAX = 256;

  Meiro () 
    {
      start.x = -1;
      start.y = -1;
      goal.x = -1;
      goal.y = -1;
      for (size_t y = 0; y < HEIGHT_MAX; ++y) {
        for (size_t x = 0; x < WIDTH_MAX; ++x) {
          data[y][x] = '\0';
          distance[y][x] = INT_MAX;
        }
      }
    }

  void setStart (size_t x, size_t y) 
    {
      assert (x < WIDTH_MAX);
      assert (y < HEIGHT_MAX);
      start.x = x;
      start.y = y;
    }

  void setGoal (size_t x, size_t y) 
    {
      assert (x < WIDTH_MAX);
      assert (y < HEIGHT_MAX);
      goal.x = x;
      goal.y = y;
    }

  void setData (size_t x, size_t y, char d)
    {
      assert (x < WIDTH_MAX);
      assert (y < HEIGHT_MAX);
      assert (d == 'S' || d == 'G' || d == ' ' || d == '*');
      data[y][x] = d;
    }

  size_t getDistance (size_t x, size_t y) 
    {
      assert (x < WIDTH_MAX);
      assert (y < HEIGHT_MAX);
      return distance[y][x];
    }
  
  void setDistance (size_t x, size_t y, size_t d) 
    {
      assert (x < WIDTH_MAX);
      assert (y < HEIGHT_MAX);
      distance[y][x] = d;
    }

  char getData (size_t x, size_t y)
    {
      assert (x < WIDTH_MAX);
      assert (y < HEIGHT_MAX);
      return data[y][x];
    }
  
  void setRoute (size_t x, size_t y)
    {
      assert (x < WIDTH_MAX);
      assert (y < HEIGHT_MAX);
      data[y][x] = '$';
    }
  
  void trace (size_t x, size_t y, size_t distance) 
    {
      char d = getData (x, y);
      if (d == '*') return;
      if (distance >= getDistance (x, y)) return;
      setDistance (x, y, distance);
      
      trace (x - 1, y,     distance + 1);
      trace (x + 1, y,     distance + 1);
      trace (x,     y - 1, distance + 1);
      trace (x,     y + 1, distance + 1);
    }
  
  bool traceRoute (size_t x, size_t y, size_t distance) 
    {
      if (distance == 0) return true;	// start

      char d = getData (x, y);
      if (d != ' ' && d != 'G') return false;
      if (distance != getDistance (x, y)) return false;
      setRoute (x, y);
      
      if (traceRoute (x - 1, y,     distance - 1)) return true;
      if (traceRoute (x + 1, y,     distance - 1)) return true;
      if (traceRoute (x,     y - 1, distance - 1)) return true;
      if (traceRoute (x,     y + 1, distance - 1)) return true;

      return true;
    }

  void execute ()
    {
      assert (start.x >= 0);
      assert (start.y >= 0);
      assert (goal.x >= 0);
      assert (goal.y >= 0);

      trace (start.x, start.y, 0);
      traceRoute (goal.x, goal.y, getDistance (goal.x, goal.y));

      output ();
    }

  void output ()
    {
      for (size_t y = 0; y < HEIGHT_MAX; ++y) {
        bool needReturn = false;
        for (size_t x = 0; x < WIDTH_MAX; ++x) {
          char c = getData (x, y);
          if (c != '\0') {
            std::cout << c;
            needReturn = true;
          }
        }
        if (needReturn != false) {
          std::cout << std::endl;
        }
      }
    }

private:
  char data[HEIGHT_MAX][WIDTH_MAX];
  size_t distance[HEIGHT_MAX][WIDTH_MAX];

  struct Point {
    int x;
    int y;
  };

  Point start;
  Point goal;
};
  
int main (int argc, char* argv[])
{
  Meiro meiro;

  std::string line;
  size_t y = 0;
  while (std::getline (std::cin, line)) {
    for (size_t x = 0; x < line.length (); ++x) {
      meiro.setData (x, y, line[x]);
      if (line[x] == 'S') {
        meiro.setStart (x, y);
      } else if (line[x] == 'G') {
        meiro.setGoal (x, y);
      }
    }
    ++y;
  }

  meiro.execute ();
}

24ビットフルカラー != フルカラー

「1677万色あれば人間の目で判別できる全ての色を表現できる」って言った人は誰?
ダイナミックレンジがすごく狭い液晶モニタ内でもバリバリにマッハバンド出てるんですけど。全然足りてないよ。
256段階のグレーの諧調でもマッハバンド出るし、中間色では全然諧調出せないし。
そもそも色によっては同じ色相のままでは全く諧調が作れないものがあるじゃないのさ。


しかし一番多くの諧調があるグレーやRGBのグラデーションでもマッハバンドが見えるのだから、色のサンプリングが悪いわけでもなさそうだ。
「24ビットカラー = 1677万色 = フルカラー = 全ての色を表現できる」というのはオカルトであり都市伝説だよね、もう。


65536色とか256色とか4096色中16色とかデジタル8色とかから比べればフルカラーとか総天然色と言いたかった気持ちはわからないではないけど、もうそろそろ色を24ビット整数で扱うのはやめよう、と思った。

仮想化が効かない

システムとデータのドライブは分けたいのでこれを行ってたのですが、

http://www.kkoba.com/blog/archives/2007/03/d.shtml

これにより、うちではシステムフォルダ(Windows、Program Files)の仮想化がされなくなっていました。
AppData\Local\VirtualStoreに書き込まれません。限りなくバグくさいですが。

X360Cドライバが入らない

解決しました。
手順としてはx360cドライバのReadme.txtの書いてあった通りです。マニュアルはちゃんと読みましょう。恥ずかしい。

ここでフォルダを指定してはダメで、いったん下の「コンピュータ上のデバイス ドライバの一覧から選択します(L)」を選ばないといけません。
そうすれば次の画面で「ディスク使用」で指定できます。

Mutexプロキシオブジェクト

Mutexのプロキシオブジェクト(コンストラクタでLock(), デストラクタでUnlock())を作ってみたけど、すごく便利だこれ。
プロキシオブジェクトの厄介な点としてコピーの扱いをどうするかというのがあるけど、MutexのLock状態をコピーすることなんてないしね。

X360Cドライバが入らない

代わりのマザーを購入してVistaをインストールし直して、マザーを交換したらアクティベーションが無効になってしまい電話サポートで解決し、アプリの再インストールもだいたい終わったたものの、(ある意味とても重要な)X360Cドライバが入らなくなってしまいました。

ドライバの更新を行っても、「最適なドライバ ソフトウェアが既にインストールされています」と言われて弾かれる。

ドライバを削除しても勝手に標準ドライバが入ってしまう。んもー、なにこれ。
(標準ドライバはあまりにひどいのでちっとも最適なドライバじゃないし)
今のところ解決方法見つからず。

それにアクティベーションってもっと賢い方法なのかと思ってたよ。