CodeIQのFizzBuzzダンジョンLV1~4を解いた

こんにちは。
CodeIQというプログラミングの問題を解くサービスで面白そうな問題を見つけました。

挑戦者求む!クロノス・クラウン合同会社 柳井 政和@FizzBuzzダンジョンさん|CodeIQ

よくあるFizzBuzzモノなのですが、段階的に縛りが強くなっていくという問題です。
この問題を4問解いてみました。

LV1

字数制限 禁止文字
100 なし

禁止文字もなく字数制限も甘いので愚直な三項演算。
見た目がちょっと綺麗になるよう整えました

下で38文字、スペースを削除すれば20文字です。

i % 15 ? i % 5 ? i % 3 ? 0 : 1 : 2 : 3

LV2

字数制限 禁止文字
30 ?, :, &, `

ifや三項演算での分岐が使えなくなってしまいました。
3の倍数のときに1になって、5の倍数のとき2になって、15の倍数のとき3になるには。

  • !(i % 3)
    • 3の倍数なら1、違うなら0
  • !(i % 5) * 2
    • 5の倍数なら2、違うなら0

15の倍数は3,5の倍数であれば良いので、上を足します。

!(i % 5) * 2 + !(i % 3)
  • 15の倍数(3と5の倍数)なら3
  • 5の倍数なら2
  • 3の倍数なら1
  • いずれでもなければ``

とうまくいきます。

LV3

字数制限 禁止文字
40 ?, :, &, `

今度は!が封じられました。
が、1,0を反転するだけなら1引いて-1かければ良いのでそんなに難しくもないです

  • (Boolean(i % 5) - 1) * -2
    • 5の倍数なら2、違うなら0
  • (Boolean(i % 3) - 1) * -1
    • 3の倍数なら1、違うなら0

とさっきの形に落とし込むことができました。あとは足すだけです。

スペースを消して、39文字。ギリギリです。

(Boolean(i%5)-1)*-2+(Boolean(i%3)-1)*-1

LV4

字数制限 禁止文字
70 ?, :, &, `

さらに%が封じられました。ただ制限文字数が増えてます。

%は、切り捨てでごり押します。
~~での切り捨ても禁止文字なのでparseIntを使います。

(1%5)としていた部分を、(i-parseInt(i/5)*5)と置き換えます。 これで5で割った余りが取れるので、後はLV3と同じです。

i%3についても同様なので省略します。

スペースを消して、67文字に収まりました。

(Boolean(i-parseInt(i/5)*5)-1)*-2+(Boolean(i-parseInt(i/3)*3)-1)*-1

もっとスマートに解ける方法がありましたら教えていただけると幸いです。