1. Куча / Говнокод #15362

    +127

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    import Data.List
    import Data.Maybe
    checkBraces "" = True
    checkBraces e = checkBrace e [] where
    	openBraces = "({["
    	closeBraces = ")}]"
    	braceToBrace fromBraces toBraces brace = toBraces!!(fromJust $ elemIndex brace fromBraces)
    	otcBrace = braceToBrace openBraces closeBraces
    	checkBrace (c:e) s | elem c openBraces = checkBrace e ((otcBrace c):s)
    	checkBrace (c:e) (h:s) | (elem c closeBraces) && (h==c) = checkBrace e s
    	checkBrace (_:e) _ = False
    	checkBrace [] [] = True
    	checkBrace [] _ = False
    main = mapM_ (print . checkBraces) bracesExpressionExamples where
    	bracesExpressionExamples = 
    		[
    			"({[{}]{}[]})",
    			"({}}{[{}]{}[]})",
    			"({[{}]{}[]}",
    			"({[{}]{}]})",
    			"({[{}{}[]})",
    			"",
    			"{}"
    		]

    http://ideone.com/sZ9tiN
    Кот с собеседований.
    Проверка правильности расстановки скобок для каждого выражения из bracesExpressionExamples.

    Запостил: USB, 05 Марта 2014

    Комментарии (5) RSS

    • Стоит брать?
      Ответить
    • навскидку
      > openBraces = "({[" ... лучше [('(',')'), ... ] или свой Pair '(' ')'
      не было бы неидиоматичного !! + elemIndex, непонятно, почему не используются преимущества языка

      для сравнения (правда древний "hugs"): http://codepad.org/8GKpGQws - тут тоже пропущено, но если код не одноразовый, должны быть сигнатуры
      Ответить
      • import Control.Applicative ((<$))
        import Control.Monad (forM_)
        import Text.ParserCombinators.Parsec
        -- import Data.Function (on)
        (f `on` g) x y = g x `f` g y
        
        balanced = "ok" <$ (many $ next '(' ')' balanced
                               <|> next '{' '}' balanced
                               <|> next '[' ']' balanced
                           )
            where next = between `on` char
        
        
        main = forM_ examples $ \input -> do
          putStrLn $ "\nvalidating " ++ input ++ "..."
          parseTest balanced input
        
        examples = ["({[{}]{}[]})",
        	"({}}{[{}]{}[]})",
        	"({[{}]{}[]}",
        	"({[{}]{}]})",
        	"({[{}{}[]})",
        	"",
        	"{}"]
        Вот это код! Тебя бы я взял.
        Ответить
      • > !! + elemIndex
        Согласен. Очень чужеродно.
        Вот если бы он написал как вы говорите - ещё можно было бы подумать его взять:
        import Data.List
        import Data.Maybe
        import Data.Map (keys, fromList, elems) 
        import Data.Map as M (lookup)
        checkBraces "" = True
        checkBraces e = checkBrace e [] where
        	braceToBraceMap = fromList [('(',')'), ('{','}'), ('[',']')]
        	openBraces = keys braceToBraceMap
        	closeBraces = elems braceToBraceMap
        	braceToBrace brace = fromJust $ M.lookup brace braceToBraceMap
        	checkBrace (c:e) s | elem c openBraces = checkBrace e ((braceToBrace c):s)
        	checkBrace (c:e) (h:s) | (elem c closeBraces) && (h==c) = checkBrace e s
        	checkBrace (_:e) _ = False
        	checkBrace "" [] = True
        	checkBrace "" _ = False
        main = mapM_ (print . checkBraces) bracesExpressionExamples where
        	bracesExpressionExamples = 
        		[
        			"({[{}]{}[]})",
        			"({}}{[{}]{}[]})",
        			"({[{}]{}[]}",
        			"({[{}]{}]})",
        			"({[{}{}[]})",
        			"",
        			"{}"
        		]

        http://ideone.com/1OIrFf
        А так он даже умение пользоваться монадами не продемонстрировал.
        Ещё заметьте, в своем коде случаи:
        checkBrace "" [] = True
        checkBrace "" _ = False
        вместо "" он написал [], что явно не так читабильно
        Ответить

    Добавить комментарий