早起き

ひとりぼっちになるかと思って焦った。


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であることは求められるから、式を変えればいいのかなぁ。

とりあえず朝風呂にするかな。