Ryan Dahl の面接試験:csv データのオブジェクト配列への変換

メルマガで連載中の「Node.js 入門」を書いていて、とても良い JavaScript の演習問題を思いついたので、久しぶりに「頭の柔軟体操シリーズ」の一環としてここで公開することにした。モダンな JavaScript の使い方の良い練習になると思うので、ぜひともチャレンジしていただきたい。

【問題】

http://ichart.finance.yahoo.com/table.csv?s=AAPL&a=11&b=1&c=2007&d=12&e=1&f=2012&g=m&ignore=.csv

上のURLにアクセスすると、株価データが CSV フォーマットで返って来ますが、これを JavaScript で扱いやすいオブジェクトの配列に変更するプログラムを書いてください。JavaScript は Node.js の最新バージョンに使われているものを前提としてください(←ヒント)。

ちなみに、オブジェクトの配列とは、

[ { Date: '2012-12-03',
Open: 593.65,
High: 594.59,
Low: 572.13,
Close: 575.85,
Volume: 26400300,
'Adj Close': 575.85 },
{ Date: '2012-11-01',
Open: 598.22,
High: 603,
Low: 505.75,
Close: 585.28,
Volume: 22655000,
'Adj Close': 585.28 },... ]

のような形です。

入力する CVS データは、最初の行がコラム名を示し、データの中では最初のコラムのみが文字列で、残りは浮動小数点の数値だ、という前提でプログラムを書いてください。 

余裕がある人は、Node.js の http モジュールを使って実際にデータを上のURLから取得する部分も含めて書いてみてください。


ザッカーバーグの面接試験:Objective-C のブロックを使いこなす

Facebook もようやくモバイルの重要性を認識したらしく、スマートフォン・アプリの開発経験者を募集している。そこで、「私が Facebook の面接官だったら」という仮定のもとに試験問題を作ってみた。iOS 未経験者がいきなり解くのは無理だが、「iPhone アプリならば毎日のようにバリバリと書いています」と主張するエンジニアの実力のほどを計るのに程よい問題だ。

問題

iOSでは、HTTP 経由でデータをサーバーから取得する場合、NSURLConnection を使います。しかし、一つのコントローラーから複数の HTTP リクエストを同時に発行する必要がある場合、コントローラー自身を delegate にして複数の NSURLConnection で共有すると、プログラムの可読性がどうしても落ちてしまいます。そこで、可読性を増すために、ブロックを活用した HTTPLoader というヘルパークラスを作ることにしました。使い方はこんな感じです。

        NSURLRequest* request = ...
[HTTPLoader loadAsync:request
complete:^(NSData* data, NSError *error) {
if (data) {
// Success: process the data
} else {
// Error: process the error
}
}];

そこで問題です。

HTTPLoader を実装してください(ただし、iOS 4.x 上でも動くように iOS 5.0 で追加された機能は使わないでください。また、紙の上ではなく、xCode を使って実際に動作確認しながら作って下さい) 。実装はできるだけシンプルに、ただし、並行して同時に複数の HTTP リクエストが処理できるように配慮して実装してください。また、このクラスを使う場合の注意点も記述してください。

(制限時間45分)


