Хламидомонада / Говнокод #21424 Ссылка на оригинал

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
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
-- GUESS THE NAME OF "algorithmX":
import qualified Data.List as DL
infinity = 1/0
adjacencyMatrix =
  [[0,3,1,6,0,0],
   [3,0,5,0,3,0],
   [1,5,0,5,6,4],
   [6,0,5,0,0,2],
   [0,3,6,0,0,6],
   [0,0,4,2,6,0]] :: [[Double]]

replaceZerosWithInfinity matrix =
  map (map (\e -> if e == 0 then infinity else e)) matrix

type Edge = (Int,Int,Double)

algorithmX adjacencyMatrix initialVertex = (minimumTotalCost,minimumEdges)
  where
    third (_,_,t) = t
    minimumTotalCost = sum $ map third minimumEdges
    (_,minimumEdges) = foldl iterate ([initialVertex],[]) [1..n-1]
    matrix = replaceZerosWithInfinity adjacencyMatrix
    n = length matrix
    getIndexes visited =
      filter (\(i,j) -> not $ elem j visited) [(i,j) | i <- visited, j <- [0..n-1]]
    iterate :: ([Int],[Edge]) -> Int -> ([Int],[Edge])
    iterate (visited,edges) iteration = (newVisited:visited,minimumEdge:edges)
      where
        (_,newVisited,_) = minimumEdge 
        minimumEdge = DL.minimumBy compareEdges $ map newEdge (getIndexes visited)
        newEdge (i,j) = (i,j,matrix !! i !! j)
        compareEdges e0 e1 = compare (third e0) (third e1)

WARN: лаба с фейспука

