LoginSignup
22
21

More than 5 years have passed since last update.

"+"を使わないプログラミング

Last updated at Posted at 2015-04-01

今日からプログラムに"+"を使えなくなるそうです。
このニュースを受けて、対策を考えました。

Google、「+」の商標権を取得、数学界に衝撃

検索最大手のGoogle社が、「Google+」を商標を出願していたことが明らかになった。 それに伴い、2015年8月1日以降に流通する商品、出版物等に「+」を使う際、1文字あたり6.7ドルの使用料を支払う義務が生じる。

(中略)

「+」演算子を用いたプログラムも該当するため、 数学、工学の分野への影響が懸念される。

※ このニュースはエイプリルフールネタです。

加算

問題となるプログラム:

function plus(x, y) {
  return x + y;
}

ans = plus(5, 3);
console.log(ans); // => 8

代替1

function plus(x, y) {
  return x - -y;
}

ひとこと解説: マイナスはスペースで区切れば連続で使用できます(演算子の"-"と符号の"-")。

代替2

function plus(x, y) {
  return -(-x - y);
}

ひとこと解説: -(-x - y) = (+x) + (+y)

代替3

function plus(x, y) {
  for(i=[]; i.length < x; i.push(1)){}
  for(j=[]; j.length < y; j.push(1)){}
  tmp = i.concat(j);
  return tmp.length;
}

ひとこと解説: 配列ゴリ押しです。自然数限定です。

代替4

function plus(x, y) {
  return x-~y-1;
}

ひとこと解説: ビット毎論理否定で一旦負にします(~y = - 1 - y になる)。32ビット整数限定です。

インクリメント

問題となるプログラム:

function incr(x) {
  x++;
  return x;
}

var x, ans;
x = 5;
ans = incr(x);
console.log(ans); // => 6

代替1

function incr(x) {
  x = -x;
  x--;
  x = -x;
  return x;
}

ひとこと解説: マイナスにしてからデクリメント演算子を使い、また戻します。

代替2

function incr(n) {
  var tmp = [];
  while(tmp.length <= n) {
    tmp.push(1);
  }
  return tmp.length;
}

ひとこと解説: 空の配列から始めると、配列要素の数がn+1になります。(自然数限定)

文字列連結

問題となるプログラム:

function strPlus() {
  return str1 + str2;
}

var str1, str2, ans;
str1 = 'Thanks, ';
str2 = 'world!';
ans = strPlus(str1, str2);
console.log(ans); // => "Thanks, world!"

代替1

function strPlus(str1, str2) {
  return str1.concat(str2);
}

ひとこと解説: concatメソッドでつなげます。

代替2

function strPlus(str1, str2) {
  return [str1, str2].join('');
}

ひとこと解説: 空文字を間に挟んで(つまり何も挟まず)配列を連結します。ちょっと遅いです。

正規表現

問題となるプログラム:

var re = /ab+c/;
console.log(re.test('ac')); // => false
console.log(re.test('abc')); // => true

代替1

var re = /abb*c/;
console.log(re.test('ac')); // => false
console.log(re.test('abc')); // => true

ひとこと解説: 0回以上の繰り返しにもう1回、としてやります。

代替2

var plusChar = decodeURIComponent('%2B');
var re = new RegExp('ab'.concat(plusChar).concat('c'));
console.log(re.test('ac')); // => false
console.log(re.test('abc')); // => true

ひとこと解説: URIエンコードを使って"+"という文字を直接書くのを回避しています。

代替3

var plusChar = String.fromCharCode(43);
var re = new RegExp('ab'.concat(plusChar).concat('c'));
console.log(re.test('ac')); // => false
console.log(re.test('abc')); // => true

ひとこと解説: 文字コードを使って"+"という文字を直接書くのを回避しています。

22
21
0

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
22
21