Fork me on GitHub

2010/03/12

Recent entries from same category

  1. modeline内でfileencodingを指定出来るVimプラグイン書いた。 Hatena
  2. pluginフォルダは汚したくないが、使ってみたい。 Hatena
  3. Vimで外部ライブラリを複数個の引数で呼び出せるlibcallex.vim書いた。 Hatena
  4. Vimで動画再生 Hatena
  5. HTML更新時にブラウザをリロード Hatena

はてな
先日、「はてなFizzBuzzグループ」に入って、さっそくvimのFizzBuzzを書いたのですが...
2010-03-04 - mattnの日記 - fizzbuzzグループ
for v in range(1,100)|ec v%15?v%3?v%5?v :"Buzz":"Fizz":"FizzBuzz"|endfo
http://fizzbuzz.g.hatena.ne.jp/mattn/20100304
数日後にid:tyruさんにgolfで抜かされた!
Vim script - id:tyruが毎日FizzBuzzを一生懸命書く日記 - fizzbuzzグループ
for i in range(1,100)|ec[[i,"Buzz"],["Fizz","FizzBuzz"]][i%3<1][i%5<1]|endfo
http://fizzbuzz.g.hatena.ne.jp/tyru/20100310
これはくやしい!


ということで、もっかいFizzBuzzにチャレンジ。
ただこのgolf度はちょっとやそっとじゃ抜けないだろうし、そのままやっても面白くないのでFizzBuzzやめてBrainfuckやってみた。
コードはこんな感じ。
function! g:brainfuck(src)
  let vm = {
  \ 'pc' : 0,
  \ 'dc' : 0,
  \ 'src' : split(a:src, '\zs'),
  \ 'buf' : repeat([0], 65536),
  \}
  function! vm.op0() dict
    " NOP
  endfunction
  function! vm.op1() dict
    let self.dc += 1
  endfunction
  function! vm.op2() dict
    let self.dc -= 1
  endfunction
  function! vm.op3() dict
    let self.buf[self.dc] = self.buf[self.dc]+1
  endfunction
  function! vm.op4() dict
    let self.buf[self.dc] = self.buf[self.dc]-1
  endfunction
  function! vm.op5() dict
    echon nr2char(self.buf[self.dc])
  endfunction
  function! vm.op6() dict
    let self.buf[self.dc] = getchar()
  endfunction
  function! vm.op7() dict
    if self.buf[self.dc] != 0 | return | endif
    let self.pc += 1  
    let c = 0
    while c > 0 || self.src[self.pc] != ']'
      if self.src[self.pc] == '[' | let c += 1
      elseif self.src[self.pc] == ']' | let c -= 1 | endif
      let self.pc += 1  
    endwhile
  endfunction
  function! vm.op8() dict
    let self.pc -= 1  
    let c = 0
    while c > 0 || self.src[self.pc] != '['
      if self.src[self.pc] == ']' | let c += 1
      elseif self.src[self.pc] == '[' | let c -= 1 | endif
      let self.pc -= 1  
    endwhile
    let self.pc -= 1  
  endfunction

  let m = "><+-.,[] \n\t"
  for c in map(range(len(m)), '[m[v:val], v:val<8?v:val+1 :0]')
    let vm[c[0]] = eval('vm.op'.c[1])
  endfor
  while vm.pc < len(vm.src)
    call vm[vm.src[vm.pc]]()
    let vm.pc += 1
  endwhile
endfunction
com! -nargs=+ BF call g:brainfuck(<q-args>)
コマンド定義してあるので、vimで編集中に疲れたら何時でも
:BF ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
Hello World!
とかやって遊べるので便利ですね!
またグローバルスコープ関数にしてあるので、何時でも呼び出し可能です!

call g:brainfuck(
\ "++++++[->++++> >+>+>-<<<<<]>[<++++> >+++>++++> >+++>+++++>++"
\."+++> > > > > >++> >++<<<<<<<<<<<<<<-]<++++>+++>-->+++>-> >--"
\."->++> > >+++++[->++>++<<]<<<<<<<<<<[->-[> > > > > > >]>[<+++"
\.">.>.> > > >..> > >+<]<<<<<-[> > > >]>[<+++++>.>.>..> > >+<]>"
\." > > >+<-[<<<]<[[-<<+> >]> > >+>+<<<<<<[-> >+>+>-<<<<]<]>>[["
\."-]<]>[> > >[>.<<.<<<]<[.<<<<]>]>.<<<<<<<<<<<]"
\)

こんな風に呼び出せば...
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz
便利です!お役立て下さい!

はじめてのvi&Vim (エッセンシャルソフトウェアガイドブック) はじめてのvi&Vim (エッセンシャルソフトウェアガイドブック)
小島 範幸
技術評論社 / ¥ 2,289 (2009-04-17)
 
発送可能時間:在庫あり。

Posted at 00:55 in ソフトウェア::vim | WriteBacks (1) | Edit
Tagged as: brainfuck, fizzbuzz, vim
Bookmarks: add to hatena add to hatena | add to delicious.com | add to livedoor.clip add to livedoor.clip | add to buzzurl add to buzzurl | add to fc2bookmark add to fc2bookmark | add to Yahoo Bookmark add to Yahoo Bookmark | add to Pookmark add to Pookmark

blog comments powered by Disqus
WriteBacks

熱愛発覚!上原多香子の衝撃動画!

SPEEDの上原多香子に熱愛発覚!新恋人と交際中!

Posted by 【SPEED】 上原多香子に新恋人 【お泊り愛】 at 2010/03/13 (Sat) 17:38:47

TrackBack ping me at
Post a comment

writeback message: Ready to post a comment.