module Main where
import Text.Printf (printf)
data ExtInt
= NegInfty
| Normal
Int | PosInfty
deriving (Show, Eq, Ord)
adjacentZipper
:: (a
-> a
-> Bool) -> [a
] -> ([a
], [a
])adjacentZipper cmp items = go [] items
where go front [] = (front, [])
go [] (x:rest) = go [x] rest
go ys@(y:_) xs@(x:rest) = if cmp x y then go (x:ys) rest else (ys, xs)
almostIncreasing nums
= check
([NegInfty
] ++ map Normal nums
++ [PosInfty
]) where check items = case adjacentZipper (>) items of
(_, []) -> True
((x2:x1:_), right@(y1:y2:_)) -> (x1 < y1 || x2 < y2) && sorted right
sorted
= null . snd . adjacentZipper
(>)
main = do
printCase []
printCase [0, 1]
printCase [1, 0]
printCase [5, 1, 2, 3]
printCase [1, 2, 0, 3]
printCase [1, 5, 2, 3]
printCase [1, 5, 0, 2]
printCase [3, 2, 1, 0]
where printCase xs
= printf
"%s => %s\n" (show xs
) (show $ almostIncreasing xs
)
bW9kdWxlIE1haW4gd2hlcmUKCmltcG9ydCBUZXh0LlByaW50ZiAocHJpbnRmKQoKZGF0YSBFeHRJbnQgPSBOZWdJbmZ0eSB8IE5vcm1hbCBJbnQgfCBQb3NJbmZ0eSBkZXJpdmluZyAoU2hvdywgRXEsIE9yZCkKCmFkamFjZW50WmlwcGVyIDo6IChhIC0+IGEgLT4gQm9vbCkgLT4gW2FdIC0+IChbYV0sIFthXSkKYWRqYWNlbnRaaXBwZXIgY21wIGl0ZW1zID0gZ28gW10gaXRlbXMKICB3aGVyZSBnbyBmcm9udCBbXSA9IChmcm9udCwgW10pCiAgICAgICAgZ28gW10gKHg6cmVzdCkgPSBnbyBbeF0gcmVzdAogICAgICAgIGdvIHlzQCh5Ol8pIHhzQCh4OnJlc3QpID0gaWYgY21wIHggeSB0aGVuIGdvICh4OnlzKSByZXN0IGVsc2UgKHlzLCB4cykKCmFsbW9zdEluY3JlYXNpbmcgOjogW0ludF0gLT4gQm9vbAphbG1vc3RJbmNyZWFzaW5nIG51bXMgPSBjaGVjayAoW05lZ0luZnR5XSArKyBtYXAgTm9ybWFsIG51bXMgKysgW1Bvc0luZnR5XSkKICB3aGVyZSBjaGVjayBpdGVtcyA9IGNhc2UgYWRqYWNlbnRaaXBwZXIgKD4pIGl0ZW1zIG9mCiAgICAgICAgICAgICAgICAgICAgICAgIChfLCBbXSkgLT4gVHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAoKHgyOngxOl8pLCByaWdodEAoeTE6eTI6XykpIC0+ICh4MSA8IHkxIHx8IHgyIDwgeTIpICYmIHNvcnRlZCByaWdodAogICAgICAgIHNvcnRlZCA9IG51bGwgLiBzbmQgLiBhZGphY2VudFppcHBlciAoPikKCm1haW4gOjogSU8gKCkKbWFpbiA9IGRvCiAgcHJpbnRDYXNlIFtdCiAgcHJpbnRDYXNlIFswLCAxXQogIHByaW50Q2FzZSBbMSwgMF0KICBwcmludENhc2UgWzUsIDEsIDIsIDNdCiAgcHJpbnRDYXNlIFsxLCAyLCAwLCAzXQogIHByaW50Q2FzZSBbMSwgNSwgMiwgM10KICBwcmludENhc2UgWzEsIDUsIDAsIDJdCiAgcHJpbnRDYXNlIFszLCAyLCAxLCAwXQogICAgd2hlcmUgcHJpbnRDYXNlIHhzID0gcHJpbnRmICIlcyA9PiAlc1xuIiAoc2hvdyB4cykgKHNob3cgJCBhbG1vc3RJbmNyZWFzaW5nIHhzKQ==
[] => True
[0,1] => True
[1,0] => True
[5,1,2,3] => True
[1,2,0,3] => True
[1,5,2,3] => True
[1,5,0,2] => False
[3,2,1,0] => False