Куча говна / Говнокод #15362 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 USB, (Updated )

Комментарии (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
      вместо "" он написал [], что явно не так читабильно
      Ответить

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

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8