早起き
ひとりぼっちになるかと思って焦った。
Unordered(And(Take(Resource(X)), Choice(2)))
X=3のとき6 * 4 / 2の12通り。
(0, 0), (1, 0) (0, 0), (1, 1) (0, 0), (2, 0) (0, 0), (2, 1) (0, 1), (1, 0) (0, 1), (1, 1) (0, 1), (2, 0) (0, 1), (2, 1) (1, 0), (2, 0) (1, 0), (2, 1) (1, 1), (2, 0) (1, 1), (2, 1)
の12通りのはず。
しかし
@0(0): 1, 1, 0, 0, 12345, 12345, 0, 0, @1(1): 1, 1, 0, 0, 12345, 12345, 0, 1, @2(2): 1, 1, 0, 0, 12345, 12345, 1, 1, @3(3): 0, 0, 12345, 12345, 0, 1, 0, 0, @4(4): 0, 0, 12345, 12345, 0, 1, 0, 1, @5(5): 0, 0, 12345, 12345, 0, 2, 0, 0, @6(6): 0, 0, 12345, 12345, 0, 2, 0, 1, @7(7): 0, 0, 12345, 12345, 0, 3, 0, 0, <= error
むう。サイズを求める部分は正しく6 * 4 / 2で計算しているのに、デコーダは6 * 5 / 2だと思って計算している。デコーダの方を直すのは簡単だがエンコーダが
if(and0_0 > and0_1) std::swap(and0_0, and0_1); unordered0 = 6 * and0_0 - and0_0 * (and0_0 + 1) / 2 + and0_1 - and0_0;
むう、どうすんだこれ。
問題を整理してみると、0 <= x1 < x2 < 3で y1とy2は[0, 1]であるような4つの整数の組み合わせへの[0, 12)からのマッピングはできているが、逆方向はどうしたもんやら、というお話。公差が1の等差数列と思い込んでいたので上のような式で求めていたけど、実際にはこういうケースでは公差が1以外になるからダメというお話。今回のケースでは公差が2であることは求められるから、式を変えればいいのかなぁ。
とりあえず朝風呂にするかな。