1. Haskell / Говнокод #17746

    −99

    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
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    --Поиск минимальной выпуклой оболочки
    import Data.List; import Data.Ord
    --общие функции и типы
    data Point = P{x::Float,y::Float}
    	deriving (Show,Eq) 
    	
    getRotate a b c = baX * cbY - baY * cbX
    	where baX = x b - x a; baY = y b - y a;
    		  cbX = x c - x b; cbY = y c - y b;
    		 
    sortFunc a b c 
    	|k < 0  = LT
    	|k == 0 = compare (long a c) (long a b) 
    	|k > 0  = GT
    		where k = getRotate a b c
    
    long a b = (x b - x a)*(x b - x a) + (y b - y a)*(y b - y a)
    		
    getLeftPoint = minimumBy (comparing x)
    --Джарвис
    getMBOJarvis l = mboJ fp l fp
    	where fp = getLeftPoint l		
    		
    mboJ current list fp 
    	|getRotate current next fp > 0   = []
    	|True                            = current : mboJ next listWOC fp
    		where listWOC = filter ((/=)current) list;
    			  next    = minimumBy (sortFunc current) listWOC;
    --Грехем			
    getMBOGragam = tail.throwGraham.sortGraham 
    
    sortGraham list = fp:sortBy (sortFunc fp) list
    	where  fp = getLeftPoint list
    		   
    throwGraham (f:s:t) = mboG (s:f:[]) t
    		   
    mboG fs@(f:s:st) sn@(h:t)
    	|sortFunc s f h == GT = mboG (s:st) sn
    	|True                 = mboG(h:fs) t
    	
    mboG fs@(f:st) sn@(h:t)   = mboG(h:fs) t
    	
    mboG l [] = l
    --тесты		     
    testList1 = [P 0 (-1), P (-1) 0, P 0 1,P 1 0,P (-0.5) (-0.5),P 0.5 (-0.5),P (-0.5) 0.5,P 0.5 0.5,P 0 0]
    		  
    testList2 = [P 0 0, P 1 0, P 0 1,P 2 0,P 1 1,P 0 2,P 2 1,P 1 2,P 2 2]
    	
    	
    testJ1  = mapM_ print $ getMBOJarvis testList1		
    		
    testG1  = mapM_ print $ getMBOGragam testList1
    
    testJ2  = mapM_ print $ getMBOJarvis testList2		
    		
    testG2  = mapM_ print $ getMBOGragam testList2

    Haskell
    [сарказм]
    Как я могу идти против моды - не заливать этих французских лаб и не выпивать чаю?

    Выкладываю, что бы порадовать своего кота Барсика. Барсик, покойся с миром.

    А спонсор этого говна - компания "Потролль препода". "Потролль препода" - пиши лабы на хаскелле
    [/сарказм]

    Запостил: kegdan, 07 Марта 2015

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

    • Унижайте меня, доминируйте надо мной (то есть хвалите, конечно хвалите!)
      Ответить
      • Траллить препода на хаскеле - самый правильный путь использования хаски что я видел. Уважуха! В такие моменты жалко что уже не в инсте. Может ради этого на полгодика поступить? Афтор пищи есчо
        Ответить
        • Оно того стоит ^_^
          Ответить
        • я какой-то хелловорлд сдавал на хаски. Но намерения потроллить не было, а преподу было все равно.
          Ответить
          • >>Но намерения потроллить не было, а преподу было все равно.

            Да и у меня основная цель - не атрофировать фунцианальщину.
            Ответить
          • Я хреначил лабы по вычам на окамле. Потому что это приятно.
            Ответить
            • пирфомансом с крестоносцами не мерялись?

              Вообще на окамле довольно просто лабы писать, там ведь от эффектов никто не ограждает, пиши себе в матрицы сколько влезет, и производительность предсказуемая.
              С хацкелем хардкорнее - там половину нормальных алгоритмов (классические линейные строковые вроде КМП, обходы графов, преобразования матриц, деревья фенвика, тыщи их) без монады ST не изобразишь, а ленивость добавляет веселья при оптимизации.
              Ответить
              • Не мерялся. Факультет не прогерский, кодить всё равно почти никто не умеет. А лабы такие, что максимальный перформанс достигается использованием MKL.
                Ответить
    • > getMBOJarvis
      OK, Jarvis
      Ответить
    • На меня все тут наезжали, что я сигнатуры функций не указывал. А по мне норм без них, олол ниасиляторы
      Ответить
    • О видно сразу чувак понимает что такое фиксированная точка.
      Ответить
    • 1) Graham
      2) Используй otherwise
      3) Почему s : f : [] вместо [s, f] ?
      4) Почему ((/=) current) вместо (current /=) ?
      Ответить
      • otherwise - просто синоним великой Истины, но писать его дольше
        3 и 4 - хз, на автомате писал
        Ответить
        • > на автомате писал
          кофейном?
          Ответить
          • > > на автомате писал
            > кофейном?
            на детерминированном или недетерминированном кофейном автомате?
            Ответить
            • На детерминированном кофейном автомате калашникова.
              Ответить
              • На детерминированном кофейном игровом автомате калашникова.
                Ответить
                • Сдаюсь, ты выиграл.
                  Ответить
                  • А как же иерархический нелокальный детерминированый кофейный игровой автомат Калашникова?
                    Ответить
                    • А таких не бывает.
                      Ответить
                    • Иерархический нелокальный детерминированый кофейный игровой автомат Калашникова в третьей нормальной форме Кегдана-Лейбница.
                      Ответить
                      • Лейбница - чисто из жалости - плакался, просился, жалко мне стало мужика
                        Ответить
                      • Борманду больше кофе не наливать.
                        Ответить
    • Кто здесь?!
      Ответить
    • Ты же с ФИнфа?

      Это была лаба по вычислительной геометрии?
      Удалось потроллить? :)
      Ответить
      • В прошлом семе не вышло (зато преподаватель проникся ко мне добром), а в этом - еще не сдавал, кто знает как оно выйдет
        Есть такое
        Ответить
    • Ждем реализацию на брейнфаке.
      Ответить
      • Подозреваю что сейчас те кто писали лабы на брейнфаке уже давно сами стали преподами.

        С хацкелом тоже самое. Пришёл выебщик сдавать лабу на экзотическом языке, и сходу получил десяток колких вопросов.
        Ответить
    • Et tu, kegdan
      Ответить
    • Потролль препода — пиши лабы на J.
      http://code.jsoftware.com/wiki/Studio/IdiosyncraticIntroduction
      Ответить
      • Он потом и писал на J (х.з. лабы или нет, но сюда часто постил).
        Ответить
        • Чот я ни видел. Где-то в куче, наверное ?
          А вообще, мне нравится loopless code, но синтаксис J — ет писдес
          Ответить
      • В моих постах много Джея. Даже компилятор брейнфака на J
        Ответить
        • Хуясэ ты упоротый.
          Во чьо компилил? В ДЖэй ?
          Ответить
          • Просто выполнял. Не транслятор же
            Ответить
            • Тогда это был интерпретатор.
              Ответить
            • > транслятор
              1i #include <stdio.h> \
              int main() { unsigned char buf[65536] = {0}, *c = buf;
              $a return 0; }
              s/\+/(*c)++;/g
              s/\-/(*c)--;/g
              s/\[/while(*c){/g
              s/\]/}/g
              s/\./putchar(*c);/g
              s/,/c=getchar();/g
              s/>/c++;/g
              s/</c--;/g
              Сможешь портануть на J?
              Ответить
              • Кстати, копелятор будет проще, чем интырпритатр. За один проход можно откопелировать.
                Ответить
              • Лол, сконпелял hello world. gcc от него только putchar'ы с константами оставил.
                Ответить
              • Мне лень.
                Я плюшевый тюлень.
                И телом нежным впитываю тень.
                В шабата день.
                Отвень.
                Ответить
                • Какое всё-таки говно.
                  Ваш этот J интерпретатор.
                  На нём Кегдану не дано.
                  Слепить брейнфака конпелятор.
                  Ответить
              • Забубенил:
                prolog =: '#include <stdio.h>' , LF , 'int main(){char buf[30000]={0},*c=buf;'
                epilog =: '}' , LF
                
                translate =: verb define
                   if. y = '+' do. '(*c)++;'
                   elseif. y = '-' do. '(*c)--;'
                   elseif. y = ',' do. '*c = getchar();'
                   elseif. y = '.' do. 'putchar(*c);'
                   elseif. y = '<' do. 'c--'
                   elseif. y = '>' do. 'c++'
                   elseif. y = '[' do. 'while(*c){'
                   elseif. y = ']' do. '}'
                   end.
                )
                
                translate_all =: [: prolog&, [: ,&epilog translate"0
                
                echo translate_all '+-<>.,[]'
                Ответить
                • А если генерить не сишный код, а код на J?
                  Ответить
                  • Я хз, это лучше у kegdan'а спросить. По любому выходной код будет выглядеть как говно, J лучше для обработки массивов подходит
                    Ответить
                    • А какой-нибудь краткой формы для if/elseif нету? Ну чтобы весь код из закорючек состоял. А то твой код слишком понятен по сравнению с другим говном на J.
                      Ответить
                      • Есть @. — чо-то типа case:
                        f =: (9:`8:`7:) @. ]
                           ( f 0 ) , ( f 2 ) , f 1
                        9 7 8

                        вызывает из коробки глагол по индексу.

                        ЗЫ. 9: и тп — это глагол, кот-й возвращает константу
                        Ответить
                        • Ну вот это уже другое дело. А какой-нибудь while есть?
                          Ответить
                          • В эксплицитной форме мона писать:
                            while. <условие> do.
                              <всякая поебень>
                            end.

                            А в тацитной эта хня не нужна, векторный же язык, можно с помощью рангов ибашить поэлементно или построчно.
                            ЗЫ. ещё есть ^: для возведения глагола в степень. Можно въебать бесконечную степень, и глагол будет ибашить пока результат не перестанет меняться.
                            Ответить
                            • Ну я в плане того, во что можно [ и ] транслировать.
                              Ответить
                              • Сыклы-то не проблема, а вот как инкрементировать только один эл массива не упоровшиссь:
                                ]a =: 10 $ 0
                                0 0 0 0 0 0 0 0 0 0
                                   i =: 3
                                   ]a =: a + i = i. @ # a
                                0 0 0 1 0 0 0 0 0 0
                                Ответить
                • Блядь, там где с++ и с-- заьыл почки с запятой, а вконце, в епилоге: ретурн 0;
                  Ответить
      • http://govnokod.ru/19841
        Ответить
    • Ага, только есть такие преподы, которые скажут иди переписывай напаскаль.
      Ответить

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