main
= do mapM_ ph
[(29,15),(29,5),(5,24),(99,99),(1,2),(10,0),(0,10),(50,60),(10,10)] mapM_ mh
[(29,15),(29,5),(5,24),(99,99),(1,2),(10,0),(0,10),(50,60),(10,10)] where ph
(x
,y
) = (putStrLn.plsformat
) $ plshissan x y
mh
(x
,y
) = (putStrLn.mulformat
) $ mulhissan x y
plshissan n m = (n, m, x, y, x + y * 10)
where
plsformat
(n
,m
,x
,y
,z
) = (zero2null
.concat) [" ",numw n
, "\n+ ",numw m,
bar ++ " ",
numw x,
"\n ",numw y,
chkxz x z zsp numw,"\n"]
mulhissan n m = (n, m, x, y, xx, yy, x + y * 10 + xx * 10 + yy * 100)
where
x
= (n `
mod`
10) * (m `
mod`
10) y
= (n `
div`
10) * (m `
mod`
10) xx
= (n `
mod`
10) * (m `
div`
10) yy
= (n `
div`
10) * (m `
div`
10)
mulformat
(n
,m
,x
,y
,xx
,yy
,z
) = (zero2null
.concat) [" ",numw n
, "\n* ",numw m,
bar ++ " ",
numw x,
"\n ",numw y,
"\n ",numw xx,
"\n",numw yy,
chkxz x z zsp numw,"\n"]
zsp x = bar ++ " "
bar = "\n-----\n"
zero2null [] = []
zero2null xs
| take n xs
== s
= zero2null
(drop n xs
) where
s = "\n 0"
zero2null xs
| take n xs
== s
= zero2null
(drop n xs
) where
s = "\n 0"
zero2null xs
| take n xs
== s
= zero2null
(drop n xs
) where
s = "\n 0"
zero2null xs
| take n xs
== s
= s
++ zero2null
(drop n xs
) where
s = bar ++ " 0"
zero2null (x:xs) = x:zero2null xs
chkxz x z s1 s2 | x == z = ""
chkxz x z f1 f2 = f1 z ++ f2 z
bWFpbiA9IGRvIG1hcE1fIHBoIFsoMjksMTUpLCgyOSw1KSwoNSwyNCksKDk5LDk5KSwoMSwyKSwoMTAsMCksKDAsMTApLCg1MCw2MCksKDEwLDEwKV0KICAgICAgICAgIG1hcE1fIG1oIFsoMjksMTUpLCgyOSw1KSwoNSwyNCksKDk5LDk5KSwoMSwyKSwoMTAsMCksKDAsMTApLCg1MCw2MCksKDEwLDEwKV0KICAgICAgICAgICAgd2hlcmUgcGggKHgseSkgPSAocHV0U3RyTG4ucGxzZm9ybWF0KSAkIHBsc2hpc3NhbiB4IHkKICAgICAgICAgICAgICAgICAgbWggKHgseSkgPSAocHV0U3RyTG4ubXVsZm9ybWF0KSAkIG11bGhpc3NhbiB4IHkKCnBsc2hpc3NhbiBuIG0gPSAobiwgbSwgeCwgeSwgeCArIHkgKiAxMCkKICAgd2hlcmUKICAgICAgeCA9IG4gYG1vZGAgMTAgKyBtIGBtb2RgIDEwCiAgICAgIHkgPSBuIGBkaXZgIDEwICsgbSBgZGl2YCAxMAogICAgICAKcGxzZm9ybWF0IChuLG0seCx5LHopID0gKHplcm8ybnVsbC5jb25jYXQpIFsiICAiLG51bXcgbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbisgIixudW13IG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXIgKysgIiAgIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW13IHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4gIixudW13IHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGt4eiB4IHogenNwIG51bXcsIlxuIl0KICAgIAptdWxoaXNzYW4gbiBtID0gKG4sIG0sIHgsIHksIHh4LCB5eSwgeCArIHkgKiAxMCArIHh4ICogMTAgKyB5eSAqIDEwMCkKICAgd2hlcmUKICAgICAgeCA9IChuIGBtb2RgIDEwKSAqIChtIGBtb2RgIDEwKQogICAgICB5ID0gKG4gYGRpdmAgMTApICogKG0gYG1vZGAgMTApCiAgICAgIHh4ID0gKG4gYG1vZGAgMTApICogKG0gYGRpdmAgMTApCiAgICAgIHl5ID0gKG4gYGRpdmAgMTApICogKG0gYGRpdmAgMTApCiAgICAgIAptdWxmb3JtYXQgKG4sbSx4LHkseHgseXkseikgPSAoemVybzJudWxsLmNvbmNhdCkgWyIgICIsbnVtdyBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4qICIsbnVtdyBtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhciArKyAiICAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtdyB4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiAiLG51bXcgeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiAiLG51bXcgeHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIsbnVtdyB5eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hreHogeCB6IHpzcCBudW13LCJcbiJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApudW13IHggfCBsZW5ndGggKHNob3cgeCkgPT0gMSA9ICIgIiArKyBzaG93IHgKbnVtdyB4ID0gc2hvdyB4CiAgCnpzcCB4IHwgbGVuZ3RoIChzaG93IHgpID09IDMgPSBiYXIgKysgIiAiCnpzcCB4IHwgbGVuZ3RoIChzaG93IHgpID09IDQgPSBiYXIKenNwIHggPSBiYXIgKysgIiAgIiAgCgogICAgIApiYXIgPSAiXG4tLS0tLVxuIgoKemVybzJudWxsIFtdID0gW10KemVybzJudWxsIHhzIHwgdGFrZSBuIHhzID09IHMgPSB6ZXJvMm51bGwgKGRyb3AgbiB4cykKICAgd2hlcmUgCiAgICAgIHMgPSAiXG4gMCIKICAgICAgbiA9IGxlbmd0aCBzCnplcm8ybnVsbCB4cyB8IHRha2UgbiB4cyA9PSBzID0gemVybzJudWxsIChkcm9wIG4geHMpCiAgIHdoZXJlIAogICAgICBzID0gIlxuICAwIgogICAgICBuID0gbGVuZ3RoIHMKemVybzJudWxsIHhzIHwgdGFrZSBuIHhzID09IHMgPSB6ZXJvMm51bGwgKGRyb3AgbiB4cykKICAgd2hlcmUgCiAgICAgIHMgPSAiXG4gICAwIgogICAgICBuID0gbGVuZ3RoIHMKemVybzJudWxsIHhzIHwgdGFrZSBuIHhzID09IHMgPSBzICsrIHplcm8ybnVsbCAoZHJvcCBuIHhzKQogICB3aGVyZSAKICAgICAgcyA9IGJhciArKyAiICAgMCIKICAgICAgbiA9IGxlbmd0aCBzCnplcm8ybnVsbCAoeDp4cykgPSB4Onplcm8ybnVsbCB4cwoKY2hreHogeCB6IHMxIHMyIHwgeCA9PSB6ID0gIiIKY2hreHogeCB6IGYxIGYyID0gZjEgeiArKyBmMiB6Cg==