vimでfizzbuzzをやってみた
vimscriptを使ってfizzbuzzをやってみました。
情けないコードを晒すのはすごくの恥ずかしいですが、取り組んだ事は公開していきたいと思います。
リファクタリングや指摘など大歓迎なので、ちょっとでも気になった事は突っ込んでいただけるとうれしいです。
FizzBuzz問題のルール【はてなキーワードから引用】
1 から順に数を数えていく。但し、その数が 3 で割り切れるならば数字の代わりに Fizz と、5 で割り切れるなら Buzz と言うゲーム。3 でも 5 でも割り切れる場合は、FizzBuzz の順に言う。
作ったコード
1.ifとwhileだけ版
function! FizzBuzz() let i_cnt = 1 while i_cnt <= 50 if i_cnt % 3 == 0 if i_cnt % 5 == 0 echo "fizzbuzz" else echo "fizz" endif elseif i_cnt % 5 == 0 if i_cnt % 3 == 0 echo "fizzbuzz" else echo "buzz" endif else echo i_cnt endif let i_cnt += 1 endwhile endfunction
2.配列とイテレータを使った版
function! FizzBuzzList() let num_list = range(1,50) for num_cnt in num_list if num_cnt % 3 == 0 && num_cnt % 5 == 0 echo 'fizzbuzz' elseif num_cnt % 5 == 0 echo 'buzz' elseif num_cnt % 3 == 0 echo 'fizz' else echo num_cnt endif endfor endfunction
あとfilter版と無名関数版は取り組んだのですが、まだ未完成です。
反省と感想
全然綺麗に書けなくて、頭が固い事こととアルゴリズムを知らなさ過ぎる点を再認識しました…
こうなりゃ、どう書く?orgに参加し、質の高いコードを拝見したり実際に取り組んでみて、
基礎レベルを自分のコードとの比較なども行うのが良い気がしてきた。Rubyとvimscriptで挑戦します。
今、かなりモチベーションがあがってきたがします。
【どう書く?org】
http://ja.doukaku.org/
あと、ListやDictonaryについてヘルプを見ていたら、selfか無名関数について記載がありました。
これがvim7はpythonっぽい表現ができると言われてた点なのでしょうか??是非使ってみたい機能です。
今日の発見
- vimのList&Dictはイテレータが使用できる
- try/catchも使えるみたい
- selfが使える
- 省略形もあるが、中途半端だとわかりにくい。例:elseiやendfoやbrea(elseifとendforとbreakの省略)
- filter関数の使い方(これを使ってfizzbuzzの完成はできていません。)
filterを使った例
let unmatch_list = filter(range(1,50),'v:val % 3 != 0 && v:val % 5 != 0')