二重ガラスの謎:解答編

 先日の「アインシュタインの面接試験:二重ガラスの謎」、私なりの解答は「ガラスにコーティングされた金属膜による光の干渉」である。

 私もこの問題のおかげで知ったのだが、最近の二重ガラスは、単にガラスを二重にして断熱効果を高めるだけでなく、特殊金属をコーティングしたlow-Eガラスを使用することにより放射による熱の伝達を減らしてさらに断熱効果を高めている(右の図は旭硝子のウェブページより引用)。

 光の反射は、それぞれの界面(空気とガラス、ガラスと金属膜、金属膜と封入ガス、封入ガスとガラス、ガラスと空気)で起こる。ガラスの厚さは数ミリあるので、その部分は像がぶれて見えるだけであるが、金属膜の部分は非常に薄いのでそれぞれの界面からの像が重なって見える。

 その時に、二つの重なり合った光(金属膜の内側で反射した光と金属膜の外側で反射した光)の経路長の差がちょうど可視光の波長と一致したときに、その波長の色のみが干渉により強調されて見えるのである。見る角度によって色合いが変わるのは、その経路長の差が変わるからである。

 この様な現象を「光の干渉」と呼び、身近なところではシャボン玉、水溜りに浮いた油などで観察されることが知られているが、このたび「コーティングされたガラス」が仲間に加わったことになる。

 ちなみに、私が最初にググッたのは、「ガラス 膜」。角度によって色合いが変わると聞いた時に、ガラスに何らかの薄い膜が作られていることを想像したのだ。しかし、これではあまり役に立つ情報が得られなかったので、「二重ガラス コーティング」でサーチして、「low-Eガラス」という言葉にたどり着いた。最終的には、日本フクソーガラスのページに以下の記述を見つけ、この解答が正しいものであることを確信したのである。

ペアペンLEの金属膜は反射色を持っています。見る角度、光線の当たる角度などによって干渉色が色ムラのように見える場合があります。【日本フクソーガラス株式会社|断熱複層ガラス ペアペンLE高断熱|スタンダードより引用】


アインシュタインの面接試験: 二重ガラスの謎

 以前にトラックバックをいただいたことがある「諸悪の根源は物理的」というブログで見つけた「物理クイズ(光の反射)の対実験」というエントリーが、おもむろに私の中の「物理おたく魂」を目覚めさせてくれた。

 無色透明の二重ガラスに映した時計の腕時計のバンドの色がなぜか角度によって赤みがかって見えるがそれはなぜか、というのが今回の問題である。

 私もこんな現象のことは知らなかったのだが、「ひょっとして」と思いつくことがあったので、ググってみると最初はノイズだらけで役に立たない。そこで、さらに言葉を選んでもう一度ググってみると、目指す答えがあっさりと見つかる。「やはりそうだったのか」と妙に満足。

 必要なものは高校までの物理の知識とGoogle。制限時間は10分。


今日のパズル「バラの花びら(petals around the rose)」

 Google AnalyticsのUIが大幅に改良されたので、解析結果を見なおしていたのだが、そこで気が付いたのが、見覚えのない"petals around rose"というキーワードで来る人がたくさんいること。私にはなじみのない言葉だったので調べてみると、以前のエントリーのコメント欄にこのパズルのことが書かれており、それが検索エンジンに引っかかっているようである。

 実際のパズルも見つけて遊んでみたが、なかなか手ごわい。Total Roll=10あたりでやっと法則を発見し、Total Roll=14で"Correct again! We think you've got probably got it"と褒めてもらえた。パズルの場所は、

 Play Petals Around the Rose

だ。このサイトによると、ビル・ゲイツもかなり苦戦したらしい(参照)。

 ちなみに、説明が英語なので日本語訳を提示しておく。

 このゲームの名前は、「バラのまわりの花びら」。ゲームの名前が重要です。コンピューターがさいころを5個振り、あなたにその得点を当てるようにたずねます。得点はつねに、0もしくは偶数の数字です。あなたのミッションは、コンピューターがどうやって得点を計算しているかを見つけ出し、「バラの君主」になることです。

遊び方:
"Roll Dice"をクリックしてゲームを開始します。予想した得点を("Your Guess"のところに)入力し、"Accept Guess"をクリックして結果を知ります。そして再び"Roll Dice"をクリックして(法則を発見するまで)チャレンジするか、あきらめてこのページから立ち去ってください。がんばってね!


ビルゲイツの面接試験-ジャンケン編 別解

 「ビルゲイツの面接試験-ジャンケン編」、私なりの回答は昨日のエントリーに書いたが、この手の問題の面白いところは、必ずしも正解が一つに定まらず、答える人によって個性あふれる回答が得られる点だ。

 個人的には、

  • 手のひらに「山分けしよう!」と書いておいて、最初にパーを出す(笑)

