tddbc お題

26
お題1

Upload: takuto-wada

Post on 29-Nov-2014

6.352 views

Category:

Technology


19 download

DESCRIPTION

TDDBC のお題です

TRANSCRIPT

Page 1: TDDBC お題

お題1

Page 2: TDDBC お題

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

Page 3: TDDBC お題

うるう年問題以下の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

Page 4: TDDBC お題

お題2

Page 5: TDDBC お題

お題 : LRU Cache

一定の数に達したら使われていない順に要素が削除されていく

Map のような入れ物を作りたい。

このため、 Last Recently Used (LRU) Cache を今回作成する。

キャッシュの最大サイズに達したときに、最も使われていないデータから順に消される Map のような仕組みがほしい。

Page 6: TDDBC お題

例 :サイズが 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

Page 7: TDDBC お題

仕様変更その1

「いやー和田君、こないだの LRU Cache、だっけ?」「はい」「ステキなんだけど、もうちょっと便利にしたいなぁ」「はい (なんだろう…)」「キャッシュサイズをあとから変えたいんだ」「えっ」「キャッシュサイズ減らしてもちゃんと動いてほしい」「えっ」

Page 8: TDDBC お題

仕様変更その2

「いやー和田君、こないだの LRU Cache、だっけ?」「はい」「ステキなんだけど、もっと意図を汲んで欲しいんだ」「はい (なんだろう…)」「一定時間経ったデータも消えて欲しいんだ」「えっ」

Page 9: TDDBC お題

仕様変更その3

「いやー和田君、こないだの LRU Cache、好評だよ」「ありがとうございます」「ステキなんだけど、もっと意図を汲んで欲しいんだ」「はい (なんだろう…)」「同時アクセスが結構あるのでスレッドセーフがいいなぁ」「えっ」

Page 10: TDDBC お題

お題3

Page 11: TDDBC お題

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”

Page 12: TDDBC お題

仕様変更その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’}

Page 13: TDDBC お題

仕様変更その2「いやー和田君、こないだの FileStore、だっけ?」「はい」「ステキなんだけど、もうちょっと便利にしたいなぁ」「はい (なんだろう…)」「キーワード置き換え機能が欲しいなぁ」「えっ」「特定の文字が渡されたら置き換えて欲しい」「えっ」

s.set(“foo”, “${now}”) #=> ${now}が現在時刻に置き換えられるs.get(“foo”) #=> “2010-07-10 14:19:12”

Page 14: TDDBC お題

仕様変更その3「いやー和田君、こないだの FileStore、好評だよ」「ありがとうございます」「すごくステキなんだけど、もっと意図を汲んで欲しいんだ」「はい (なんだろう…)」「キャッシュに使いたいんだよ」「えっ?」「設定時に指定した時間が経過したら消えるようにして欲しい」「ええっ」

set(key, val, second) を実装せよ (相対時間)

set(key, val, Time) を実装せよ (絶対時間)

Page 15: TDDBC お題

仕様変更まとめ# 仕様変更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) を実装せよ (絶対時間)

Page 16: TDDBC お題

仕様変更その4「いやー和田君、こないだの FileStore、好評だよ」「ありがとうございます」「ステキなんだけど、もっと意図を汲んで欲しいんだ」「はい (なんだろう…)」「統計が取りたいなぁ」「えっ」「どのキーが何回引っかかったとか、何回引っかからなかったとか知りたいよねぇ」「えっ」

Page 17: TDDBC お題

仕様変更その4Map : get_stats()戻り値は、統計名とその値をマッピングするディクショナリです。統計情報と関連付けられた意味:

hits: 結果がキャッシュ ヒットとなるキャッシュ取得リクエスト数。misses: 結果がキャッシュ ミスとなるキャッシュ取得リクエスト数。items: キャッシュ内のキー/値ペアの数。oldest_item_age: キャッシュ内の最も古いアイテムにアクセスがあったときからの秒数。新しいアイテムがアクセスされずにキャッシュに残る時間を示します。これはアイテムが 作成されてから経過した時間数ではありません。

Page 18: TDDBC お題

お題4

Page 19: TDDBC お題

お題 : ワードフィルタ

CL のネタバレを Twitter に post するひとは腹を切って死ぬべきである!!

ので、入力に NG ワードが含まれているかどうか調べる detect 機能, NG ワードを置き換える censor 機能を作りたい

Page 20: TDDBC お題

例 : ‘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 熱かった!”

Page 21: TDDBC お題

仕様変更その1

「いやー和田君、こないだの WordFilter、だっけ?」「はい」「ステキなんだけど、もうちょっと便利にしたいなぁ」「はい (なんだろう…)」「やっぱ NG ワードは複数登録できた方がいいよね」「えっ」「あとから変更可能にもして欲しいな」「えっ」

Page 22: TDDBC お題

仕様変更その2

「いやー和田君、こないだの WordFilter、だっけ?」「はい」「ステキなんだけど、ちょっとクレームがあってね…」「はい (なんだろう…)」「<censored>という文字列、変えられるようにして欲しいなぁ…」「えっ」

Page 23: TDDBC お題

仕様変更その3

「いやー和田君、こないだの WordFilter、だっけ?」「はい」「ステキなんだけど、ちょっとクレームがあってね…」「はい (なんだろう…)」「ユーザ名は <censored>に引っかからないようにしてほしいなぁ…」「えっ」

Page 24: TDDBC お題

仕様変更その4

「いやー和田君、こないだの WordFilter、だっけ?」「はい」「ステキなんだけど、もっと意図を汲んで欲しいんだ」「はい (なんだろう…)」「テキストファイル(メッセージログ)の検閲も行えるようにして欲しいんだよ」「えっ」

Page 25: TDDBC お題

仕様変更その5「いやー和田君、こないだの WordFilter、好評だよ」「ありがとうございます」「ステキなんだけど、もっと意図を汲んで欲しいんだ」「はい (なんだろう…)」「統計が取りたいなぁ」「えっ」「どの言葉が何回引っかかったとか、誰が何回引っかかったとか知りたいよねぇ」「えっ」

Page 26: TDDBC お題

例 : 仕様追加

#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)>