MacBook Air 13" Mid 2011 開封の儀

2011年7月21日木曜日

MacBook Air 13インチ、Core i5 1.7GHz、4GB MEM、256GB SSDなモデルを買ったので開封の儀など。
といっても写真をひたすら貼っていくだけ。

午前10時、50人ほどに膨らんでいたアップルストア銀座の行列に告げられたのは「本日、MacBook Airの入荷はありません」という残念すぎる言葉。ダメもとで近くの有楽町ビックカメラへ行ってみると、平然と展示しているし在庫もあるということだった。

ただ店員さんからの注意点が2つ
「Officeはまだ対応してないようです」
「不具合かどうか確認出来てない状況ですが、電源延長用ケーブルの先端が通常の二又+アース線ではなく三又のものになっています。仕様なのか誤混入なのか不明な状況ですが…」
まあいいや、っと購入。

ん?2.95kg?

なんかシールの貼り方的に、梱包完了は7/9だった模様。

外箱あけると子箱が中に

取り出す

わくわく

なんか注意書きなどされているけどあまり気にしない。


箱あけたところ。こう見るとやっぱり2010年秋モデルとさほど変わらない。

注意書きが書かれた紙で本体保護シートが封されてる形

やぶりかけ

本体開いたとこ

液晶保護用のシートを外した

電源投入!テンション上がる背景

言語選択

地域選択

キーボード選択

入力方法選択

Wi-Fi設定

他Macからの情報インポート。今回はスルー

アカウントピクチャ設定。当然ジンジャーブレッドマン

パスワード入れてアカウント作成

ユーザ登録。けっこうしっかり入力させられる

使用許諾契約

ジェスチャーの練習的なもの

ついにログイン画面

多少さわってみたところ

触ってみた感想ですが、CPUが強化された分のサクサク感、前に使っていたMBAと比べて2倍のメインメモリを積んでいる安心感、同4倍容量のSSDによる「容量気にせずAndroidのソースでもなんでも来い」感が素晴らしいです。Lionも1日使えばだいたい慣れるし、買ってよかったと思ったのでした。

TopCoder SRM練習 - SRM 511 DIV2 Easy

2011年7月13日水曜日

今日もちょいちょいと。
GameOfLifeDivTwo

・ライフゲームの変形版
・ドットが円形に並んでる
・状態Tでの各ポイントの生存状態は、その前(T-1)で自身プラスマイナス1つの計3つのうち2つ以上が生存していた(=>true)か否か(=>false)で決まる

ということで愚直に端っこをループさせてこういうふうに解いた。計算量的には、-1にあたる場所とNにあたる場所をもうちょい特殊に扱って毎回境界外をつなぐ処理を行わないようにすれば減らせそう。まあ、Top Submission見てもこんな感じ。途中喋りながらやってたというのはあるけど、さらっと書いてから配列のコピーで微妙にハマりprintfデバッグ繰り返した結果159.31。うーん、イマイチ。正答率91%、平均点183。

public class GameOfLifeDivTwo {

 public String theSimulation(String init, int T) {
  int setLen = init.length();
  boolean stateList[] = new boolean[setLen];
  boolean stateTmpList[] = new boolean[setLen];
  for (int i = 0; i < setLen; i++) {
   stateList[i] = init.charAt(i) == '1';
  }
  for (int i = 0; i < T; i++) {
   for (int j = 0; j < setLen; j++) {
    int liveCnt = 0;
    int nextIdx = j + 1;
    if (nextIdx == setLen) {
     nextIdx = 0;
    }
    if (stateList[nextIdx] == true) {
     liveCnt++;
    }
    int prevIdx = j - 1;
    if (prevIdx == -1) {
     prevIdx = setLen - 1;
    }
    if (stateList[prevIdx] == true) {
     liveCnt++;
    }
    if (stateList[j] == true) {
     liveCnt++;
    }
    stateTmpList[j] = 2 <= liveCnt;
   }
   for (int k = 0; k < setLen; k++) {
    stateList[k] = stateTmpList[k];
   }
  }
  String retStr = "";
  for (int i = 0; i < setLen; i++) {
   retStr = retStr.concat(stateList[i] == true ? "1" : "0");
  }
  return retStr;
 }

}

