こんにちは。
CodeIQというプログラミングの問題を解くサービスで面白そうな問題を見つけました。
挑戦者求む!クロノス・クラウン合同会社 柳井 政和@FizzBuzzダンジョンさん|CodeIQ
よくあるFizzBuzzモノなのですが、段階的に縛りが強くなっていくという問題です。
この問題を4問解いてみました。
字数制限 | 禁止文字 |
---|---|
100 | なし |
禁止文字もなく字数制限も甘いので愚直な三項演算。
見た目がちょっと綺麗になるよう整えました
下で38文字、スペースを削除すれば20文字です。
i % 15 ? i % 5 ? i % 3 ? 0 : 1 : 2 : 3
字数制限 | 禁止文字 |
---|---|
30 | ? , : , & , ` |
ifや三項演算での分岐が使えなくなってしまいました。
3の倍数のときに1になって、5の倍数のとき2になって、15の倍数のとき3になるには。
!(i % 3)
!(i % 5) * 2
15の倍数は3,5の倍数であれば良いので、上を足します。
!(i % 5) * 2 + !(i % 3)
3
2
1
とうまくいきます。
字数制限 | 禁止文字 |
---|---|
40 | ? , : , & , ` |
今度は!
が封じられました。
が、1,0を反転するだけなら1引いて-1かければ良いのでそんなに難しくもないです
(Boolean(i % 5) - 1) * -2
(Boolean(i % 3) - 1) * -1
とさっきの形に落とし込むことができました。あとは足すだけです。
スペースを消して、39文字。ギリギリです。
(Boolean(i%5)-1)*-2+(Boolean(i%3)-1)*-1
字数制限 | 禁止文字 |
---|---|
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
もっとスマートに解ける方法がありましたら教えていただけると幸いです。