2012/05/18


逆FizzBuzz問題 (Inverse FizzBuzz) - 猫とC#について書くmatarilloの雑記

逆FizzBuzz問題 (Inverse FizzBuzz) General | Inverse Fizzbuzz - just another scala quant を日本語にしました。 ちなみに...

http://d.hatena.ne.jp/matarillo/20120515/p1
逆FizzBuzzって、オートマトンなので正規表現を使うと楽に出来るはず。 #!perl
use strict;
use warnings;
use Test::More;

sub inv_fizzbuzz {
  my ($fz$n$pat) = (''1join ',*?'@_);
  while (1) {
    $fz .= $n % 15 > 0 ?
             $n % 3 > 0 ?
               $n % 5 > 0 ?
                 ',''buzz,''fizz,''fizzbuzz,';
    if ($fz =~ /,($pat)/) {
      my $rhs = $1;
      my $lhs = substr($fz0index($fz$rhs) + 1);
      $lhs =~ s/(fizz|buzz)//g;
      $rhs =~ s/(fizz|buzz)//g;
      $lhs = length($lhs);
      $rhs = $lhs + length($rhs||'');
      return [$lhs$rhs];
    }
    $n++;
  }
}

is_deeply(inv_fizzbuzz('fizz'), [33]);
is_deeply(inv_fizzbuzz('buzz'), [55]);
is_deeply(inv_fizzbuzz('fizz''buzz'), [35]);
is_deeply(inv_fizzbuzz('buzz''fizz'), [56]);
is_deeply(inv_fizzbuzz('fizz''fizz''buzz'), [610]);
is_deeply(inv_fizzbuzz('fizz''fizz'), [69]);
is_deeply(inv_fizzbuzz('fizz''buzz''fizz'), [36]);
is_deeply(inv_fizzbuzz('fizzbuzz''fizz'), [1518]);

