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

    +128

    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
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    data Mode = Start | Read | Skip | End
    data State = State Mode String String [String]
    
    space c = elem c [' ', '\n', '\r', '\f', '\t', '\v', '\160']
    
    end r     = State End "" "" r
    skip t r  = State Skip t "" r
    get t w r = State Read t w r
    start t   = State Start t "" []
    
    step (State Start at@(t:ts) w r)
    	| space t   = step $ skip at r
    	| otherwise = step $ get at w r
    
    step (State Read at@(t:ts) w r)
    	| space t   = step $ skip at $ r ++ [w]
    	| otherwise = step $ get ts (w ++ [t]) r
    
    step (State Skip at@(t:ts) _ r)
    	| space t   = step $ skip ts r
    	| otherwise = step $ get at "" r
    
    step (State Start "" _ r) = step $ end r
    step (State Read "" w r)  = step $ end $ r ++ [w]
    step (State Skip "" _ r)  = step $ end r
    
    step (State End _ _ r) = r
    
    words' text = step $ start text

    Решил все-таки выложить этот позор. Если есть предложения по улучшению - с радостью выслушаю.

    Запостил: Fai, 23 Ноября 2012

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

    • А чего тебя так по функциональным языкам вштырило? Ты же говорил, что они не нужны.
      Ответить
    • Конечный автомат... а зачем?
      Ответить
    • Имхо конченые автоматы устарели. Используй йелду. Только вот и не знаю, есть ли она в хаспекле
      Ответить
      • > Только вот и не знаю, есть ли она в хаспекле
        Зачем она в хаскеле, если тут и так все ленивое?
        Ответить
        • Решил я шахматный движок на хаскеле написать. Если, что посмотришь?
          Ответить
          • Выкладывай на гитхаб.
            Ответить
            • Вообще обычно на битбакете сижу, но ладно. Вот акк
              https://github.com/failuref

              Постучи в личку там.
              Ответить
              • А, ну я и на битбакет могу заглянуть да посрать в комментах. Было бы на что глядеть...
                Ответить
                • Уже есть. https://github.com/failuref/HaskellChess
                  Ответить
                  • Я вот думаю, присоединится ли к тебе или нет? Говнокодили бы вместе. Но признаюсь честно, шахматы работающие на идеон - это круто.
                    Ответить
                    • Присоединяйся, могу дать возможность прямого коммита.
                      Ответить
                • Ну что? В репозиторий говно уже рекой течет, а тебя все нет.
                  Ответить
                  • Уж полночь близится, а борманда все нет...

                    1) У многих людей есть другие занятия, помимо говнокодика;
                    2) Ну пока там не особо много кода, придираться особо не к чему;
                    3) Лови пулл риквест про displayBoard.
                    Ответить
                    • 2) Добавляю потихоньку.
                      3) Поймал.
                      Ответить
          • >Решил я шахматный движок на хаскеле написать.
            Чую на илитном хацкиле кода будет больше, чем в известном килобайтном шедевре, но он будет такой же непонятный. А еще ИИ будет слабее и медленее - иммутабельное мудачьё не может в скорость.
            Елси там конечно нет готовой функции - chess.

            Ибо смотрю в код а там какое-то очевидное гогно и копипаст.
            Это так и надо? Ведь line и столбец суть одинаковы.
            displayBoard :: Board -> String
            displayBoard b = displayBoard2 (snd yranges) where
            	displayBoard2 l
            		| l == (fst yranges) = displayLine l b
            		| otherwise          = displayLine l b ++ "\n" ++ displayBoard2 (pred l)
            
            displayLine :: Int -> Board -> String
            displayLine i b = displayLine2 (fst xranges) where
            	displayLine2 c 
            		| c == (snd xranges) = displayCell c i b
            		| otherwise 	     = displayCell c i b ++ displayLine2 (succ c)
            Ответить
            • в хксапеле используют конструктор, чтобы извлять данные из алгебраических типов.
              код почти один, а конструкторы разные, поэтому приходится копипастить
              Ответить
              • learnyouapastell
                Ответить
              • >в хксапеле
                >приходится копипастить
                Не верю. Либо кто-то что-то не осилил (в чем я гораздо больше уверен), либо хацкил и впрямь кал.
                >код почти один, а конструкторы разные
                Ну и нахуй тогда функцианальщина нужна? Если нельзя скомпоновать как надо?
                Ответить
                • bormand Только что #

                  Ну можно вот так например:
                  http://ideone.com/dD62bK
                  Ответить
                  • Поясните мысль. Что вы хотели про демон монстрировать? Я было сначала подумал, что вы типы решили эмитировать, указанием оного в первом элеменьте кортежа для простоты вытаскивания, как в клиспе или эрланге.
                    Ответить
                    • Здесь показано, как можно при желании убрать ту тонну копипаста с конструкторами.
                      Ответить
                      • >как можно при желании
                        При наличии элементарных зайчатков разума.
                        Гумнота и на хацкиле будет копипастить. Потому что головной мозг ей заменяет известная субстанция.
                        Ответить
                        • Сейчас будем искать, где тут копипаста:
                          Исправляем
                          http://ideone.com/pEVLy4
                          на
                          http://ideone.com/cReNkM
                          Чтобы не лазить по ссылкам выше, то код таков:
                          pieceFromFen :: Char -> Maybe Piece
                          pieceFromFen c
                              | isUpper c = liftM (Piece White) $ lookup c fenRMapping
                              | otherwise = liftM (Piece Black) $ lookup (toUpper c) fenRMapping
                          на
                          pieceFromFen :: Char -> Maybe Piece
                          pieceFromFen c = 
                                  liftM (fst $ f c) $ lookup (snd $ f c) fenRMapping where
                                          f c = if isUpper c then (Piece White, c) else (Piece Black, toUpper c)
                          В итоге заменили 2 строки похожего кода на 2 строки не похожего.
                          Ответить
                          • Это я к чему вообще, а к тому, что иногда лучше оставить копипасту и код будет более поддерживаемым.
                            Ответить
                      • Кстати не понял что там про копипасту конструкторов. Обычная работа с О(n) мапом.
                        Ты вот покажи на реальном примере, как убрать копипасту:
                        Вот типичный пример:
                        http://ideone.com/Fi3Uqv
                        data KoKoKo = Ko Int | KoKo Int | KoKoKo Int
                         
                        f (KoKoKo d) = show d
                        f (KoKo d) = show d
                        f (Ko d) = show d ++ "ko"
                         
                         
                        main = do 
                                print $ f $ Ko 5
                                print $ f $ KoKo 6
                                print $ f $ KoKoKo 7
                        Предложи способ убрать копипасту не считая случая введения отдельной функции извлечения, которая далеко не всегда пригодна для извлечения. Для полноты картины, представь, что функции f очень сложные для случая KoKo и KoKoKo.
                        Как видишь очевидные варианты не работают, тк хаскель заставляет копипастить:
                        http://ideone.com/IQlDov
                        f (_ d) = show d
                        f (Ko d) = show d ++ "ko"

                        http://ideone.com/UWFdtH
                        f | KoKoKo d | KoKo d = show d
                        f (Ko d) = show d ++ "ko"
                        Ответить
                        • Зачем на данном примере убирать копипасту? Здесь ветки разные, и их мало. А там енум распидорасили раскрыли, в котором и 50 вариантов могло быть.
                          Ответить
                          • >Зачем на данном примере убирать копипасту?
                            Ну пример маленький, чтобы не отвлекать от сути. То есть я правильно понимаю, убрать эту копипасту хацкель не позволяет?
                            Ответить
                            • > эту
                              Эту - нет.

                              > Для полноты картины, представь, что функции f очень сложные для случая KoKo и KoKoKo.
                              Были бы сложные и одинаковые - нужно было бы вынести в отдельную функцию (что впрочем тут и сделано, show это сложная функция).
                              Ответить
                          • > 50 вариантов могло быть
                            Да это понятно, но это лишь от убогости мышления копипастера. Любой вменяемый человек написал бы вменяемо.
                            Ответить
            • > Чую на илитном хацкиле кода будет больше
              Конечно больше. Я плохо хаскель знаю.

              > А еще ИИ будет слабее и медленее
              Естественно

              > Ибо смотрю в код а там какое-то очевидное гогно и копипаст.
              Я просто как начинаю гнаться за красивым кодом в итоге все стираю и переписываю. Так что решил сразу писать похуйкак.

              И да, bormand уже поправил код.
              Ответить
    • Вот так сойдет? http://ideone.com/Wd0cxx
      Ответить
      • Неплохо. Поразбираюсь. Но разве мой вариант не ленивый?
        Ответить
        • Нет:
          http://ideone.com/dlZZCH
          http://ideone.com/lSdwuQ
          Ответить
          • Ничего себе. Даже одно слово не вытащить. Спасибо.
            Ответить
    • если не Data.Char, то хотя бы можно (`elem` " \n\r\f\t\v\160")

      https://bitbucket.org/dibblego/haskell-course L03
      Ответить
      • поменяли... сейчас L05
        Ответить
      • > (`elem` " \n\r\f\t\v\160")

        Концептуально это отделные символы. Такая запись будет запутывать.
        Ответить
        • `elem` строка <=> входит в строку, где "концептуальное" запутывание?
          Ответить
          • Запутывание из-за того, что символы визуально соединены в одну строку.
            Ответить

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