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

最後に

ぷちKPT

  • KEEP【良かった事、続けていきたい事】
    • fizzbuzzできた。
    • vimscriptの基本的な構文がわかった。
    • ヘルプ活用
    • 取り組みができた。
  • PROBLEM【悪かったこと、改善したい事】
    • アルゴリズムがわからない
    • 取り組みが日曜日の夜になってしまった。(余裕を持って取り組まなかった)
    • vimscriptを書く時の効率が良いデバッグ方法(Try&Next)がわからなかった。(コマンドモードで実行している)
  • TRY【今後取り込みたいこと】
    • どう書く.orgの問題を解く。
    • どう書く.orgの綺麗なコードや良いアルゴリズムを学ぶ。
    • vimscriptのListやDict型を利用した書き方(関数やテクニック)を学ぶ。