こんにちは。
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)321とうまくいきます。
| 字数制限 | 禁止文字 |
|---|---|
| 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もっとスマートに解ける方法がありましたら教えていただけると幸いです。