tddbc お題
DESCRIPTION
TDDBC のお題ですTRANSCRIPT
お題1
FizzBuzz問題Write a program that prints the numbers from 1 to 100. But for multiples of three print “Fizz” instead of the number and for the multiples of five print “Buzz”. For numbers which are multiples of both three and five print “FizzBuzz”.
1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。
http://tickletux.wordpress.com/2007/01/24/using-fizzbuzz-to-find-developers-who-grok-coding/http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm
うるう年問題以下の3つのメソッドを持つMyYearクラスの実装について考えます。1. public MyYear(int year)整数の引数を持ち、その引数を保持する処理をする
2. public String toString()保持した値を文字列として返す
3. public boolean isLeap()保持した値がうるう年ならばtrueを返し、それ以外の時はfalseを返す
http://www.cs.is.saga-u.ac.jp/~nakayama07/sotsuken.html
お題2
お題 : LRU Cache
一定の数に達したら使われていない順に要素が削除されていく
Map のような入れ物を作りたい。
このため、 Last Recently Used (LRU) Cache を今回作成する。
キャッシュの最大サイズに達したときに、最も使われていないデータから順に消される Map のような仕組みがほしい。
例 :サイズが 2 の LRU Cache の場合
# 一つも使われてない場合は最初に追加したものから消えるlru.put(“a”, “dataA”);lru.put(“b”, “dataB”);lru.put(“c”, “dataC”);lru.get(“a”); #=> null
# get されたら使われたとみなすlru.put(“a”, “dataA”);lru.put(“b”, “dataB”);lru.get(“a”); #=> “dataA”lru.put(“c”, “dataC”);lru.get(“b”); #=> null
仕様変更その1
「いやー和田君、こないだの LRU Cache、だっけ?」「はい」「ステキなんだけど、もうちょっと便利にしたいなぁ」「はい (なんだろう…)」「キャッシュサイズをあとから変えたいんだ」「えっ」「キャッシュサイズ減らしてもちゃんと動いてほしい」「えっ」
仕様変更その2
「いやー和田君、こないだの LRU Cache、だっけ?」「はい」「ステキなんだけど、もっと意図を汲んで欲しいんだ」「はい (なんだろう…)」「一定時間経ったデータも消えて欲しいんだ」「えっ」
仕様変更その3
「いやー和田君、こないだの LRU Cache、好評だよ」「ありがとうございます」「ステキなんだけど、もっと意図を汲んで欲しいんだ」「はい (なんだろう…)」「同時アクセスが結構あるのでスレッドセーフがいいなぁ」「えっ」
お題3
s = FileStore.news.set(“foo”, “hoge”)s.get(“foo”) #=> “hoge”s.dump #=> “foo:hoge¥n”
s.set(“bar”, “fuga”)s.dump #=> “foo:hoge¥nbar:fuga¥n”
s.get(“toto”) #=> nil
s.set(nil, “momo”) # nil は何も起こらないs.set(“”, “gogo”) # 空文字列は何も起こらないs.dump #=> “foo:hoge¥nbar:fuga¥n”
s.set(“foo”, “piyo”)s.dump #=> “bar:fuga¥nfoo:piyo¥n”
仕様変更その1「いやー和田君、こないだの FileStore、だっけ?」「はい」「ステキなんだけど、もうちょっと便利にしたいなぁ」「はい (なんだろう…)」「一度に複数のペアを登録できた方がいいよね」「えっ」「一度に複数のペアも取得したいなぁ」「えっ」
void : set_multi(Map)Map : get_multi(Array)
s.set_multi({‘foo’ => ‘hoge’, ‘bar’ => ‘fuga’})s.get_multi([‘foo’, ‘bar’, ‘baz’]) #=> {‘foo’ => ‘hoge’, ‘bar’ => ‘fuga’}
仕様変更その2「いやー和田君、こないだの FileStore、だっけ?」「はい」「ステキなんだけど、もうちょっと便利にしたいなぁ」「はい (なんだろう…)」「キーワード置き換え機能が欲しいなぁ」「えっ」「特定の文字が渡されたら置き換えて欲しい」「えっ」
s.set(“foo”, “${now}”) #=> ${now}が現在時刻に置き換えられるs.get(“foo”) #=> “2010-07-10 14:19:12”
仕様変更その3「いやー和田君、こないだの FileStore、好評だよ」「ありがとうございます」「すごくステキなんだけど、もっと意図を汲んで欲しいんだ」「はい (なんだろう…)」「キャッシュに使いたいんだよ」「えっ?」「設定時に指定した時間が経過したら消えるようにして欲しい」「ええっ」
set(key, val, second) を実装せよ (相対時間)
set(key, val, Time) を実装せよ (絶対時間)
仕様変更まとめ# 仕様変更1
s.set_multi({‘foo’ => ‘hoge’, ‘bar’ => ‘fuga’})s.get_multi([‘foo’, ‘bar’, ‘baz’]) #=> {‘foo’ => ‘hoge’, ‘bar’ => ‘fuga’}
# 仕様変更2
s.set(“foo”, “${now}”) #=> ${now}が現在時刻に置き換えられるs.get(“foo”) #=> “2010-07-10 14:19:12” #=> では dump は?
# 仕様変更3
set(key, val, second=nil) を実装せよ (相対時間)
set(key, val, Time=nil) を実装せよ (絶対時間)
仕様変更その4「いやー和田君、こないだの FileStore、好評だよ」「ありがとうございます」「ステキなんだけど、もっと意図を汲んで欲しいんだ」「はい (なんだろう…)」「統計が取りたいなぁ」「えっ」「どのキーが何回引っかかったとか、何回引っかからなかったとか知りたいよねぇ」「えっ」
仕様変更その4Map : get_stats()戻り値は、統計名とその値をマッピングするディクショナリです。統計情報と関連付けられた意味:
hits: 結果がキャッシュ ヒットとなるキャッシュ取得リクエスト数。misses: 結果がキャッシュ ミスとなるキャッシュ取得リクエスト数。items: キャッシュ内のキー/値ペアの数。oldest_item_age: キャッシュ内の最も古いアイテムにアクセスがあったときからの秒数。新しいアイテムがアクセスされずにキャッシュに残る時間を示します。これはアイテムが 作成されてから経過した時間数ではありません。
お題4
お題 : ワードフィルタ
CL のネタバレを Twitter に post するひとは腹を切って死ぬべきである!!
ので、入力に NG ワードが含まれているかどうか調べる detect 機能, NG ワードを置き換える censor 機能を作りたい
例 : ‘Arsenal’ フィルタ
# メッセージフォーマット“ユーザ名: メッセージ”
filter = WordFilter.new(‘Arsenal’)
# detect #=> true/falsefilter.detect(“t_wada: 昨日のArsenal vs Chelsea 熱かった!”) #=> true;
filter.detect(“t_wada: ManU vs Liverpool はそうでもなかった”) #=> false;
# censor #=> Stringfilter.censor(“t_wada: 昨日のArsenal vs Chelsea 熱かった!”)
#=> “t_wada: 昨日の<censored> vs Chelsea 熱かった!”
仕様変更その1
「いやー和田君、こないだの WordFilter、だっけ?」「はい」「ステキなんだけど、もうちょっと便利にしたいなぁ」「はい (なんだろう…)」「やっぱ NG ワードは複数登録できた方がいいよね」「えっ」「あとから変更可能にもして欲しいな」「えっ」
仕様変更その2
「いやー和田君、こないだの WordFilter、だっけ?」「はい」「ステキなんだけど、ちょっとクレームがあってね…」「はい (なんだろう…)」「<censored>という文字列、変えられるようにして欲しいなぁ…」「えっ」
仕様変更その3
「いやー和田君、こないだの WordFilter、だっけ?」「はい」「ステキなんだけど、ちょっとクレームがあってね…」「はい (なんだろう…)」「ユーザ名は <censored>に引っかからないようにしてほしいなぁ…」「えっ」
仕様変更その4
「いやー和田君、こないだの WordFilter、だっけ?」「はい」「ステキなんだけど、もっと意図を汲んで欲しいんだ」「はい (なんだろう…)」「テキストファイル(メッセージログ)の検閲も行えるようにして欲しいんだよ」「えっ」
仕様変更その5「いやー和田君、こないだの WordFilter、好評だよ」「ありがとうございます」「ステキなんだけど、もっと意図を汲んで欲しいんだ」「はい (なんだろう…)」「統計が取りたいなぁ」「えっ」「どの言葉が何回引っかかったとか、誰が何回引っかかったとか知りたいよねぇ」「えっ」
例 : 仕様追加
#1 複数の NG ワードを指定できるようにするfilter = WordFilter.new(‘Arsenal’, ‘t_wada’)
#2 置き換え後文字列を変更可能に(コンストラクタを改造してもOK)
filter.censor(“t_wada: Arsenal!!”) #=> “t_wada: <XXX>!!”;
#3 ユーザ名は置き換えないfilter.censor(“t_wada: t_wadaって酔うとバカだよね”)
#=> “t_wada: <censored>って酔うとバカだよね”;
#4 テキストファイルメッセージ形式ユーザ名: メッセージ<改行(OS毎でOK)>
ユーザ名: メッセージ<改行(OS毎でOK)>