(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));