コードゴルフに初挑戦してみた (お正月版 各桁総和ダンジョン LV1-3)
「コードゴルフ」
言葉とその意味を知ったのは恐らく5年ほど前だったと思います。
ある目的を達成するための最短コードを競うもので、その魔術的なコードを見て、ただただ呆然とした覚えがあります。
そして2014年。
CodeIQというサービスに登録し、その中にコードゴルフの問題がありました。
今までは魔法の使えない「戦士」のような存在でしたが、この問題に挑戦することで「魔法使い見習い」くらいにはなれるかな?と思い、挑戦してみました。
問題
● 各桁総和の魔法
1から9999まで順に整数が与えられますので、以下の計算結果になる値を求めて、戻してください。
・数値を1桁ずつばらばらにして、和を求める。
・その和が1桁にならなかった場合は、同じ操作を続けて、1桁になるまで計算を行う。
例)
123 → 1+2+3 → 6 を戻す
9876 → 9+8+7+6 → 30 → 3+0 → 3 を戻す● コード入力
function yourCode() {
var arr = [];
for (var i = 1; i <= 9999; i ++) {
arr.push(???);
}
return arr;
}
LV1
挑戦者求む!【JavaScript】お正月版 各桁総和ダンジョン LV1 by クロノス・クラウン合同会社 柳井 政和│CodeIQ
入力欄の文字数:175文字以内
禁止文字:なし
制限無し。
先人の知恵をお借りして最短コードでいけました!
6文字
i%9||9
剰余1-8はTrue扱い→1-8
剰余0の場合はFalse扱い→9、になります。
LV2
挑戦者求む!【JavaScript】お正月版 各桁総和ダンジョン LV2 by クロノス・クラウン合同会社 柳井 政和│CodeIQ
入力欄の文字数:50文字以内
禁止文字:1 2 3 4 5 6 7 8 9
0が禁止されてないのがポイント、ということで「0xA-!0」→「10-1」で9を作りました。
18文字
(i-!0)%(0xa-!0)+!0
LV3
挑戦者求む!【JavaScript】お正月版 各桁総和ダンジョン LV3 by クロノス・クラウン合同会社 柳井 政和│CodeIQ
入力欄の文字数:100文字以内
禁止文字:1 2 3 4 5 6 7 8 9 0 , + % ? : this eval function Function Array join split repeat ' "
制限つきすぎて2晩くらい解けず眠れない日々を過ごしましたが。
「String(undefined).length」 →9という力技で解きました。70文字とか全然ゴルフじゃないです。
70文字
i-(i/String(undefined).length|!i)*String(undefined).length||String(undefined).length
最短コードの黒魔術っぷりに期待してます。
2/5追記
魔法使いの方からリプ頂きました!
@tmftake Lv2: ~-i%~-0xa-~0 (~-でデクリメント、-~でインクリメントを実現するのがポイント) Lv3: 私も最短ではないですが、(z=(~-~!!i)*(~-~!!i))でzに9が代入できます。
2014-02-04 11:07:15 via web to @tmftake