新卒向けに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」
とまあこんな感じ。非常にいい感じ。まだコードゴルフ的なことができたというのが嬉しい。
この記事が気に入ったらサポートをしてみませんか?