Google Code Jam 2011 決勝 A, B やってみた。

http://code.google.com/codejam/japan/contests.html

時間がとれたので、やってみた。どちらも、large通ったけど、解説読んでないから、完全に正しい保証はない(多分あってると思うけど、例外処理とか

A

予想をつけて、小さい問題サイズで正しいことを確認。直観的ではある。

import Control.Monad
import Text.Printf
import Data.List

f :: Num a => [a] -> a
f xs = sum $ zipWith (*) xs (tail xs)

g :: [a] -> [a] -> [a] -> ([a], [a])
g ls rs [] = (ls,rs)
g ls rs [x] = (x:ls,rs)
g ls rs (x:y:zs) = g (x:ls) (y:rs) zs

h :: [Integer] -> Double
h xs = (c*).fromIntegral $ f (x: reverse ls) + f (x: reverse rs) + (head ls) * (head rs)
    where (x:xs') = reverse.sort $ xs
          (ls,rs) = g [] [] xs'
          c = (/2).sin $ 2 * pi / (fromIntegral $ length xs)

-- output and input function
main :: IO ()
main = do [t] <- getList :: IO [Int]
          forM_ [1..t] $ \i -> do
            _ <- getLine
            xs <- getList :: IO [Integer]
            printf "Case #%d: %f\n" i $ h xs

getList :: Read a => IO [a]
getList = liftM (map read.words) getLine

B

Project Eulerで似たような問題をやったことがあったので、それを思い出しながら。
配列使うのが面倒だったので、メモ化再帰。だから少し遅い。毎回素因数分解してるし。

import Control.Monad
import Text.Printf
import Data.List
import ONeillPrimes (primes)
import Data.MemoTrie

-- a^n (mod p)
powMod :: (Integral a, Integral b) => a -> b -> a -> a
powMod a n p | n == 0 = 1
             | even n = powMod (mod (a*a) p) (div n 2) p
             | otherwise = (a * powMod a (n-1) p)`mod` p

factors :: Integer -> [(Integer, Int)]
factors n = map (\xs -> (head xs, length xs)).group $ f n primes
    where f _ [] = []
          f m (p:ps) | p*p > m = [m]
                     | m `mod` p == 0 = p:f(div m p) (p:ps)
                     | otherwise = f m ps

totient :: Integer -> Integer
totient n = product [(p-1) * p ^ (k-1) | (p, k) <- factors n]

f, memoF :: Integer -> Integer -> Integer -> Integer
f x 0 m = x `mod` m
f x _ 1 = 0
f x _ 2 | odd x  = 1
        | even x = 0
f x n m | mod x m == 0 = 0
f x n m | x < s     = f (x^x) (n-1) m 
        | c == 1    = 0
        | otherwise =  (`mod` m) $ (a ^ s * (powMod a (mod (b-s) m') c))
    where a = memoF x (n-1) m
          b = memoF x (n-1) m'
          c = g x m
          m' = totient c
          s = h x (m `div` c)
memoF = memo3 f

g, h :: Integer -> Integer -> Integer
g x m = product [p ^ k | (p, k) <- factors m, mod x p /= 0]
h x c = toInteger.succ.length.takeWhile (\y -> y `mod` c /= 0) $ iterate (*x) x

-- output and input function
main :: IO ()
main = do [t] <- getList :: IO [Int]
          forM_ [1..t] $ \i -> do
            (x:n:m:_) <- getList :: IO [Integer]
            printf "Case #%d: %d\n" i $ memoF x n m

getList :: Read a => IO [a]
getList = liftM (map read.words) getLine

国の健康保険が充実していて、民間の医療保険に加入する気が失せた。

保険の知識ゼロなので、医療保険について調べてみた。

Conclusion

独身で会社勤めの自分には国の健康保険で十分。


根拠は以下より引用。
http://39saku39saku.blog129.fc2.com/blog-entry-117.html

会社員のほとんどが加入している健康保険は、驚くほど保障が充実しています。
1ヶ月の医療費がどれだけ高額になっても8万+αで済む「高額療養費制度」。
約8割の企業や健保で採用されている「一部負担還元金」(医療費が100万円かかっても、実質負担が約数万円で済む例も)。
病気で会社を休んでも、最長1年6ヵ月間は給料の3分の2が支払われる「傷病手当金」などがあります。
これらは健康保険組合のホームページ等で「保険給付一覧」に書いてあります。
分からなかったら健康保険組合に聞くと教えてくれます。


以下、上の結論にたどりつくまでの流れ。

What's my situation?

現在は医療保険料は月々4,000円。


年間5万円か…
ちょっと高くない?


さて、一体全体、私は何の保険に入っているのか?話はそれからだ。


たぶん、コレ。医療・生命共済。
http://www.saitama-kyosai.or.jp/kyosai/seimei/index.html
内容。月々2000円。昨年は割戻率36%。ってことは約1300円。


入院1日 8,000円。
入院手術 50,000円。
外来手術 10,000円。
重度障害(事故) 1,000万円。
重度障害(病気) 400万円。
死亡(事故) 1,000万円。
死亡(病気) 400万円。


コレを2口加入しているワケか。

Is there any other choice?

他の保険はどうなのよ。
近くにある別の共済保険を見てみる。


月々2000円。


入院1日 5,000円。
手術 5〜25万円。
死亡 100万円。
障害 10万円。
通院1日 3,000円。


あれ、県民共済のほうが安くね?

I've reached a conclusion?

全然高くなんかなかったよ!
変更する必要ないね!


だが、ちょっと待って欲しい。
今回のスタート地点は
「月々4000円の保険料は高いのでは?」
である。
そして、今たどり着いたのは
「今、加入している保険は他の保険と比べても、だいぶ安い」
という所である。


つまり最初の問いに対して部分的な回答にしかなっていない。
すなわち、保険に加入する場合は今のままで良い。
しかし、保険に加入しないという選択肢も考慮すべきである。

I've already had a health insurance!

っていうか、国の健康保険にすでに(強制的に)加入しているではないか!
でも、それって、医療費の3割を負担するってヤツでしょ?


そうじゃないって話を聞いたことがある。調べてみた。


以下
http://39saku39saku.blog129.fc2.com/blog-entry-117.html
より、引用。

会社員のほとんどが加入している健康保険は、驚くほど保障が充実しています。
1ヶ月の医療費がどれだけ高額になっても8万+αで済む「高額療養費制度」。
約8割の企業や健保で採用されている「一部負担還元金」(医療費が100万円かかっても、実質負担が約数万円で済む例も)。
病気で会社を休んでも、最長1年6ヵ月間は給料の3分の2が支払われる「傷病手当金」などがあります。
これらは健康保険組合のホームページ等で「保険給付一覧」に書いてあります。
分からなかったら健康保険組合に聞くと教えてくれます。


(高額医療費制度については
http://www.mhlw.go.jp/bunya/iryouhoken/iryouhoken13/dl/100714a.pdf

この制度を使用するときは会社の健康保険組合に申請すると良いらしい。(はじめから支払い額が少なくなる、還付手続不要)
http://39saku39saku.blog129.fc2.com/blog-entry-95.html
http://diamond.jp/articles/-/10653?page=4


というか、埼玉県民共済のサイトに分かりやすくのってた。
http://www.saitama-kyosai.or.jp/kyosai/mame_chishiki/mame_seimei01.html
(上でも、触れらているが先進医療は健康保険が使えない。先進医療については以下で
http://diamond.jp/articles/-/10997
ポイントは3つで。

  • 優れているとは限らない
  • みんなが受けるものではない
  • 費用が高いとは限らない


うん、国の健康保険で十分じゃね?

Conclusion

独身で会社勤めの自分には国の健康保険で十分。


#さーて、浮いた5万円で何買おうかなあw

Google Code Jam Japan 2011 の予選Cの問題文が短かったのでやってみた。

やってみた。Haskellで。

import Control.Monad (forM_, liftM)
import Text.Printf (printf)
import Data.List (unfoldr)

f :: Integer -> Integer -> (Integer, Integer)
f 0 0 = (2, 1)
f 0 1 = (1, 0)
f 1 0 = (1, 1)
f 1 1 = (2, 1)

count :: Integer -> Integer -> Integer -> Integer
count s c 1 = s-c+1
count s c n = count (s+t) d q
    where (q,r) = divMod n 2
          (t,d) = f c r

-- output and input function
main :: IO ()
main = do [t] <- getList :: IO [Int]
          forM_ [1..t] $ \i -> do
            [n] <- getList :: IO [Integer]
            printf "Case #%d: %d\n" i $ count 0 0 n

getList :: Read a => IO [a]
getList = liftM (map read.words) getLine

予選の次がもう決勝なのね、今回は。

今日のお勉強メモ

# なぜか、はじめのほうのメモが英語。多分、スペルミスがあるんじゃないカナ。

待ち行列のお勉強をした。いままで、行列といえば、Matrixだったけど、今日はQueueのほう。

Traffic, QoS (quality of services)

  • Performance measure
    • throughput
    • transmission delay
    • packet loss probability
  • Contradiction
    • 高速大容量 <-> 低料金
    • transmission delay <-> packet loss prob.
  • Performance evaluation
    • queueing theory (teletraffic theory)
  • Queueing Model
    • 到着過程/サービス時間分布/サーバー数/システム容量
  • リトルの公式 L=λW

(まぁ、直感的には自明だよね。)

  • Poisson distribution

ここらへんで、特性関数ってなんだっけとなる。フーリエ変換でした。
たしか、密度関数の合成が、フーリエ領域では畳込みになったはず。


ネットワークの性能評価の簡単な論文を読んだ。こういうふうに使うのねって、雰囲気だけ分かったつもり。


{研究, 何やりたいか}紹介の準備。やっぱり、発表は難しいですよ。

強化学習の本をちょっとだけ読んだ。

ε Greedy法。名前見たとき、Greedyなら微小量εじゃなくて、もっとたくさんいけよ、と思った。
まだ、中身見てない。


どちらにも「マルコフ」って単語がチラッと見えた。マルコフっていろんなところにでてくるよなあ。

やっぱり、新しいことを勉強するのは楽しい。

# 午後は猛烈に眠かった。やっぱり、もう少し睡眠時間が必要だな。

EmacsでUrlをChromiumで開く

理由は分からないが,なぜかEmacsがurlを(インストールしていない)lynxで開こうとするので,
ちょっと調べた.

EmacsWikiには "chromium-browser"とありましたが,"chromium"で動きました.
http://www.emacswiki.org/emacs/BrowseUrl#toc9

;; chromiumでurlを開く
(setq browse-url-browser-function 'browse-url-generic
      browse-url-generic-program "chromium")

Realforce買ったよ(一ヵ月半前ぐらいに)

ついに念願のRealforceを手に入れたぞ!

約1ヶ月半ほど前に購入したのは英語キーボードのテンキーレスで静音モデル
Realforce 87UB SE170S http://www.archisite.co.jp/topre_se170s.htm
です.
修論書き終わったし,とかいう謎の理由で2月のはじめごろに購入.
勢いで買った後悔はしていない.


到着時の様子

箱がけっこう大きい。

と思ったら、緩衝材などがたくさんつまっていた。
で、Realforce自体の箱はこんなもん。やはり、配送用の箱がデカイ。そういえば、「大きいことはいいことだ」というセリフもあるな。


最近 Made in Japanをあんまり見なくなった気がする。

肝心のキーボードはこんな感じ。




数あるRealforceの中でなぜこのモデルなのか?

理由

  • 英語キーボードが欲かった.
    • 日本語キーボードは余分なキーが多い,それらのキーにショートカットを割り当てれば良いという意見もあるが,メンドウ.
  • テンキーはいらない.
  • 静電容量無接点式が欲かった.
  • 可能ならば静かなほうが良い.

じゃあ,なぜHappy Hacking Keyborad(HHKB)じゃないの?

あれは特殊すぎる,Linuxしか使わないなら問題ないと思うけど,
Windows環境で使うにはちょっと苦労が多そう.
とくにF1〜F12,矢印をファンクションキーと組合せないと押せないのは不便(と思った).
そして,そのファンクションキーは右シフトのさらに右にある.
ファンクションキーをほとんど使用しないならば,何も問題ないと思うけど,
端末とEmacsvimぐらいしか使用しないならば,HHKBにしてもよかったと思う.
しかし,Windowsのアプリケーション(ゲームともいう)を使用するときは
大抵,F1〜F12や矢印,シフト+F1〜F12とかを良く使う(気がする).

で,Realforceはどうなのよ?

まず,はじめに言っておくと僕のタイピングスピードは遅い.
つまり,高速タイピスト的視点はまったくない.
購入したRealforce,満足しています.キーが軽い,やわらかい.
「ストトトトト」と入力できる感じ.
そして,長時間使用しても疲れにくい.そりゃ,人間なんだから疲れますよ,生きていれば.
ただ,指の負担は非常に少ない気がする.気がするだけかもしれないけど.
静音性は,まあこんなもんか,って感じ,完全な主観だけど.
というか静音でないRealforceの音を良く知らないので判断できない.
あくまで,静音であって,無音ではない.しかし,何回か静音でないRealforce
試し打ちしたことがあるけど,キーが戻るときに比較的,耳につく高めの音がした
記憶があるけれど,それが静音版だと音はするけど,あまり耳に残らないというか,
気に障らないというか,そんな感じ.
テメーの説明分からねーよ,って人はリンク先の動画を見るよろし.
http://www.archisite.co.jp/topre_se170s.htm

DIPスイッチ!?

CtrlはAの左じゃないとダメみたいな,駄々っ子の方もいらっしゃるでしょうが,そんな人でも安心です.
まあ,僕も駄々っ子なわけですが…
このキーボード裏にスイッチがあって,CtrlとCapsLockを入れ替えられたり,NumLockを無効にできたりと
痒いところに手がとどくようになっている.やっぱり,「CtrlはAの左」が正義である.
しかも,CtrlとCapsLockを入れ替えたとき用に交換用キートップとキー交換用具
(といっても,単なるU字型の金属)が付属しています.さすがTopre!わかってる!
(でも、キートップなかなか外れなくて、交換が結構大変だった。)
これ以外にも赤いEscや青い(どちらかというと水色?)のW,A,S,Dのキートップが付属していました.
こっちは使ってないけど.


あと,ちなみに普通のキートップは墨色(黒と灰色の中間?)に黒で文字が印字されています.
これを見にくいととるか,カッコイイととるかは人それぞれだと思います.
え?何,そりゃモチロン カッコイイ派ですけどね,僕は.


不満点とかないの?

僕にとってほぼ完全無欠に近いRealforce 87U SE170Sであるが
使いずらい点が1点だけある.しかし,これはどうしようもないし,
買う前に検討すべきだった点である.
それは,
バックスラッシュキーの位置である.
これはこのキーボード特有のことではなく,一般的な英語キーボードにおける
(僕個人が感じている)問題である.
個人的にはこのキーが(FxやEsc,PrintScreen,Homeなどを除いて)一番遠いところにあると思う.
上から2段目の右端にそいつはいるのだが,どう見てもBackSpace,Enterよりもキーが小さい,
Ctrlとは同じ大きさではあるが,Ctrlは左にもあるし,そっちをメインに使用するので問題ない.
普段はバックスラッシュなんか,ほとんど使用しないわけだが,tex使って文章を作成するときに
多用する.もう,バックスラッシュ打ちまくり,そして,僕の右小指が遠征しまくり.
右の小指が長い人なら楽々なんだろうが,僕は(多分)右の小指が平均より短いと思われ
この出張が結構負担である,というかイチイチそこまで行くのが面倒.
日本語キーボードを使っていたときは,「?/」の右にあるキーで打てたので,
手を少し動かせば,難なくバックスラッシュを打つことができた.
が,しかし,今はである.今は約3倍(当社比)以上もの距離を右小指が旅をしなくては,
目的のバックスラッシュキーには辿りつけないのである.
これはいかんともしがたい問題である.
そのため,毎日小指が長くなる体操をしている始末である.
勿論,嘘.

このバックスラッシュキーが押しにくいことを除けば不満点は何もない.
ただ,これが結構イタイ.
でもどうにもならんしなあ.
確かにキーを入れ替えるのは1つの手ではある.しかし,入れ替える先のキーが思いつかない.
標準からあんまりいろいろ変えると,後で大変だし(予想).

最後に一点,Windows 7で日本語入力時に英語配列で入力するのには
レジストリの設定が必要でした.なんでわざわざ,レジストリ書き換える必要があるのかと.
GUIで設定できるようにして欲しい.これだと,日本語配列キーボードを接続したときは
またレジストリを書き換えないといけない.面倒である.Linuxみたいに
setxkbmap us or setxkbmap jp
で切り替えられたら楽なのに.まあ,別のキーボードを接続したことはまだ無いんですけどね.

結論

Realforce 87UB SE170Sは良いキーボードである.
英語配列でテンキーレスを考えているならば,考慮に値する.
静音性は自分の耳で確かめて.
DIPスイッチが地味に便利.
ただしバックスラッシュは遠い(主観).
そして,値段は高い.

実は最後が最も重要かも.

いくらなんでも,キーボードに2万以上はキツい.
しかし,修論提出直後等だと,脳がイイ感じに疲れているので,
判断能力が通常時に比べ,鈍っているのかも.



以上、長文・駄文終了。