こちらのサイトにあるように、剰余演算に負数が入っていたときの結果は言語によって異なるらしいです。
JavaScriptの場合は-3 % 5 = -3
, 3 % -5 = 3
なので、これを-3 % 5 = 2
, 3 % -5 = -2
にするための処理をどれだけ短く書けるか考えてみました。引数が整数と決めてやっているので、動作は保証できません。
##第一案(15文字)
function mod1(a, b) {
return a * b < 0 ? a % b + b : a % b;
}
a
とb
が異符号のときはb
を足せばいいんじゃないかという考えで、このようにしました。縮めるとa*b<0?a%b+b:a%b
なので15文字です。
##第二案(15文字)
function mod2(a, b) {
return a % b + ( a * b < 0 ? b : 0 );
}
b
を足すかどうかなのでまとめたら、縮めてもa%b+(a*b<0?b:0)
の15文字で変わりませんでした。
##第三案(14文字)
function mod3(a, b) {
return a % b + ( a * b < 0 && b );
}
JavaScriptだとfalse
は0
扱いなので、a
とb
が同符号だったときにそのまま0
を返すようにしました。縮めるとa%b+(a*b<0&&b)
で14文字です。
##第四案(13文字)
function mod4(a, b) {
return a % b + ( a * b < 0 ) * b;
}
true
も1
扱いになるので、b
とそのまま掛けました。縮めるとa%b+(a*b<0)*b
で13文字です。
##最終結果(第四案修正案)
function mod(a,b){return(a*b<0)*b+a%b}
()
を先に持ってくることで、return
との間の空白をなくすことができました。
自分だとここまでが限界でした。もっといい方法や、上記の方法の不具合があれば教えていただけると嬉しいです。