🎃
(備忘録) 奇数判定大喜利
たこたこたこたこ たこいかぱにっく!
「たこ」と言ったらたこ叩く!
元凶(^ρ^)
Let's お大喜利スクリプト
① 余算の無駄遣い (条件分岐を回避)
function isOdd(num) {
return [false, true][num % 2];
}
② bit演算 (条件分岐を回避)
function isOdd(num) {
return [false, true][num & 0x01];
}
③ ES2015 (ES6) とCPUの無駄遣い
-
...
はスプレッド構文 -
() =>
はアロー関数式
function isOdd(num) {
return [...'01'.repeat(5)].map((c) => c == '1')[[...new String(num)].reduce((s, c) => c + s, '')[0].codePointAt(0) - '0'.codePointAt(0)];
}
④ Spreadsheetでリスペクト!(戻り値編)
function isOdd(num) {
return SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].getSheetValues(num, 1, 1, 1)[0][0];
}
⑤ Spreadsheetでリスペクト!(関数編)
- まずSpreadsheetから [100] x [1] の領域を読み込む。
-
reduce()
で2次元配列を1次元に展開する。 - さらに
reduce()
で100パターン分のif文を作成。 - 前後に
(function(){
と})();
を追加した配列にして、join()
で結合。 -
eval()
で実行した結果を返す。
function isOdd(num) {
return eval(['(function() {', ...[...SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].getSheetValues(1, 1, 100, 1).reduce((a, o) => [...a, ...o], [])].map((value, index) => ` if (${num} === ${index + 1}) {return ${value};}`), '})();'].join('\n'));
}
⑥ ^100番煎じ
cosで!?と思って検算とsinでやろうと思ったら。
すでにやっている人がいた。
そんな、符号と小数を潰す^100番煎じ。
function isOdd(num) {
return Boolean(Math.pow(Math.sin(Math.PI * num / 2), 100));
}
⑦ ASCII制御コードでrepeat
function isOdd(num) {
return Boolean([...(String.fromCharCode(0) + String.fromCharCode(1)).repeat((num / 2) + 1)][num].codePointAt(0));
}
作業BGM
- AKI - Pure Heart ~世界で一番アナタが好き~
Discussion