import Data
.Maybe (isJust
, listToMaybe
) -- Find linear combinations of positive integers
-- If we've made it to the end with zero left, good!
solve 0 [] = Just []
-- Otherwise, this way isn't the way to go.
solve _ [] = Nothing
-- If one of the elements of the input list is zero, just multiply that element by one.
solve n (0:xs) = case solve n xs of
Nothing -> Nothing
Just ys -> Just (1:ys)
solve n (x:xs) = listToMaybe -- take first solution if it exists
. map (\
(m
, Just ys
) -> m:ys
) -- put multiplier at front of list . filter (isJust
. snd) -- remove nonsolutions . zip [1 ..] -- tuple in the multiplier . map (\ m
-> solve
(n
- m
) xs
) -- use each multiple $ [x, x + x .. n] -- the multiples of x up to n
main
= mapM_ print [solve
11 [1, 2], solve
1 [1, 2]]
aW1wb3J0IERhdGEuTWF5YmUgKGlzSnVzdCwgbGlzdFRvTWF5YmUpCi0tIEZpbmQgbGluZWFyIGNvbWJpbmF0aW9ucyBvZiBwb3NpdGl2ZSBpbnRlZ2Vycwpzb2x2ZSA6OiBJbnRlZ2VyIC0+IFtJbnRlZ2VyXSAtPiBNYXliZSBbSW50ZWdlcl0KLS0gSWYgd2UndmUgbWFkZSBpdCB0byB0aGUgZW5kIHdpdGggemVybyBsZWZ0LCBnb29kIQpzb2x2ZSAwIFtdICAgICA9IEp1c3QgW10KLS0gT3RoZXJ3aXNlLCB0aGlzIHdheSBpc24ndCB0aGUgd2F5IHRvIGdvLgpzb2x2ZSBfIFtdICAgICA9IE5vdGhpbmcKLS0gSWYgb25lIG9mIHRoZSBlbGVtZW50cyBvZiB0aGUgaW5wdXQgbGlzdCBpcyB6ZXJvLCBqdXN0IG11bHRpcGx5IHRoYXQgZWxlbWVudCBieSBvbmUuCnNvbHZlIG4gKDA6eHMpID0gY2FzZSBzb2x2ZSBuIHhzIG9mCiAgICAgICAgICAgICAgICAgICAgICBOb3RoaW5nIC0+IE5vdGhpbmcKICAgICAgICAgICAgICAgICAgICAgIEp1c3QgeXMgLT4gSnVzdCAoMTp5cykKc29sdmUgbiAoeDp4cykgPSAgIGxpc3RUb01heWJlICAgICAgICAgICAgICAgICAgICAtLSB0YWtlIGZpcnN0IHNvbHV0aW9uIGlmIGl0IGV4aXN0cwogICAgICAgICAgICAgICAgIC4gbWFwIChcIChtLCBKdXN0IHlzKSAtPiBtOnlzKSAgIC0tIHB1dCBtdWx0aXBsaWVyIGF0IGZyb250IG9mIGxpc3QKICAgICAgICAgICAgICAgICAuIGZpbHRlciAoaXNKdXN0IC4gc25kKSAgICAgICAgICAtLSByZW1vdmUgbm9uc29sdXRpb25zCiAgICAgICAgICAgICAgICAgLiB6aXAgWzEgLi5dICAgICAgICAgICAgICAgICAgICAgLS0gdHVwbGUgaW4gdGhlIG11bHRpcGxpZXIKICAgICAgICAgICAgICAgICAuIG1hcCAoXCBtIC0+IHNvbHZlIChuIC0gbSkgeHMpICAtLSB1c2UgZWFjaCBtdWx0aXBsZQogICAgICAgICAgICAgICAgICQgW3gsIHggKyB4IC4uIG5dICAgICAgICAgICAgICAgIC0tIHRoZSBtdWx0aXBsZXMgb2YgeCB1cCB0byBuCgptYWluID0gbWFwTV8gcHJpbnQgW3NvbHZlIDExIFsxLCAyXSwgc29sdmUgMSBbMSwgMl1d