なんて回答は結構好きだし、

  • この問題に関して私は驚くべき答えを発見したが、100文字でそれを書くn(ry

には笑った(「フェルマーのメモ」のパロディだ^^)。

 私が想像もしていなかった回答としては、

  • ひたすらグーを出し続けて終了後に半額25,000円もらえるようB君に交渉

があるが、試合後にもめそうなのが怖くて、私には使えない。

 一番賢いと思ったのが、

  • 主催者にあらかじめ主催者が払わなければならなくなる賞金の期待値(どちらか一方が全てパーで勝った場合、どちらか一方が全てチョキで勝った場合、どちらか一方が全てグーで勝った場合、全てアイコの場合/4パターン=17.5万円)を伝え、「10万(もしくは15万くらい)私に払えば賞金はいらないよ。」と言っておいて本番でチョキを1000回出す。Bさんとは交渉せず、賞金をくれる主催者と交渉する。

だ。これを応用して、主催者に私の「グーパー戦略」を説明して賞金の総額が最悪の場合50万円になることを説いた上で、30万円ぐらいで手打ちをする、というのが考えられる限りで利益が最大になる。


ビルゲイツの面接試験-ジャンケン編 解説

 たくさんの方たちからさまざまな回答をいただいた「ビルゲイツの面接試験-ジャンケン編」。気が付いた人も多いようだが、この問題の面白さは、単なる数学の問題ではない点にある。中途半端な「ゲーム理論」の知識が逆にじゃまになったり、「数式を使って解けるはず」だとか「正解は一つだけあるにちがいない」などといった思い込みが答えの幅を狭くする。

 「ゲーム理論」に基づいて解いて「グーとパーを50%ずつの割合でランダムに出すのが良い」という答えにたどり付いた人が何人かいたが、この方法は最適解とは言いがたい。その戦略で得られる期待値、125000円よりも多くの賞金が期待できる戦略が他にもあるし(後述)、相手がこちらがその手法を取っていることに気が付いて全部パーを出して来たときにどうしようもなくなる。

 注目すべきなのは、これがゼロサムゲームではなく、二人で結託してパーとグーを交互に出し合って250000円ずつを得ることができる「協力することによって利益を最大にできるゲーム」だという点である。こうなると、問題は、相談することも相手の表情を見ることのできない環境でどうやってコミュニケーションを取るか、にかかって来る。つまり、この問題を解くのに必用なのは、高度な「ゲーム理論」の知識ではなく、「コミュニケーション・スキル」なのである。

 そこで私なら、まずは「グー、パー、グー、パー」としばらく出し続けることにより、相手に「協力して互いの賞金を最大化しよう」というメッセージを送る。ここで気が付いてもらえれば、250000円にちょっと欠けるぐらいの収入は得られる。寄せられた回答を見る限り、7~8割の人にはそれで通じるはずだ。

 問題は、このメッセージが伝わらなかった場合(もしくは、伝わっても協力してもらえない場合)である。その場合には、相手がどんな手を出しているのかを良く観察した上で、それぞれに応じた手を打つ必用がある。

(1)パーとグーをランダムに出してくる場合
 相手は「ゲーム理論」を知っている人だ。しかし、これに付き合っていては、125000円ぐらいの賞金しか得ることができないので、もうしばらく「グー、パー、グー、パー」と出して、相手が気が付いてくれるのを待つ。それでもどうしても気が付かないのであれば、パーを連続して出すことにより、「それじゃだめだよ、交互に出せよ」というメッセージを送る。相手がそれに気が付いて、グーとパーを交互に出し始めれば、それに会わせる。もし乗ってこない場合には、パーをひたすら出し続けて、こちらだけは250000円に出来るだけ近い賞金を得る。

(2)パーばかり出してくる場合
 これは怠惰な人だ。この場合は、チョキを連続して出して懲らしめる。相手がそれに反応してパーばかりを出すのをやめたら、(相手が何を出しても)すぐに、「グー、パー、グー、パー」のシーケンスに戻して、こちらの意思を明確にする。

(3)こちらのグーにはパーを、パーにはチョキを出してくる場合
 これが最悪の相手。こちらの意図を察していながら、自分だけ得をしようとする人だ。世の中はそんなに甘くないことを教えてあげるべきだ。まずはチョキを連続して出して懲らしめて様子を見る。しばらくしてから、再び「グー、パー、グー、パー」と出して、相手が乗ってくるかどうか見る。再び「パー、チョキ、パー、チョキ」と来たら、チョキの連続でまた懲らしめる、を続ける。

(4)チョキばかり出してくる場合
 ジレンマに陥っている人だ。この場合は、しばらく「グー、パー、グー、パー」を出し続けて、相手が気が付いてくれることをひたすら祈る。それでも気が付かなければ、仕方がないので、グーを連続して出して懲らしめる。相手がパーを出したところで、すかさず「グー、パー、グー、パー」のシーケンスに戻して、説得を試みる。

(5)グー・チョキ・パーを適当にまぜて来る場合
 普通にジャンケンをすれば良いと考えているのだろう。この場合も、しばらく「グー、パー、グー、パー」を出し続けて、相手が気が付いてくれることをひたすら祈る。それでも気が付かなければ、パーを連続して出す。相手がそれに気が付いてチョキばかりを出してきたら、今度はグーを連続して出し、相手がパーを出すのを待って、「グー、パー、グー、パー」のシーケンスに戻す。

 結局のところ、この戦略の成否は、ジャンケンを通してこちらの意図を相手の伝えることができるかにかかっている。出来る限り早く意思の疎通ができれば、それだけ互いの利益を最大値に近づけることができる。

 考えてみると、実社会でも「お互いに少しづつ譲歩し合えば互いの利益が最大化できる」にも関わらず、「お前が先にグーを出せよ」と言い争いながら双方がパーを出し続けてしまうのに相当することをしてしまうことは良くあることだ。そんなときは、この問題のことを思い出してみるのも良いかも知れない。


ビルゲイツの面接試験-ジャンケン編

 大槻ケンヂの「グミ・チョコ」を読んでいて思いついたのが、今日のクイズ。単なる数学の問題ではないので良く考えてみて欲しい。

 あなた(=Aさん)とBさんにジャンケンを連続で1000回してもらいます。あなたもBさんも、パーで勝つたびに500円、チョキで勝つたびに200円の賞金を主催者からもらえます。グーで勝ったり、アイコになった場合には一円ももらえません。この条件で、あなたの賞金を最大化するために、どんな戦略を採りますか?ただし、Bさんと前もって相談することはできないし、試合中はしゃべったり身振りで合図を送ってはいけません。表情も見えないように、ミラーガラスのヘルメットを被ってもらいます。試合中に見えるのは相手が何を出したかだけです。

 回答は、コメント・トラックバック・ブクマコメントなどで送っていただきたい。

 ちなみに、この問題には面白いパラドックスが隠されている。普通に考えると、グーを出しても期待値はゼロなので、出してもしかたがない。と、いうことは、相手もグーは出して来ないので、パーを出しても決して勝つことはできない。そうなると、チョキを出すしかないが、相手も同じロジックで考えてくるとチョキ同士のアイコになってしまう。

Sakura_3


「半分空っぽのコップ」を「半分水が入ったコップ」に見せるテクニック

Yugawara  ものごとをポジティブに考えるか、ネガティブに考えるかという議論をするときに、「半分だけ水が入ったコップをどう見るか」という話が良く引き合いに出される。それを「半分も水が入っている!ラッキー」と考えるか、「どうして半分しか水が入っていないんだろう?残りの半分は誰かが飲んでしまったのだろうか」と考えるか、で人生が大きく変わってくるという話である。

 ポジティブに考えた方が人間幸せになれるし、そんな人の方が成功する可能性が実際に高くなる、という話は大昔から言われ続けてきたことだが、そうは分かっていても、「入ってない方の半分」が気になってしまうのが人間の弱さである。

 これと関連する話で、先日読んだ心理学の本に、ちょっとした工夫で皆が得をした気分になる(つまりポジティブに考える)テクニックが書いてあったので、ここで紹介する。

 VHSテープ全盛の時代の米国のレンタルビデオ店での話。「見終わったあとはテープ巻き戻してから返却してください」とシールを貼っておいても、巻き戻さずに返却する人が多く、店としては頭を抱えていた。そのまま次の客に貸してしまうと次の客の気分が悪くなるし、店でいちいち巻き戻していては手間がかかって仕方がない。

 これを「マナーの問題」としてしまうと、ほぼ解決不可能な難問になってしまうが、この店では思い切ってルールを変更してしまうことにより、この問題をみごとに解決したのだ。VHSテープに貼り付けるシールの文言を「このテープは一度最初まで巻き戻してからご覧ください。返却時は巻き戻さなくても結構です」に変更しただけだ。

 こうやって基本ルールを変えただけで、借りたばかりのテープが巻き戻っていなくても気分を害する客はいなくなったし、逆に巻き戻してあると「得をした気になる」ようになったのである。注目すべきは、誰も行動パターンを大きく変えたわけでもないのに、皆の気分が良くなった点である。

 そこで応用問題として、これと同じようなテクニックを他に応用できないだろうかと考え中である。ちょっと見え方を変えるだけで、今まで「半分しか水が入っていないコップ」に見えていたものが、「水が半分も入っているコップ」に見えて皆が得をしたように感じてしまうような応用例である。

【追記】 ちなみに、ネタフルのコグレマサト氏から彼の著書「口コミの技術」(いしたにまさき氏との共著)の初版本(それもサイン入り!)をいただいたので、その御礼も兼ねてここで紹介。さすが「日本発のプロブロガー」だけあって説得力がある。「自分のブログをもっとたくさんの人に読んで欲しい」、「アフィリエイトで小遣いかせぎをしてみたい」人たちには必読だ。


スティーブ・ジョブズの面接試験、iPhone編

Itv 待望のApple iPhoneの発表を記念して、今回はiPhoneにまつわる頭の体操。

 多くのブログでも指摘されているが、iPhoneはWiFi、GSM+EDGE、Bluetoothというネットワーク機能は持ちながら、iPhoneから直接iTune Music Storeにアクセスして音楽やビデオを購入することは出来ない(日本の「着うたサービス」に慣れている人の中には、「これじゃあ日本じゃ通用しないよ」と批判する人もいるぐらいだ)。

 ここで問題である、アップルはいったい全体、なんでiPhoneを使って直接iTune Music Storeから購入できるようにしなかったのだろうか?

 ジョブズは、自分が「これは絶対に必要」と思った機能を落とすようなことはしない。つまりこれは、「iPhoneからのコンテンツの直接購入」という機能を、ジョブズが(1)そもそも必要ない、と感じたか、(2)あった方が良い機能だがプライオリティは低い、と考えたという証拠である。

 ちなみに、このブログではこの手の頭の体操問題を「ビル・ゲイツの面接試験」シリーズと呼んでいるが今回はスティーブ・ジョブズに敬意を表して、「スティーブ・ジョブズの面接試験」と呼ぶことにした。例によって、正解が一つに定まっているわけでもないし、誰もが同じ答にたどり着かなければならない理由もない。大切なことは、「自分がスティーブ・ジョブズだったらどう考えるだろう」と、自分以外の人の立場になって考える習慣を身につけること。