🎃

(備忘録) 奇数判定大喜利

2025/03/12に公開

たこたこたこたこ たこいかぱにっく!

「たこ」と言ったらたこ叩く!

元凶(^ρ^)

https://x.com/fumokmm/status/1898690910013255750

https://x.com/fumokmm/status/1898695858859737496

https://x.com/arith_rose/status/1899300131658510802

Let's お大喜利スクリプト

① 余算の無駄遣い (条件分岐を回避)

function isOdd(num) {
    return [false, true][num % 2];
}

image.png

② bit演算 (条件分岐を回避)

function isOdd(num) {
    return [false, true][num & 0x01];
}

image.png

③ 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)];
}

image.png

④ Spreadsheetでリスペクト!(戻り値編)

function isOdd(num) {
  return SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].getSheetValues(num, 1, 1, 1)[0][0];
}

image.png

⑤ 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'));
}

image.png

⑥ ^100番煎じ

https://x.com/yuyasatopyaa/status/1899482750736040363

cosで!?と思って検算とsinでやろうと思ったら。

https://x.com/hamukazu/status/1899324431056711978

すでにやっている人がいた。
そんな、符号と小数を潰す^100番煎じ。

function isOdd(num) {
    return Boolean(Math.pow(Math.sin(Math.PI * num / 2), 100));
}

image.png

⑦ ASCII制御コードでrepeat

function isOdd(num) {
    return Boolean([...(String.fromCharCode(0) + String.fromCharCode(1)).repeat((num / 2) + 1)][num].codePointAt(0));
}

image.png

作業BGM

  • AKI - Pure Heart ~世界で一番アナタが好き~
    image.png

Discussion