新卒向けにGAS研修をやったのでFizzBuzz最短チャレンジやってみた

弊社、毎年「シェア研修」と称して何社かと(今年は3社)合同新人研修をやっているのですが、なんと「詳解! GoogleAppsScript完全入門」を書かれたプランノーツの高橋宣成さんに講師をお願いしてしまいました!

僕も恥ずかしながらGASを初めて触ったので、課題の中にあったFizzBuzzを解いてみました。が、ただ解くと面白くないのでなるべく短くしました。なお、私は5年以上コード書いていないので久しぶりに書く、人事・採用の人です。

for(i=0;i++<100;){t=i%3?'':'Fizz';Logger.log(i%5?t||i:t+'Buzz');}

多分、もう少し短くなりそうですが、色々試行錯誤したのでせっかくなので残しておこうかと。

for文の書き方

普通はこう書きますよね。

for ( 初期化式 ; 条件式; 増減式 ) { ... }

と書きますよね。1~100でFizzBuzzするなら

for ( i= 1; i <= 100; i++ ) { ... }

こう。でもこれを見て、「初期値と増減式は一度しか見ないし、どうにかまとまらんかなー」と思ったら、こう書けた。

for ( i = 0; i++ < 100; ) { ... }

これ回った時には感動したw
ただ、初期化するときにi = 0にしておかないと、初回の評価のときに++されてしまい、{}に入った時には初期値より+1された状態で処理が始まってしまうので注意。

||の挙動

Logger.logの中身に条件式を含むことができて、例えばみんな大好き三項演算子を使って

a = 1;
Logger.log( a > 0 ? 'positive' : '0 or negative' );  // positive

などと書けたりする。
そのときに論理ORの||を使って「15の倍数のときに、OR使ってFizzにBuzzくっつけられないかなぁ。でも、どっちかだけ評価してほしいなぁ」などと都合いいことを考えたわけです。そしたら、見つかりまして。

var i = 1, j = 1;
 if ( i++ > 0 || j++ > 0 )
    {
        Logger.log( i + ',' + j);    // 2,1
    }

これ、i++ > 0の方しか評価されていないのですわ。これは短絡論理OR演算子「||」というらしい。一方、

var i = 1, j = 1;
if ( i++ > 0 || j++ > 0 )
   {
       Logger.log( i + ',' + j);    // 2,2
   }

これは両方評価されています。これはビット論理OR演算子「|」というらしい。

結果、 動作はこんな感じになります。

i=3のとき
 i%3=0=falseなのでt='Fizz'
 i%5=2=trueなのでt||iが評価される
 t='Fizz'=trueなのでtが返され、「Fizz」

i=5のとき
 i%3=2=trueなのでt=''
 i%5=0=falseなのでt+'Buzz'で「Buzz」

i=15のとき
 i%3=0=falseなのでt='Fizz'
 i%5=0=falseなのでt+'Buzz'で「FizzBuzz」

それ以外の時(例:i=2
 i%3=2=trueなのでt=''
 i%5=2=trueなのでt||iが評価される
 t=''=falseなのでiが返され、「2」

とまあこんな感じ。非常にいい感じ。まだコードゴルフ的なことができたというのが嬉しい。

この記事が気に入ったらサポートをしてみませんか?