LoginSignup
9
6

More than 5 years have passed since last update.

負数の剰余の対策をより短く書いてみる

Last updated at Posted at 2015-01-03

こちらのサイトにあるように、剰余演算に負数が入っていたときの結果は言語によって異なるらしいです。
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;
}

abが異符号のときは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だとfalse0扱いなので、abが同符号だったときにそのまま0を返すようにしました。縮めるとa%b+(a*b<0&&b)で14文字です。

第四案(13文字)

function mod4(a, b) {
  return a % b + ( a * b < 0 ) * b;
}

true1扱いになるので、bとそのまま掛けました。縮めるとa%b+(a*b<0)*bで13文字です。

最終結果(第四案修正案)

function mod(a,b){return(a*b<0)*b+a%b}

()を先に持ってくることで、returnとの間の空白をなくすことができました。
自分だとここまでが限界でした。もっといい方法や、上記の方法の不具合があれば教えていただけると嬉しいです。

9
6
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
6