最近書いたES2015+を駆使したJavaScriptのFizzBuzz②

昨日書いたFizzBuzz、今日も書いて改善した。

これは昨日のFizzBuzz

function fizzbuzz(num) {
  return num%3 === 0 ? 
         num%5 === 0 ? 'fizzbuzz!' : 'fizz~' :
         num%5 === 0 ? 'buzz~' : num
}

// range関数
function range(start, end) {
  return [...Array(1 + end - start)].map((v, i) => start + i);
}

const oneHundredArray = range(1,100).map((v,i) => { console.log(v + ' => ' + fizzbuzz(v)) })

今回もfor,while,setTimeout,setIntervalは使わない条件縛りでやる。

👇改善したFizzBuzz👇

const fizzbuzzReturner = num => (num%3 ? '' : 'fizz') + (num%5 ? '' : 'buzz') || num
const fizzbuzz = [...Array(100).keys()].map(v => console.log(fizzbuzzReturner(++v)))

2行になった。

fizzbuzz判定する関数を最適化したりRange関数を無くしたりした。

0~nの配列を作るのなら [...Array(n).keys()]が一番短いはず。

昨日自分でこう書いてて、これを使って短くしてみた。
lengthが100の配列を作って、Array.mapの第一引数の値を++vでインクリメントしている。

CodeGolf的に1行で書く

ちなみにCodeGolfっぽくもっと短くするなら

  • 命名を短くする
  • 半角スペースを詰める
  • FizzBuzz判定をArray.mapの中に置く
  • 変数に入れない

こうしていくと1行になる…

[...Array(100).keys()].map(n=>console.log((++n%3?'':'fizz')+(n%5?'':'buzz')||n))

大喜利というかトンチっぽいのは否めないという感じがするけど1行になった。

今のところ僕の中ではこれが一番短いと思います。