昨日のこと.武蔵小杉から都内某駅まで最短経路で向かったのだが,武蔵小杉から日比谷線を経由する定期券があるので,そっちを回ると安上がりになる.ところが,実際のところは,最短経路で行こうが定期区間を経由しようが,改札の駅が完全一致するので,どちらの経路を利用しようと安上がり経路で料金が計算されるらしい.気づかなかった.
ちなみに帰りは溝の口を回ったのだが,途中に定期区間を含めると安いようで,なかなかあり得ない経路で料金が計算された.
一部の人にはオフラインで明らかにしてしまったので. ひとりごとの垂れ流しを始めました.たいしてひとりごとを放つこともないと思いますが,興味のある人がいればどうぞ.
22:00 を過ぎているのに人身事故で電車の運転見合わせとか勘弁して欲しい.とりあえず市バスをつかまえたはいいのだが,どうも遠回り経路のバスに乗ってしまったらしい.隣駅まで行くだけなのに妙に時間がかかる.しかも今どこを走っているかわからない.素直に歩くなり待つなりすべきだったか.
帰ったらバスの経路を勉強しておこう.
ちなみに事故は東海道線内で発生して,京浜東北線と南武線が巻き添えを食らったらしい.
いつになっても武蔵新城駅というのは最適経路がわからない.
問. 有楽町駅と日比谷駅のいずれかから武蔵新城駅まで向かうとき,以下の条件のもとで終電をつかまえるには,一番遅い場合でそれぞれどの駅からどの電車に乗ってどのような経路をたどればよいか.
ちなみに,今日(正確には昨日)は 1. のケースにあたる経路で帰ってきたのだが,定期券が活用できるとかいうひどい理由で選択したわりには最適経路を選んでいた.
今年はいまだにくしゃみが出るので今日(正確には昨日)も耳鼻咽喉科に向かった.木曜日が薬を飲んでもきつかったとか,今日は薬を飲み忘れたわりには何ともないとか(夕方になってから鼻の中がかゆくなってきたので飲んだけれど),症状の強弱は相変わらず先生ご自身と一致しているらしい.もっとも,正確な原因はわからないそうだ.
マスクが貴重品になってしまっておいそれと使えない.
最近は行き帰りの電車内でソリティア(クロンダイク)をしていることが多かったが,もう少しゲームらしいもの(ソリティアのファンがいたら申し訳ない)をやろうと思ったので,Xi の Advanced [es] 対応版を購入した.数年ぶりながらゲームの感覚はわりとすぐに思い出したのだが,カーソルキーの操作にはなかなか慣れない.特に,右に移動するときに少しずれて隣の電源ボタンを押してしまうと…!!
〔追記〕 だんだん慣れてきて,とりあえず ENDLESS モードで 2 万点はとれた.しかし,これをケータイでやると親指がとても痛くなる.やりすぎると確実に身体上の問題を引き起こしそう.
求愛活動の巻き添えだったらそろそろ終わってもいいものなのに,今年はどうも鼻水やらくしゃみが止まらない.心配になってきたので以前にもお世話になった耳鼻科に駆け込んでみたら,先生が「花粉,花粉w」(表現に誇張あり)とのたまう.何でも先生ご自身も花粉症持ちのようで,木曜日がきつかったことを伝えたところ「私とおんなじ」(原文そのまま)とのこと.残念ながら認めざるを得ないようだ.ヒノキはそろそろ終わっているはずだから,イネあたりじゃないかとのこと.げげ,イネって飛散時期が長かった気がするぞ.
どうも最近は作業量を過小予測することが多くてよくない.今日はとうとう深夜残業にまで手を出してしまった.といってもほんの 30 分ばかりなので,人によっては「俺(or 私)よりも全然早い」とか言われてしまいそうだが.
最近レベル年齢が上がって 19 進法で 19 歳になった.
今年は求愛活動が(一部を除いて)終わったはずだが,くしゃみと鼻水が止まらない.特に部屋にいるときに症状が現れることが多いような気がしていたので(ただし外出中でも時折現れる),これはハウスダストの影響かもしれない,ということで安物の空気清浄器を買ってみた.効果のほどは…今のところよくわからない.
d.y.d. の記事に関して.とりあえず cointoss という名前ははなはだまずい(明らかに random() を思い浮かべる).名前を変えるだけでも明瞭さに違いが現れそう.
まあ,名前の問題は置いておくことにして,単純に任意引数の関数を用意するだけでも十分という気はする.
def where_is_max(array)
max_i = 0
for i in 1...(array.size)
if array[max_i] < array[i]
max_i = i
elsif array[max_i] == array[i]
max_i = arbitrary(max_i, i)
end
end
max_i
end
def merge(xs, ys)
zs = []
until xs.empty? || ys.empty?
if xs[0] < ys[0]
zs.push(xs.shift)
elsif xs[0] > ys[0]
zs.push(ys.shift)
else
zs.push(arbitrary(xs, ys).shift)
end
end
zs + xs + ys
end
将来の言語処理系は以下のプログラムに対して median-of-median とかを持ち出したりするのだろうか.
def partition(array, i, j, pivot)
# ...
end
def qsort(array, i, j)
unless i == j
k = partition(array, i, j, arbitrary *(i..j))
qsort(array, i, k - 1)
qsort(array, k + 1, j)
end
end
最低要件を満たすだけならば,以下の関数を定義するだけで足りる.実用上の利便を考えてランダムチョイスにしておいたけれど,別に先頭要素を返すだけでも構わない.
def arbitrary(*args)
args[rand(args.length)]
end
ひとつ気づいたことがあるので補足しておきたい.k.inaba 氏のアイデアは cointoss にしても either { ... } or { ... } 構文にしても,「どちらの文を実行しても構わない」という,どちらかと言えば「制御の流れ」に着目しているところがあるが,上の arbitrary() は「どちらの値をとっても構わない」という,どちらかと言えば「値」に着目しているところがある.なお,二項演算子 |?| は後者の立場に近いが,氏は cointoss に対する糖衣構文的に持ち出している点には注意すべきかもしれない.
たとえば,(あまり適切な例でないかもしれないが)以下のようなコードがあったとしよう.
void do_something(int n)
{
either {
for(int i = 0; i < n; i++) { ... }
}
or {
while(n-- > 0) { ... }
}
}
これを cointoss に置き換えることは容易だが,arbitrary() で置き換えるには,それぞれのブロックについて中身の処理を実行して無意味な値を戻すような関数を用意するか,以下のような少々不自然なコードを書かなければならない.
void do_something(int n)
{
if(arbitrary(true, false)) {
for(int i = 0; i < n; i++) { ... }
}
else {
while(n-- > 0) { ... }
}
}
ただし,上記の例を見てわかるように,cointoss は arbitrary() から容易に実装できるし,また逆もしかりなので,おそらくは本質的な問題ではないだろうと思われる.