生存報告と、その他もろもろ

一応生きているってことで。

Google CodeJam参加

今年もRound2で敗退。俺・・・本当に過去にWorld Final行けたんだよね?今回の敗退の主要因は、Aにはまってしまったこと。A-smallに1時間半かけるとか。しかもA-largeでミスするとか!白状すると、実はA-smallもバグ有りコードで提出しているので、smallも本当は通ってません。

関数の最小値を求める

GCJでミスした部分について、せっかくなので書く。
あるイテレータブルな何か(配列・リスト・コンテナ等)があって、各要素を受理する関数があったとしましょう。このとき、関数の返り値の最小値を求めたい。手続き型っぽく書くとこんな感じ。

int function(T t);
Container<T> container;
int min = Integer.MAX_VALUE;
for(T t: container){
  value = func(t)
  if(min < value)
    min = value;
}

あるいは、関数型っぽく書くとこんな感じ。

min (map func container);

問題は、上の手続き型のソースの中の、Integer.MAX_VALUEってのが曲者で、左辺がintだからInteger.MAX_VALUEだけど、longだとLong.MAX_VALUEになるし、BigIntegerだとどうにもならなかったりする。
今回の場合、大きめの値をminに代入してたものの、もっと大きくしておかなきゃいけなかったらしく大失敗。

解決案1 最初の項目を特別扱いする

containerの第一要素の結果をminに格納することで、変なminの値にならないようにする。

int min = func(container.get(0));
for(T t: container){
  value = func(t)
  if(min < value)
    min = value;
}

問題点: 第一要素が取り出しにくいときには書きにくい。

解決案2

minを特別な値-1にする。

int min = -1;
for(T t: container){
  value = func(t)
  if(min == -1 || min < value)
    min = value;
}

問題点: ifの中が読みにくくなってよろしくない。

解決案3

特殊なデータ構造を作成する。

class MinimumObject<V>{
  boolean set_min;
  public V min;
  public MinimumObject(){}
  public int set(V v){
    if(!set_min || min.compare(v) > 0)
       min = v;
  }
}
MinimumObject<Integer> min = new MinimumObject<Integer>();
for(T t: container){
  min.set(value = func(t));

問題点: これしきのことで長くないっすか?

ということで、いまだに有効な改善策が見つかっておりません。


PC環境とか

ところで世間ではiPadとやらが発売され大人気な様ですが、みんなが何を期待してあれを買っているのか、いまだにわからないです。世間がほしがるものを作る職務についているのに、世間の需要がわからないのはよくないことなのだと思いますが、自分の生活があのデバイスによって変わることが全く想像できません。
Googleマップを持ち運べる点についてはいいと思うんですが、それってノートPCでもできるよなあと。使ってる人を見ても、パラダイムシフトが発生する気がしなくて。それにあれ、プログラミングしにくそうじゃない?

ということで、I(dea)Padを買いました。http://ascii.jp/elem/000/000/499/499886/
重さは、1.5kgとiPadの倍くらいですが、それなりに動くみたいです。これを買おうと決断したきっかけは、「NetBookVisual Studioって普通に動くし使えるよ」という先輩の一言でした。
CPU的には、10年前のPentium 4初期といろんな意味で同程度ですが、HDDはふんだんに使えるし、メモリも1Gあるのでそんなに困らない感じです。メイン開発マシンにはならないだろうけど。