done_testing;
追記1
Vimだとこうか?
functions:inv_fizzbuzz(...)
  let [fz, np= [''1join(a:000',\{-}')]
  while 1
    let fz .= n%15>0?n%3>0?n%5>0?",""buzz,""fizz,""fizzbuzz,"
    let m = matchstr(fz, p)
    if len(m) > 0
      let lhs = len(split(fz[:stridx(fz, m)-1], ','1))
      return [lhs, lhs + len(split(m, ','1))-1]
    endif
    let n += 1
  endwhile
endfunction

追記2
ちょっと改良。方針は変わってない。
#!perl
use strict;
use warnings;
use Test::More;

my $gs = 'AAFAABAFAAAFABAAFAAAZ';

sub inv_fizzbuzz {
  my ($fz$n$pat) = (''1,
    join('A*?'map({fizz=>'F'buzz=>'B'fizzbuzz=>'Z'}->{$_}, @_)));
  my $m;
  while (1) {
    $fz .= $n % 15 > 0 ?
             $n % 3 > 0 ?
               $n % 5 > 0 ?
                 'A''B''F''Z';
    last if length($fz) > length($gs) * length(@_);
    if ($fz =~ /^.*($pat)$/) {
      my $rhs = $1;
      my $lhs = substr($fz0rindex($fz$rhs) + 1);
      $m = [$lhs$rhsif !defined($m) || length(@{$m}[1]gt length($rhs);
    }
    $n++;
  }
  return [] unless $m;
  
  my ($lhs$rhs) = @{$m};
  $lhs = length($lhs);
  $rhs = $lhs + length($rhs||'') - 1;
  return [$lhs$rhs];
}

is_deeply(inv_fizzbuzz('fizz'), [33]);
is_deeply(inv_fizzbuzz('buzz'), [55]);
is_deeply(inv_fizzbuzz('fizz''buzz'), [910]);
is_deeply(inv_fizzbuzz('buzz''fizz'), [56]);
is_deeply(inv_fizzbuzz('fizz''fizz''buzz'), [610]);
is_deeply(inv_fizzbuzz('fizz''fizz'), [69]);
is_deeply(inv_fizzbuzz('fizz''buzz''fizz'), [36]);
is_deeply(inv_fizzbuzz('fizzbuzz''fizz'), [1518]);
is_deeply(inv_fizzbuzz('fizzbuzz''fizz'), [1518]);
is_deeply(inv_fizzbuzz('buzz''buzz'), []);

done_testing;
vimスクリプト版はkoronさんが書いてた。
koron/zzub-zzif-vim ツキ GitHub
https://github.com/koron/zzub-zzif-vim
Posted at by




最近Vim界隈で色々出来事がありまして、その色々を起こした数名の内の1人です。
vim-jp » Vimのユーザと開発者を結ぶコミュニティサイト

vim-jpはVimと日本・日本語に関わるあらゆるリソースを集中させることを目的としたコミュニティサイトです。vi は、おそらく全てのUNIX系 OS 上で使えるテキストエディタです。世界には、さまざ...

http://vim-jp.org/
開発者やユーザによっては良い出来事だと信じています。
そのサイトでご紹介した記事
vim-jp » Vimで動くゲーム

最近、Vim scriptで書かれたゲームが登場し始めています。今日はその中でも有名な物をご紹介します。TeTrIs.vim : A tetris game in pure vim ご存知テトリス。「ピ...

http://vim-jp.org/blog/2011/09/20/games.html
で、作りかけながらインベーダーゲームをご紹介しました。
mattn/invader-vim - GitHub

invader game in vim

https://github.com/mattn/invader-vim
起動するとこんな感じになって、ちょっとだけ遊べます。
一応、敵キャラもアニメーションしてて遊べます。スコアなどはまだありません。
invader-vim
次に、先ほど出来てホヤホヤの麻雀ゲーム。
mattn/mahjong-vim - GitHub

mahjong game in vim

https://github.com/mattn/mahjong-vim
見た目だけは本格的です。
mahjong-vim
マンズしか無いですが、何回でアガれるかを競うゲームです。
点数計算などはありません。

Vim scriptの勉強にも役立つかもしれません。良ければ遊んでみて下さい。
Posted at by



2012/05/15


WindowsをUNIXライクに使っておられる方も多いかと思います。僕もその一人で、僕はコマンドプロンプトを常に開きっぱなしの状態で作業します。
msysを使っても良いのですが、bashはbashで色々と問題もあり/c/Program\ Filesみたいなパスでは問題が起きたり、メールに貼り付けられているパスをコピペして動かないのは苦痛であったりもします。
なので常にコマンドプロンプト(cmd.exe)を使い、vimやlessというUNIX向けツールを使っています。
gitやmercurialでのdiff表示やlog表示の際、ページャは不可欠です。lessを使っているmsysgitでもある程度綺麗に表示されますが、マルチバイトでの検索が出来なかったり、nkf等といったフィルタを噛まさないと表示出来なかったりしました。
lessの場合は以前パッチを書いたlessを使えばコマンドプロンプトでもフィルタ無しにutf-8が表示出来るのですが、自動判定や他のエンコーディングに弱かったりもしました。
そういった理由から日本のUNIXユーザの中にはlessの変わりにlvを使う方も多いです。おそらく日本語を読む事についてはlessよりも高機能なので、ずっとWindowsでもlvを使いたいなと思ってました。
さらにWindows向けのgitに含まれるlessはなぜか稀に最終行の色が綺麗に終端しておらず、git diffを表示し終えた後も画面が緑色のままになったりして、困っていました。

先日からlvをWindowsにポーティングし始めていて、ようやくlessと同等にカラー表示出来る様になったので公開しようと思います。
  • Windows版lessの代わりに使えます
  • フィルタ無しに日本語utf-8が示出来ます
  • iso-2022-cn, iso-2022-jp, iso-2022-kr, euc-china, euc-japan, euc-korea, euc-taiwan, shift_jis, big5 といったアジア圏のエンコーディングが扱えます
  • UTF-7, UTF-8, iso-8859-1 ... iso-8859-9 も問題なく扱えます
  • エスケープシーケンスを含んだテキストをカラー表示出来ます
gitであれば、~/.gitconfig [core]
    pager = lv -Iu8
こう書いておけば使えます。またmercurialではtpager extensionと併用すればwindowsでも色つきdiff表示が出来ます。
alexandrul / TPager / overview — Bitbucket

Mercurial pager with color support on Windows

https://bitbucket.org/alexandrul/tpager
~/.hgrc [extensions]
hgext.color=
# tpager.pyへのパス
tpager = ~/tpager/tpager.py

[color]
# win32ではなくansiにする事でエスケープシーケンスを吐く
mode = ansi

[pager]
# ページャを使うコマンド
attend = annotate, cat, diff, export, glog, help, log, qdiff, status, tip
# おまじない
hg16mode = yes
# どのページャを使うか
pager = lv -Iu8
この様に設定すれば色つきのdiffが表示出来る様になります。
リポジトリのmasterブランチは、オリジナルそのままにしてあります。windowsブランチに僕が手を加えた物がpushされています。
mattn/lv-window - GitHub

windows port of lv

https://github.com/mattn/lv-windows
まぁこんなの使うのは変態くらいしかいないと思いますが、よろしければどうぞ。
Posted at by