RCIE-ジャンクのコード屋

主に自分のためにコーディングのTIPSを蓄積しています。

(C#)続・曜日を数値にする魔法

作ったもの

 日月火水木金土 → 0, 1, 2, 3, 4, 5, 6 に変換する関数です。

 曜日を数値に変換する方法については、以下のようにいろいろ紹介しましたが、今回発明したものは、非常に動作が軽いです。
(C#)文字列で場合分けするときは、Dictionary を使うことができる - RCIE-ジャンクのコード屋

コード

static int YoubiToNumber4(string youbi) {
	uint hash = (uint)youbi.GetHashCode();
	return (int)((2247263257 + hash * 3037067380) / (uint.MaxValue / 7));
}

使い方

int n;
n = YoubiToNumber4("月"); // 1になる
n = YoubiToNumber4("水"); // 3になる
n = YoubiToNumber4("金"); // 5になる

解説

 これは、"日月火水木金土"の各文字列を 0, 1, 2, 3, 4, 5, 6 にマッピングする 完全最小ハッシュ関数 です。なぜこのような数値になるのかは、作者の私にも理屈がよくわかりませんが、y = ax + b の一次式に、"水" のハッシュコード 3452623756 を代入すると、3 が出てくるわけです。

 このような一次式を、機械学習を用いて調べたら見つかったので紹介しました。

補足

 組み合わせは他にもいろいろありました。

return (int)((1874802163 + hash * 2220959842) / (uint.MaxValue / 7));
return (int)((3734123784 + hash * 3431509104) / (uint.MaxValue / 7));
return (int)((1079026885 + hash * 1965669590) / (uint.MaxValue / 7));
return (int)((1148540147 + hash * 2360105310) / (uint.MaxValue / 7));
return (int)((3221363849 + hash * 207945904) / (uint.MaxValue / 7));