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+IEJvb2wKaXNFeGl0Q2FsbCBzID0gcyA9PSAiZXhpdCIKCmF0YW1hTGlzdCwKICAgIGF0YW1hTWFjaGlMaXN0LAogICAganVudHN1TGlzdCwKICAgIGp1bnRzdU1hY2hpTGlzdCwKICAgIGtvdXRzdUxpc3QsCiAgICBrb3V0c3VNYWNoaUxpc3QsCiAgICBtZW50c3VMaXN0LAogICAgbWVudHN1TWFjaGlMaXN0CiAgICA6OiBbW0ludF1dCgphdGFtYUxpc3QgPSBbW24sIG5dIHwgbiA8LSBbMSAuLiA5XV0KCmF0YW1hTWFjaGlMaXN0ID0gW1tuLCAtbl0gfCBuIDwtIFsxIC4uIDldXQoKanVudHN1TGlzdCA9IFtbbiwgbisxLCBuKzJdIHwgbiA8LSBbMSAuLiA3XV0KCmp1bnRzdU1hY2hpTGlzdCA9IFtbLW4sIG4rMSwgbisyXSB8IG4gPC0gWzEgLi4gN11dCiAgICAgICAgICAgICAgICsrIFtbbiwgLShuKzEpLCBuKzJdIHwgbiA8LSBbMSAuLiA3XV0KICAgICAgICAgICAgICAgKysgW1tuLCBuKzEsIC0obisyKV0gfCBuIDwtIFsxIC4uIDddXQoKa291dHN1TGlzdCA9IFtbbiwgbiwgbl0gfCBuIDwtIFsxIC4uIDldXQoKa291dHN1TWFjaGlMaXN0ID0gW1tuLCBuLCAtbl0gfCBuIDwtIFsxIC4uIDldXQoKbWVudHN1TGlzdCA9IGp1bnRzdUxpc3QgKysga291dHN1TGlzdAoKbWVudHN1TWFjaGlMaXN0ID0ganVudHN1TWFjaGlMaXN0ICsrIGtvdXRzdU1hY2hpTGlzdAoKaXNWYWxpZE1hY2hpIDo6IFtbSW50XV0gLT4gQm9vbAppc1ZhbGlkTWFjaGkgbSA9IGFsbCAoXGcgLT4gbGVuZ3RoIGcgPD0gNCkgKGdyb3VwIChzb3J0IChtYXAgYWJzIChjb25jYXQgbSkpKSkKCm1hY2hpTGlzdCA6OiBbW1tJbnRdXV0KbWFjaGlMaXN0ID0gZmlsdGVyIGlzVmFsaWRNYWNoaQogICAgICAgICAgICAgICAgICAgKFtbYXRhbWEsIG1lbnRzdTEsIG1lbnRzdTIsIG1lbnRzdTMsIG1lbnRzdTRdCiAgICAgICAgICAgICAgICAgICB8IGF0YW1hIDwtIGF0YW1hTWFjaGlMaXN0CiAgICAgICAgICAgICAgICAgICAsIG1lbnRzdTEgPC0gbWVudHN1TGlzdAogICAgICAgICAgICAgICAgICAgLCBtZW50c3UyIDwtIG1lbnRzdUxpc3QKICAgICAgICAgICAgICAgICAgICwgbWVudHN1MyA8LSBtZW50c3VMaXN0CiAgICAgICAgICAgICAgICAgICAsIG1lbnRzdTQgPC0gbWVudHN1TGlzdF0KICAgICAgICAgICAgICAgICsrIFtbYXRhbWEsIG1lbnRzdTEsIG1lbnRzdTIsIG1lbnRzdTMsIG1lbnRzdTRdCiAgICAgICAgICAgICAgICAgICB8IGF0YW1hIDwtIGF0YW1hTGlzdAogICAgICAgICAgICAgICAgICAgLCBtZW50c3UxIDwtIG1lbnRzdU1hY2hpTGlzdAogICAgICAgICAgICAgICAgICAgLCBtZW50c3UyIDwtIG1lbnRzdUxpc3QKICAgICAgICAgICAgICAgICAgICwgbWVudHN1MyA8LSBtZW50c3VMaXN0CiAgICAgICAgICAgICAgICAgICAsIG1lbnRzdTQgPC0gbWVudHN1TGlzdF0pCgppc01hdGNoTWFjaGkgOjogU3RyaW5nIC0+IFtbSW50XV0gLT4gQm9vbAppc01hdGNoTWFjaGkgcyBtID0gc29ydCBzCiAgICAgICAgICAgICAgICA9PSBjb25jYXQgKG1hcCBzaG93IChzb3J0IChmaWx0ZXIgKFxuIC0+IG4gPiAwKSAoY29uY2F0IG0pKSkpCgp0YWtlTWFjaGkgOjogU3RyaW5nIC0+IFtTdHJpbmddCnRha2VNYWNoaSBzID0gbnViIChtYXAgKFxtIC0+IGNvbmNhdCAoc29ydCAobWFwIG1hY2hpVG9TdHJpbmcgbSkpKSAoZmlsdGVyIChcbSAtPiBpc01hdGNoTWFjaGkgcyBtKSBtYWNoaUxpc3QpKQoKbWFjaGlUb1N0cmluZyA6OiBbSW50XSAtPiBTdHJpbmcKbWFjaGlUb1N0cmluZyBtID0KICAgIGlmIGFueSAoXG4gLT4gbiA8IDApIG0gdGhlbgogICAgICAgICJbIiArKyBjb25jYXQgKG1hcCBzaG93IChmaWx0ZXIgKFxuIC0+IG4gPiAwKSBtKSkgKysgIl0iCiAgICBlbHNlCiAgICAgICAgIigiICsrIGNvbmNhdCAobWFwIHNob3cgbSkgKysgIikiCg==