ちょっとした楽しみとして、まったく異なるフレーバーのソリューションをまとめてみようと思いました。L
数値のリストの代わりに、数値が減少したE
とき、同じままだったG
とき、または数値が大きくなったときの文字列があると想像してみてください。三角形であるということは、その文字列が通常の言語であるかどうかをテストすることを意味します[LE]*[GE]*
。それがこのソリューションで行うことです。正規表現を作成し、数値の要約が一致するかどうかを確認します。私はregex-applicativeを使用していますが、必要に応じて、代わりにお気に入りの正規表現ライブラリを使用できます。
{-# LANGUAGE NoMonomorphismRestriction #-}
import Data.Maybe
import Text.Regex.Applicative
triangular = many (sym LT <|> sym EQ) *> many (sym GT <|> sym EQ)
summarize xs = zipWith compare xs (tail xs)
ex = isJust . match triangular . summarize
ghci のすべての例で試すことができます。
*Main> map ex [[2,4,5,7,4,3], [], [1], [1, 2, 3], [3, 2, 1], [1, 2, 2], [2, 2, 1]]
[True,True,True,True,True,True,True]
*Main> ex [2,3,4,3,2,3,4] -- plus one I made up to check it's not const True
False