module Main (main) where
import Data.List (group, nub, sort)
main = do
if isValid input then
else if isExitCall input then
else
&& all (\c
-> '1' <= c
&& c
<= '9') s
&& all (\g
-> length g
<= 4) (group
(sort s
))
isExitCall s = s == "exit"
atamaList,
atamaMachiList,
juntsuList,
juntsuMachiList,
koutsuList,
koutsuMachiList,
mentsuList,
mentsuMachiList
atamaList = [[n, n] | n <- [1 .. 9]]
atamaMachiList = [[n, -n] | n <- [1 .. 9]]
juntsuList = [[n, n+1, n+2] | n <- [1 .. 7]]
juntsuMachiList = [[-n, n+1, n+2] | n <- [1 .. 7]]
++ [[n, -(n+1), n+2] | n <- [1 .. 7]]
++ [[n, n+1, -(n+2)] | n <- [1 .. 7]]
koutsuList = [[n, n, n] | n <- [1 .. 9]]
koutsuMachiList = [[n, n, -n] | n <- [1 .. 9]]
mentsuList = juntsuList ++ koutsuList
mentsuMachiList = juntsuMachiList ++ koutsuMachiList
machiList
= filter isValidMachi
[[atama, mentsu1, mentsu2, mentsu3, mentsu4]
| atama <- atamaMachiList
, mentsu1 <- mentsuList
, mentsu2 <- mentsuList
, mentsu3 <- mentsuList
, mentsu4 <- mentsuList]
++ [[atama, mentsu1, mentsu2, mentsu3, mentsu4]
| atama <- atamaList
, mentsu1 <- mentsuMachiList
, mentsu2 <- mentsuList
, mentsu3 <- mentsuList
, mentsu4 <- mentsuList]
isMatchMachi s m = sort s
takeMachi s
= nub
(map (\m
-> concat (sort
(map machiToString m
))) (filter (\m
-> isMatchMachi s m
) machiList
))
machiToString m =
if any (\n
-> n
< 0) m
then else
bW9kdWxlIE1haW4gKG1haW4pIHdoZXJlCgppbXBvcnQgRGF0YS5MaXN0IChncm91cCwgbnViLCBzb3J0KQoKbWFpbiA6OiBJTyAoKQptYWluID0gZG8KICAgIGlucHV0IDwtIGdldExpbmUKICAgIGlmIGlzVmFsaWQgaW5wdXQgdGhlbgogICAgICAgIG1hcE1fIHB1dFN0ckxuICh0YWtlTWFjaGkgaW5wdXQpCiAgICBlbHNlIGlmIGlzRXhpdENhbGwgaW5wdXQgdGhlbgogICAgICAgIHB1dFN0ckxuICJieWUiCiAgICBlbHNlCiAgICAgICAgcHV0U3RyTG4gImludmFsaWQiID4+IG1haW4KCmlzVmFsaWQgOjogU3RyaW5nIC0+IEJvb2wKaXNWYWxpZCBzID0gbGVuZ3RoIHMgPT0gMTMKICAgICAgICAgJiYgYWxsIChcYyAtPiAnMScgPD0gYyAmJiBjIDw9ICc5JykgcwogICAgICAgICAmJiBhbGwgKFxnIC0+IGxlbmd0aCBnIDw9IDQpIChncm91cCAoc29ydCBzKSkKCmlzRXhpdENhbGwgOjogU3RyaW5nIC0+IEJvb2wKaXNFeGl0Q2FsbCBzID0gcyA9PSAiZXhpdCIKCmF0YW1hTGlzdCwKICAgIGF0YW1hTWFjaGlMaXN0LAogICAganVudHN1TGlzdCwKICAgIGp1bnRzdU1hY2hpTGlzdCwKICAgIGtvdXRzdUxpc3QsCiAgICBrb3V0c3VNYWNoaUxpc3QsCiAgICBtZW50c3VMaXN0LAogICAgbWVudHN1TWFjaGlMaXN0CiAgICA6OiBbW0ludF1dCgphdGFtYUxpc3QgPSBbW24sIG5dIHwgbiA8LSBbMSAuLiA5XV0KCmF0YW1hTWFjaGlMaXN0ID0gW1tuLCAtbl0gfCBuIDwtIFsxIC4uIDldXQoKanVudHN1TGlzdCA9IFtbbiwgbisxLCBuKzJdIHwgbiA8LSBbMSAuLiA3XV0KCmp1bnRzdU1hY2hpTGlzdCA9IFtbLW4sIG4rMSwgbisyXSB8IG4gPC0gWzEgLi4gN11dCiAgICAgICAgICAgICAgICsrIFtbbiwgLShuKzEpLCBuKzJdIHwgbiA8LSBbMSAuLiA3XV0KICAgICAgICAgICAgICAgKysgW1tuLCBuKzEsIC0obisyKV0gfCBuIDwtIFsxIC4uIDddXQoKa291dHN1TGlzdCA9IFtbbiwgbiwgbl0gfCBuIDwtIFsxIC4uIDldXQoKa291dHN1TWFjaGlMaXN0ID0gW1tuLCBuLCAtbl0gfCBuIDwtIFsxIC4uIDldXQoKbWVudHN1TGlzdCA9IGp1bnRzdUxpc3QgKysga291dHN1TGlzdAoKbWVudHN1TWFjaGlMaXN0ID0ganVudHN1TWFjaGlMaXN0ICsrIGtvdXRzdU1hY2hpTGlzdAoKaXNWYWxpZE1hY2hpIDo6IFtbSW50XV0gLT4gQm9vbAppc1ZhbGlkTWFjaGkgbSA9IGFsbCAoXGcgLT4gbGVuZ3RoIGcgPD0gNCkgKGdyb3VwIChzb3J0IChtYXAgYWJzIChjb25jYXQgbSkpKSkKCm1hY2hpTGlzdCA6OiBbW1tJbnRdXV0KbWFjaGlMaXN0ID0gZmlsdGVyIGlzVmFsaWRNYWNoaQogICAgICAgICAgICAgICAgICAgW1thdGFtYSwgbWVudHN1MSwgbWVudHN1MiwgbWVudHN1MywgbWVudHN1NF0KICAgICAgICAgICAgICAgICAgIHwgYXRhbWEgPC0gYXRhbWFNYWNoaUxpc3QKICAgICAgICAgICAgICAgICAgICwgbWVudHN1MSA8LSBtZW50c3VMaXN0CiAgICAgICAgICAgICAgICAgICAsIG1lbnRzdTIgPC0gbWVudHN1TGlzdAogICAgICAgICAgICAgICAgICAgLCBtZW50c3UzIDwtIG1lbnRzdUxpc3QKICAgICAgICAgICAgICAgICAgICwgbWVudHN1NCA8LSBtZW50c3VMaXN0XQogICAgICAgICAgICAgICAgKysgW1thdGFtYSwgbWVudHN1MSwgbWVudHN1MiwgbWVudHN1MywgbWVudHN1NF0KICAgICAgICAgICAgICAgICAgIHwgYXRhbWEgPC0gYXRhbWFMaXN0CiAgICAgICAgICAgICAgICAgICAsIG1lbnRzdTEgPC0gbWVudHN1TWFjaGlMaXN0CiAgICAgICAgICAgICAgICAgICAsIG1lbnRzdTIgPC0gbWVudHN1TGlzdAogICAgICAgICAgICAgICAgICAgLCBtZW50c3UzIDwtIG1lbnRzdUxpc3QKICAgICAgICAgICAgICAgICAgICwgbWVudHN1NCA8LSBtZW50c3VMaXN0XQoKaXNNYXRjaE1hY2hpIDo6IFN0cmluZyAtPiBbW0ludF1dIC0+IEJvb2wKaXNNYXRjaE1hY2hpIHMgbSA9IHNvcnQgcwogICAgICAgICAgICAgICAgPT0gY29uY2F0IChtYXAgc2hvdyAoc29ydCAoZmlsdGVyIChcbiAtPiBuID4gMCkgKGNvbmNhdCBtKSkpKQoKdGFrZU1hY2hpIDo6IFN0cmluZyAtPiBbU3RyaW5nXQp0YWtlTWFjaGkgcyA9IG51YiAobWFwIChcbSAtPiBjb25jYXQgKHNvcnQgKG1hcCBtYWNoaVRvU3RyaW5nIG0pKSkgKGZpbHRlciAoXG0gLT4gaXNNYXRjaE1hY2hpIHMgbSkgbWFjaGlMaXN0KSkKCm1hY2hpVG9TdHJpbmcgOjogW0ludF0gLT4gU3RyaW5nCm1hY2hpVG9TdHJpbmcgbSA9CiAgICBpZiBhbnkgKFxuIC0+IG4gPCAwKSBtIHRoZW4KICAgICAgICAiWyIgKysgY29uY2F0IChtYXAgc2hvdyAoZmlsdGVyIChcbiAtPiBuID4gMCkgbSkpICsrICJdIgogICAgZWxzZQogICAgICAgICIoIiArKyBjb25jYXQgKG1hcCBzaG93IG0pICsrICIpIgo=