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

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 [email protected](f:s:st) [email protected](h:t)
|sortFunc s f h == GT = mboG (s:st) sn
|True                 = mboG(h:fs) t

mboG [email protected](f:st) [email protected](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``````

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

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

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

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

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

Вообще на окамле довольно просто лабы писать, там ведь от эффектов никто не ограждает, пиши себе в матрицы сколько влезет, и производительность предсказуемая.
С хацкелем хардкорнее - там половину нормальных алгоритмов (классические линейные строковые вроде КМП, обходы графов, преобразования матриц, деревья фенвика, тыщи их) без монады 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
Ответить
• Ага, только есть такие преподы, которые скажут иди переписывай напаскаль.
Ответить