おもいっきり間違ってる。
後で直します。
追記2
直した。
vimも負けません。
そろそろ FizzBuzz に飽きた - にぽたん研究所Lingua::JA::Numbers無いなら作ります。
もちろんHiraganaだけですが...
scriptencoding utf-8
silent! unlet s:ndg
let s:ndg = [
\ {0: ''},
\ {0: 'じゅう'},
\ {0: 'ひゃく', 3: 'ぴゃく', 6: 'ぴゃく', 8: 'ぴゃく'},
\ {0: 'せん', 3: 'ぜん'},
\ ]
silent! unlet s:dig
let s:dig = [
\ {0: ''},
\ {0: 'まん'},
\ {0: 'おく'},
\ {0: 'ちょう'},
\ {0: 'けい'},
\ {0: 'がい'},
\ {0: 'じょ'},
\ {0: 'じょう'},
\ {0: 'こう'},
\ {0: 'かん'},
\ {0: 'せい'},
\ {0: 'さい'},
\ {0: 'ごく'},
\ {0: 'こうがしゃ'},
\ {0: 'あそうぎ'},
\ {0: 'なゆた'},
\ {0: 'ふかしぎ'},
\ {0: 'むりょうたいすう'}
\ ]
silent! unlet s:num
let s:num = [
\ {0: 'ぜろ'},
\ {0: 'いち'},
\ {0: 'に'},
\ {0: 'さん'},
\ {0: 'よん'},
\ {0: 'ご'},
\ {0: 'ろく', 3: 'ろっ'},
\ {0: 'なな'},
\ {0: 'はち', 3: 'はっ', 4: 'はっ'},
\ {0: 'きゅう'}
\ ]
" return japanese numeric string from 'num'
function! s:num2ja(num)
let str = "" . a:num
let len = len(str)
if str == 0
return s:num[0][0]
endif
if len >= 17*4+1
return s:dig[17][0]
endif
let n = 0
let ret = ""
while n < len
if str[n] != 0 && (str[n] != 1 || (len-n)%4 == 1)
let ret .= has_key(s:num[str[n]], len-n) ?
\ s:num[str[n]][len-n] : s:num[str[n]][0]
endif
if str[n] != 0
let ret .= has_key(s:ndg[(len-n-1)%4], str[n]) ?
\ s:ndg[(len-n-1)%4][str[n]] : s:ndg[(len-n-1)%4][0]
let ret .= has_key(s:dig[(len-n-1)/4], str[n]) ?
\ s:dig[(len-n-1)/4][str[n]] : s:dig[(len-n-1)/4][0]
endif
"echo ret
let n = n + 1
endwhile
return ret
endfunction
" generate array from 'start' to 'end'
function! s:gen_array(start, end)
let ret = []
let n = a:start
while n <= a:end
call add(ret, n)
let n = n + 1
endwhile
return ret
endfunction
for n in s:gen_array(1, 40)
echo (!(n % 3) || n =~ '3') ? s:num2ja(n) : n
endfor
期待する結果:
:so NabeAtzz.vim
1
2
さん
4
5
ろく
7
8
きゅう
10
11
じゅうに
じゅうさん
14
じゅうご
16
17
じゅうはち
19
20
にじゅういち
22
にじゅうさん
にじゅうよん
25
26
にじゅうなな
28
29
さんじゅう
さんじゅういち
さんじゅうに
さんじゅうさん
さんじゅうよん
さんじゅうご
さんじゅうろく
さんじゅうなな
さんじゅうはち
さんじゅうきゅう
40
dankogai++ nipotan++ bram++