tac-tac-go
← Posts

小ネタ集

2026-02-21

正規表現の条件付きカスタマイズ

三項演算子を複数組み合わせることで4つの条件組み合わせを2行で処理できる。

const pattern = exactMatch ? `\\b${term}\\b` : term;
const flags = caseSensitive ? "" : "i";
const regex = new RegExp(pattern, flags);

2025-06-22

引き算を加算とビット反転で実装する

ビット反転と+1で負数を生成し加算に変換する補数演算法。

const madSub = (a, b) => a + ~b + 1;

2025-05-13

掛け算を加算で実装する(30字以内)

論理演算子で終了条件と再帰加算を一行で表現するゴルフコード。

madMul = f = (a, b) => b && a + f(a, --b);

2025-05-12

非減少配列を生成する

mapで前値保持変数と現値のmaxを評価し代入することで簡潔に実装できる。

function cleanedCounts(data) {
  let m = 0;
  return data.map(e => (m = Math.max(m, e)));
}

2025-03-28

ソート未使用で最大値と次点の差を計算する

2つの変数を保持して最大値更新時に前値を次点へ移すアルゴリズム。

function diffBig2(arr) {
  let largest = -Infinity,
    secondLargest = -Infinity;
  for (const num of arr) {
    if (num > largest) {
      secondLargest = largest;
      largest = num;
    } else if (num > secondLargest) {
      secondLargest = num;
    }
  }
  return largest - secondLargest;
}

2025-03-21

連続する奇数・偶数の間に記号を挿入する

肯定先読みで連続判定し置換することで複雑な条件分岐を回避できる。

const insertDashII = num =>
  String(num)
    .replace(/([13579])(?=[13579])/g, "$1-")
    .replace(/([2468])(?=[2468])/g, "$1*");

2025-03-18

JavaScriptでDateを扱うときの注意点

new Date(year, month-1, day)のmonthは0インデックスから始まるため、指定月より-1する必要がある。

function ageInDays(year, month, day) {
  const now = new Date();
  const birth = new Date(year, month - 1, day);
  return `You are ${Math.floor((now - birth) / (24 * 60 * 60 * 1000))} days old`;
}

2025-03-11

正規表現に変数を埋め込む

RegExpコンストラクタとテンプレートリテラルで動的な正規表現パターンを生成できる。

function comes_after(str, l) {
  const reg = new RegExp(`(?<=${l})[a-z]`, "ig");
  return (str.match(reg) || []).join("");
}

2025-03-06

配列の長さを再帰処理で求める

スプレッド構文で先頭要素を分離し再帰させることでlength未使用で長さを計測できる。

function lenR([head, ...tails]) {
  if (head === undefined) return 0;
  return lenR(tails) + 1;
}

2025-03-05

二次元配列内の唯一の値をジェネレータで検出する

ジェネレータを使用すると全走査せず条件達成時点で処理を停止できる。

const xMarksTheSpot = input => {
  const gen = (function* () {
    for (let i = 0; i !== input.length; ++i)
      for (let j = 0; j !== input[i].length; ++j)
        if (input[i][j] === "x") yield [i, j];
  })();
  const first = gen.next().value;
  return first && !gen.next().value ? first : [];
};

2025-03-02

次の素数を見つけるプログラム

素数判定では平方根までの検査で十分。合成数は必ず√n以下の約数を持つため。

const isPrime = n => {
  if (n < 2) return false;
  for (var i = 2; i <= Math.sqrt(n); i++) {
    if (n % i === 0) return false;
  }
  return true;
};

2025-02-27

最大頻度の数値を取得する(重複時は大きい値を優先)

sortで頻度と値の複合条件をOR演算子で統合すると複数条件ソートが可能。

function highestRank(arr) {
  let getNum = num => arr.filter(n => n === num).length;
  return arr.sort((a, b) => getNum(b) - getNum(a) || b - a)[0];
}

2025-02-26

文末記号のみを残す正規表現

負の先読みを使用することで文末以外の記号のみを効率的に削除できる。

function remove(string) {
  return string.replace(/!+(?!!*$)/g, "");
}

2025-02-20

JavaScriptでreverseメソッドを使わずに配列を反転する