TopCoder SRM練習 - SRM 450 DIV1 Easy

2011年7月12日火曜日

昨日に続いて、少しずつやる。
今日やったのはOrdered Nim

・AliceとBobの2人がゲームをしてる
・複数のヒープ(インデックスが振られている)のうち1つから、1つ以上の石を交互に取り出す
・あるヒープから石を取り出せる条件は、そいつよりインデックスの小さなヒープが全て空の場合だけ
・最初に取り出すのはAlice
・各ヒープに入ってる石の数は10億個以下
・お互いが最も効率的にゲームをプレイする場合、勝つのはAliceかBobか返せ

先日落としたトラウマ化しつつある問題と少々似てるところがある。いくつかケースを紙に書いてみて
・Aliceが必ず勝てる場合以外は、Bobが必ず勝てる(直感的にこうだけど未証明)
・n-1番目へたどり着いたら全部取って勝てるので、n-2(境界注意)までが勝負
・"Aliceが勝つかどうか"をn-2番目のヒープから逆順でたどって検証していけばよさげ
・あるヒープに石が最初から1個しかなければ、勝者判定をひっくり返す
・あるヒープに石が最初2個以上あれば、その次(ループ上はひとつ前)のヒープにある石が1個であれば勝者判定をひっくり返し、2個以上であればAliceの勝ち判定とする(総取りか1つ残すかのどちらかで、Bobに不利条件を押し付けられるから)
とたどり着いた。

テストケースを自前で増やしてやばそうなパターンを拾えるようにしたけれど、それでも抜けがあって一度failed system test。その後訂正し再提出して75.0pt(実際だったら0pt)。なかなか凹みますな。avg=205 / 正答率74%。この回なら文句なしに落ちてる。

public class OrderedNim {

 public String winner(int[] layout) {
  String ALICE = "Alice";
  String BOB = "Bob";
  if (layout.length == 1) {
   return ALICE;
  }

  boolean aliceWins = true;
  boolean oneStoneFollows = false;
  for (int i = layout.length - 2; 0 <= i; i--) {
   if (oneStoneFollows == true) {
    if (layout[i] == 1) {
     aliceWins = !aliceWins;
    }
    else {
     aliceWins = true;
     oneStoneFollows = false;
    }
   }
   else {
    if (layout[i] == 1) {
     aliceWins = !aliceWins;
     oneStoneFollows = true;
    }
   }
  }
  return aliceWins ? ALICE : BOB;
 }

}

"both players play optimally"な問題はまあまあ苦手だなぁ。

TopCoder SRM練習 - SRM 450 DIV2 Easy

2011年7月11日月曜日

簡単な問題でもいいので、出来るだけ毎日解くキャンペーン中。
今回やったのはStrangeComputer

・指定位置のメモリを書き換えると、そこから右(概念的に)が全て指定した値でフィルされてしまう、変なコンピュータが与えられてる
・入力(文字列)で指定されたメモリ状態にするための最短手数を返せ
・なお、初期状態は0埋めされてる
public class StrangeComputer {

 public int setMemory(String mem) {
  char prevChar = '0';
  int opCnt = 0;
  for (int i = 0; i < mem.length(); i++) {
   if (mem.charAt(i) != prevChar) {
    opCnt++;
    prevChar = mem.charAt(i);
   }
  }
  return opCnt;
 }

}
こんだけ。同じ値が連続すれば、その分は前オペレーションで指定済みとなるので手数増やさずに設定したことに出来る。230.98、passed system test。平均スコアが213.15で正答率93%なのでこんなもん。