Запостил: roman-kashitsyn roman-kashitsyn, (Updated )

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

  • >> map (\e -> if e == 0 then infinity else e)
    удивило, что в прилюде из коробки нет replace
    Ответить
  • ну и 16-строчная функция для хаски - содом и гоммора
    Ответить
  • >> getIndexes visited =
          filter (\(i,j) -> not $ elem j visited) [(i,j) | i <- visited, j <- [0..n-1]]
    
    getIndexes = liftM2 (liftM2 (,)) id ([0..n-1]\\)
    Ответить
      • Неужели Дейкстра так распидорасило?
        Вникать лень
        Ответить
        • prim's mst
          Я предложил юзать kruskal's mst
          mst :: Graph -> [Edge]
          mst g = foldEdges (ufEmpty, 0) $ sortBy (compare `on` edgeWeight) $ listEdges g
            where n = numVertices g
          	foldEdges ( _, _) [] = []
          	foldEdges state@(uf, numEdges) (e@(from, to, _):es) =
          	  if numEdges == n - 1
          	  then []
          	  else if ufConnected uf from to
          	       then foldEdges state es
          	       else e : foldEdges (ufJoin uf from to, numEdges + 1) es
          Ответить
          • действительно, остов находит

            А таки можно не предлагать таких больших функций?
            Ответить
          • и огласите весь код, пожалуйста, с декларацией уфов
            Ответить
            • > огласите весь код

              Написано на скучном митинге, наверняка можно многое улучшить. Запилил свой UF и incidence list:
              https://gist.github.com/roman-kashitsyn/b2c8989c4d8c8a5a200537399d433412

              > А таки можно не предлагать таких больших функций?

              Сделай короче (не в ущерб понятности), жду пулл-реквест.
              Ответить
              • не сегодня, но на днях.

                Эх, как же хорошо окунуться в хаскель после ебаного ксамарина...
                Ответить
                  • А чем ещё кодить под все мобильные платформы?

                    З.Ы. Ну Qt разве что.
                    Ответить
                      • потому что писать на хаскеле прикольнее, чем на с#
                        Ответить
                      • Почему? Ну хотя бы потому, что в нем есть потаенные баги, связанные с кривой трансляцией в jbc. Нужно чувствовать задницей, какой набор кода на продакшене может выкинуть
                        "java.exe" exited with code 2
                        Так же потрясающие штуки - "я не буду деплоиться, иди нахуй" или черного экрана вообще без какой либо инфы об ошибках
                        Ответить
                        • > черного экрана вообще без какой либо инфы об ошибках
                          Ты только что описал половину пофиксанных мной багов 😉
                          Ответить
                        • А посмотреть в какой код на жаве транслируется и отладить его не судьба?
                          Ответить
                          • Думаешь, оно транслируется в код на жаве? По-моему сейчас так делают только жаваскриптеры.
                            Ответить
                            • Нет, я спиздел
                              https://habrahabr.ru/post/188130/
                              ---
                              Для Android интереснее. При компиляции приложения происходит перевод кода на C# в промежуточный байт-код, понятный виртуальной машине Mono и сама эта виртуальная машина также добавляется в упакованное приложение. И Mono и Dalvik написаны на Си и работают поверх ядра Linux (а мы помним, что Android основана на Linux).
                              ---
                              Но причем тут тогда жава?
                              Ответить
                    • > А чем ещё кодить под все мобильные платформы?
                      кордова, нейтивскрипт

                      но мы тоже выбрали замарин
                      Ответить
              • graph =: 1 2 4; 0 1 2 ; 1 2 8 ; 1 2 2
                a=:(/:{:@>)graph
                kruskal =: a#~>&0@+/"1@((3 2)&$)@(<#)@((i.&#@]i.~]#~#>])@]i.i.@#)@,(}:@>)a

                но там где то что то по дороге наебнулось и кароч не работает
                хер отдебажишь
                Ответить
                • graph =: 1 2 4; 0 1 2 ; 1 2 8 ; 1 2 2
                  a=:(/:{:@>)graph
                  kruskal=:a#~>&0@+/"1@($~(,&2)@-:@#)@(<#)@((i.&#@]i.~]#~#>])@]i.i.@#)@,(}:@>)a

                  таки отладил. Юледь, в 100раз проще, чем бороться с багами ксамарина
                  Ответить
                    • Обнаружен вирус!
                      Сканер памяти обнаружил вредоносную программу! Очень опасно работать на компьютере, в памяти которого активен вирус. Рекомендуется назначить загрузочное сканирование.
                      Ответить
                      • О том, что останки Гигантов имеют Русскую ДНК, и поэтому скрываются и уничтожаются Западными неандертальцами от науки, Грэм Хэнкок даже и не догадывается. О том, что Гиганты никуда не исчезли, а просто постепенно стали меньше ростом, ему тоже не вдомёк. Как и то, что та глобальная война, которую он списывает на комету, была войной с применением гравитационного оружия (гравитационной бомбы). Странно слышать от Грэма Хэнкока слова о любви всех народов, тогда как его позиция в альтернативной археологии и есть основная движущая сила геноцида против Русов и страны Рош / Россия – против ПЛЕМЕНИ ОГНЕННОГО СОКОЛА РА / РАРОГА.

                        Поэтому намёки Грэма Хэнкока о том, что он передаёт нам наследие наших предков, – это издёвка. Почему Грэм Хэнкок не возмущается, что Сионо-Нацисты Украины сейчас утюжат Градами мегалитические пирамиды в Луганске?
                        Ответить
    • > getIndexes

      Вообще говоря, в этой функции как раз самое смешное. Причём даже не в реализации (твоя с liftM2 мне нравится ещё меньше, кстати), а в идее. Из-за того, что код перебирает O(n^2) ребёр на каждой из n-1 итераций, алгоритм становится O(n^3), хотя мог бы быть O(e * log n).

      Ну и самый цимус: если подать на вход несвязный граф, алгоритм зарепортит бесконечную стоимость и перечислит рёбра бесконечного веса.
      Ответить
  • >> compare (third e0) (third e1)
    ну это уже блядство

    (compare `on` third) e0 e1
    Ответить

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

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

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


    8