今日からプログラムに"+"を使えなくなるそうです。
このニュースを受けて、対策を考えました。
検索最大手の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
ひとこと解説: 文字コードを使って"+"という文字を直接書くのを回避しています。