let rulesText = """
00*1 ADD
01*1 SUB
10*1 MUL
"""
type conv = System.Convert
let mask (s : string) = conv.ToInt32 (s.Replace('1', '0').Replace('*', '1'), 2) |> (~~~)
let bits (s : string) = conv.ToInt32 (s.Replace('*', '0'), 2)
let ops (rules : string) =
let result = Array.create 16 "-"
for e in rulesText.Trim().Split('\n') do
let xy = e.Split()
let m, b, x = mask xy.[0], bits xy.[0], xy.[1]
for i in 0..result.Length-1 do
if i &&& m = b then result.[i] <- x
result
do
ops rulesText
|> Array.iteri (fun i e -> printfn "%s %s" (conv.ToString(i, 2).PadLeft(4, '0')) e)
bGV0IHJ1bGVzVGV4dCA9ICIiIgowMCoxIEFERAowMSoxIFNVQgoxMCoxIE1VTAoiIiIKCnR5cGUgY29udiA9IFN5c3RlbS5Db252ZXJ0CgpsZXQgbWFzayAocyA6IHN0cmluZykgPSBjb252LlRvSW50MzIgKHMuUmVwbGFjZSgnMScsICcwJykuUmVwbGFjZSgnKicsICcxJyksIDIpIHw+ICh+fn4pCgpsZXQgYml0cyAocyA6IHN0cmluZykgPSBjb252LlRvSW50MzIgKHMuUmVwbGFjZSgnKicsICcwJyksIDIpIAoKbGV0IG9wcyAocnVsZXMgOiBzdHJpbmcpID0gCiAgICAgICAgbGV0IHJlc3VsdCA9IEFycmF5LmNyZWF0ZSAxNiAiLSIKICAgICAgICBmb3IgZSBpbiBydWxlc1RleHQuVHJpbSgpLlNwbGl0KCdcbicpIGRvCiAgICAgICAgICAgICAgICBsZXQgeHkgICAgICA9IGUuU3BsaXQoKSAKICAgICAgICAgICAgICAgIGxldCBtLCBiLCB4ID0gbWFzayB4eS5bMF0sIGJpdHMgeHkuWzBdLCB4eS5bMV0KICAgICAgICAgICAgICAgIGZvciBpIGluIDAuLnJlc3VsdC5MZW5ndGgtMSBkbyAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgaSAmJiYgbSA9IGIgdGhlbiByZXN1bHQuW2ldIDwtIHggCiAgICAgICAgcmVzdWx0CgpkbyAKICAgIG9wcyBydWxlc1RleHQgCiAgICB8PiBBcnJheS5pdGVyaSAoZnVuIGkgZSAtPiBwcmludGZuICIlcyAlcyIgKGNvbnYuVG9TdHJpbmcoaSwgMikuUGFkTGVmdCg0LCAnMCcpKSBlKQogICAgCg==