一反田えー〜千反田えるをワンライナーで書いてみる

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 は楽でいいね。

まぁそもそもこのキャラの元ネタを知らないんだけれども。