一反田えー〜千反田えるをワンライナーで書いてみる
Groovy の勉強がてらやってみた。
元ネタ:
環境は以下のとおり。
- Groovy 2.0.4
コード
(1..1000).each { println ( ( (it == 1000 ? '千' : '') + { x, unit -> x == 1 ? unit : x in 2..9 ? "${x}${unit}" : '' }.call((int)(it / 100), '百') + { x, unit -> x == 1 ? unit : x in 2..9 ? "${x}${unit}" : '' }.call(((int)(it / 10)) % 10, '十') + (it < 10 ? it : { x -> x != 0 ? x : '' }.call(it % 10)) ).tr('1-9', '一二三四五六七八九') + '反田' + [a:'えー', b:'びー', c:'しー', d:'でー', e:'いー', f:'えふ', g:'じー', h:'えいち', i:'あい', j:'じぇい', k:'けー', l:'える', m:'えむ', n:'えぬ', o:'おー', p:'ぴー', q:'きゅー', r:'あーる', s:'えす', t:'てぃー', u:'ゆー', v:'ぶい', w:'だぶりゅー', x:'えっくす', y:'わい', z:'ぜっと'][('a'..'z')[(it - 1) % 26]] ) }
これをワンライナーと言い張るよ!
数値 -> 漢字変換処理のセンスのなさに泣けてくるな。もっとエレガントにできないかな。
結果
一反田えー 二反田びー 三反田しー 四反田でー 五反田いー (略) 九百九十五反田じー 九百九十六反田えいち 九百九十七反田あい 九百九十八反田じぇい 九百九十九反田けー 千反田える
ウワーイ、無事表示されましたね。
名前変換をしなければこれだけ。
(1..1000).each { println it + '反田' + ('A'..'Z')[(it - 1) % 26] }
Groovy は楽でいいね。
まぁそもそもこのキャラの元ネタを知らないんだけれども。