手動要素入れ替えでの実装例。スワップを使って前半と後半を入れ替えていく。

const reverseArray = arr => {
  for (let i = 0; i < Math.floor(arr.length / 2); i++) {
    [arr[i], arr[arr.length - 1 - i]] = [arr[arr.length - 1 - i], arr[i]];
  }
  return arr;
};

2025-02-13

FlutterでmacOSアプリのネットワーク処理を許可する

Image.networkやDioなどでネットワーク処理を実行する際、macos/Runner/DebugProfile.entitlementsにセキュリティ許可を追記する必要がある。

<key>com.apple.security.network.client</key>
<true/>

2025-02-11

Pythonでdatetimeオブジェクトから値を取り出す

strftime()メソッドの書式指定子: %Y(年)、%m(月)、%d(日)、%H(時)、%M(分)、%S(秒)。%xで日付全体を取得して分割代入を使うと月日年を一度に取得できて便利。

m,d,y = time.strftime("%x").split("/")
print(m,d,y)

2025-01-31

Pythonのzip_longestとfillvalue引数

異なる長さの配列でfillvalueパラメータを使用すると短い配列に対して指定値を埋め込める。

"\n".join(f"{a} {b}" for a, b in zip_longest(*arr, fillvalue=" "))

2025-01-25

JavaScriptで文字を一文字ずつ分割する

スプレッド構文を使用して文字列を分割できる。文字列はイテラブルオブジェクトなので[...str]で配列に変換可能。

[...str].map(s => /* 処理 */)

2025-01-24

JavaScriptでSetの要素数を取得する

Setオブジェクトにはsizeプロパティが実装されているため、Array.from()での変換が不要。new Set().sizeで直接要素数を取得できる。


2024-12-30

JavaScriptのsortで特定要素を末尾に配置する

sort メソッドで特定値のみを配列末尾に配置するには比較関数で条件付き戻り値を返す。

const moveZeros = arr => {
  return arr.sort((a, b) => (b === 0 ? -1 : 0));
};

2024-12-27

PythonとJavaScriptで文字列の先頭・末尾をマッチさせるときの違い

正規表現における表記方法の違い。Pythonでは先頭に\A、末尾に\Zを使用。JavaScriptでは先頭に^、末尾に$を使用する。

import re
def to_cents(value):
    return int(m.expand(r'\1\2')) if re.match(r'\A\$(\d+)\.(\d\d)\Z', amount) else None
String.prototype.toCents = function () {
  return /^\$\d+\.\d{2}$/.test(this)
    ? parseInt(this.slice(1).replace(".", ""))
    : null;
};

2024-12-12

Pythonで型に基づいた反転処理

type()で取得した型でキャストすることで条件分岐を削減できる。

def reverse_it(data):
    if type(data) in [int, str, float]:
        return type(data)(str(data)[::-1])
    return data

2024-12-06

ChatGPTなどにMarkdownのコードを出力させる方法

バッククォートでコードを囲むとブラウザが勝手にレンダリングしてしまう問題への対処法。コードを囲む際に「@」記号を使用するよう指定することで、Markdown形式のままコピー可能になる。


2024-11-08

TypeScriptでfind関数を使うときの型定義

find関数は見つからない場合undefinedを返すため、TypeScriptではfilterを使用してundefinedを型定義から除外すべき。

arr.filter(el => arr.indexOf(el) == arr.lastIndexOf(el))[0];

2024-10-31

JavaScriptのprototype定義時の関数選択

アロー関数はthisスコープを持たないため、prototype定義では通常の関数を使用するべき。

String.prototype.myNewMethod = function () {
  return this.toUpperCase();
};

2024-09-18

JavaScriptで列方向の平均値を計算する

Pythonのnumpy.mean(axis=0)をJavaScriptで実装する方法。mapreduceを組み合わせることで各列ごとの平均を算出できる。

const meanArray = arr[0].map(
  (_, colIndex) => arr.reduce((sum, row) => sum + row[colIndex], 0) / arr.length
);

2024-09-01

PythonとJavaScriptで文字列からint型に変換するとき

空文字列を数値型に変換する際のエラー回避。Pythonではor演算子、JavaScriptでは||演算子でデフォルト値を指定できる。

int("" or 0)
parseInt("" || 0);