bytebuster463: (IT Crowd Jen)
[personal profile] bytebuster463
Тогда вот вам няшка как раз уровня песочницы.
Это исходник кода сортировки. В одну строчку. Без вызова внешних функций. Правда, на Хацкеле. Отсюда.
qsort1 s = case s of {[] -> []; (x:xs) -> qsort1 [y | y<-xs, y<x] ++ x : qsort1 [y | y<-xs, y>=x]}
Ну или вот тоже красивый, но с вызовом filter.

qsort2 :: Ord a => [a] -> [a]
qsort2 []     = []
qsort2 (p:xs) = (qsort2 lesser) ++ [p] ++ (sort2 greater)
    where
        lesser  = filter (< p) xs
        greater = filter (>= p) xs
Третий - через partition, тоже ничево.

qsort3 [] = []
qsort3 (p:xs) = (qsort3 lesser) ++ [p] ++ (qsort3 greater)
    where (lesser, greater) = partition (< p) xs
Давайте, напишите мне то же самое на сях.

Date: 2012-07-18 01:29 pm (UTC)
From: [identity profile] tisechneg.livejournal.com
sort (s);

Date: 2012-07-18 01:36 pm (UTC)
From: [identity profile] bytebuster463.livejournal.com
Даже Кэпу иногда полезно почитать исходники стандартных библиотек. :)

Date: 2012-07-18 06:38 pm (UTC)
From: [identity profile] zvzz.livejournal.com
+1

Слава, это спортивное программирование, типа как диггера решать. в крайнем случае системное или низкоуровневое - имеет очень узкое применение.
Прикладное - это когда sort(s)

С помощью прикладного можно реать миллион интересных задач, это инстурментарий. С помощью спортивного - только играться, как в шахматы ) хотя никто не спорит что это прикольно и лаконично! вопросов нет. как задачка для поразмыслить субботним вечером сидя в кресле в саду :)

Я лично ненавижу програмирование. Поэтому пишу так
layout:{
"nicegraph":{"type":"graph","source":"api/mygraphobject"},
"nicetable":{"type":"table","source":"api/my555"}}

и оно мне рисует расписной скрин, который растиягвается и работает во всех устройствах и браузерах, c красивым графом (с дефолтными настройками все, конешно), который можно крутить ов все стороны, и табличкой, которую сразу можно редактировать, добавлять, сортировать, группировать, экспортировать, оно сразу приязано к базе через апи, к экспортным фильтрам и тп.

как именно оно там внутрях это делает - я написал один раз и надеюсь когда нибудь забуду нахер :)

Date: 2012-07-18 07:11 pm (UTC)
From: [identity profile] bytebuster463.livejournal.com
Дружище, я не хочу никого переубеждать, да и пост был с подколом.

"Узкое применение": посмотри, например, вот это (http://websharper.com/samples/TogglePanel). Там HTML+AJAX, и всё это со строгой типизацией. Оно тупо не скомпилируется, если кривое!

"nicegraph": Ты пытаешься путать зелёное и сладкое. Nicegraph - это библиотечная штука. Её кто-то уже написал, как и sort. Ни на каком языке программирования их никто не переписывает, они уже есть.

Так что когда показывают самолёт, не надо говорить, что в "Запорожце" есть модный набалдашничек на переключателе передач. Набалдашничек и в самолёте есть. ;)

Date: 2012-07-19 07:54 am (UTC)
From: [identity profile] zvzz.livejournal.com
как так "кто-то написал". я и написал, вплоть до низкоувневых вещей типа конфигурации сортировки. и переписывал на яве, похапе, яскрипте. но очень это все не люблю, неправильно это - заниматься такими вещами. надо города строить, корабли в космоз запускать, ну и всякое такое! ))

Date: 2012-07-19 03:25 pm (UTC)
From: [identity profile] bytebuster463.livejournal.com
Тогда я совсем перестаю понимать.
Ты сравниваешь реализацию и внешний интерфейс? Так у моих программ (у всех!) внешний интерфейс вообще без параметров:

main();

ЗдОрово, правда? :)

В постинге писалось не о том, как выглядит интерфейс метода sort, а о том, как написать ему потроха. Без или с минимальным использованием библиотек.

Date: 2012-07-18 07:47 pm (UTC)
From: [identity profile] bytebuster463.livejournal.com
И ещё копипаста:

Правильно.
1st class functions и лямбды придумали уроды.
Clojures придумали извращенцы.
Функциональный анализ (ветвь алгебры), все эти множества функций над множествами функций придумали шепелявые старухи (вспоминаю свою преподшу из книвера).
А за комбинатор неподвижной точки в приличном обществе можно в морду схлопотать! :)))
Edited Date: 2012-07-18 07:47 pm (UTC)

Date: 2012-07-18 08:31 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
"Настоящий" квиксорт - он in-place, без создания статыщ промежуточных списков. И на хаскеле он выглядит не шибко короче сишного, только синтаксис смешнее.

Date: 2012-07-18 10:16 pm (UTC)
From: [identity profile] bytebuster463.livejournal.com
Ах да, мутабельность, семафоры, буераки-реки-раки. Во главе с переменными i, j и k. Понимаю. Чай, не изверг какой, у самого такое же было. :)
Edited Date: 2012-07-18 10:19 pm (UTC)

Date: 2012-07-19 06:48 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Не было.
Я лишь привожу стандартный ответ на этот qsort, вон ниже его уже воспроизвели. А на ФП я пару собак съел, если что, даже в fprog.ru автором числился, в истинную веру меня обращать не нужно.

Date: 2012-07-19 03:32 pm (UTC)
From: [identity profile] bytebuster463.livejournal.com
> Не было.
Так у меня было! :)))

В веру обращать не буду, уже договорились :)
Но мы оба одинаково понимаем тематику? Никто не собирается переписывать библиотеки. Но в качестве упражнения для ума, сортировку писать нужно. Равно как ханойские башни и волк-коза-капуста. Чисто для причёсывания мыслей в голове.

А почему Хацкеля синтаксис смешнее? Я на ём не писал, но синтаксис читабельный, имхо.

Date: 2012-07-20 03:11 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
В Си уже встроена удобная работа с массивами и всякие ++ и --. В хаскеле со списками код красивый, а с массивами не очень, довольно многословно получается. Clean в этом смысле приятней, там массивы и списки одинаково удобны, и array comprehensions есть.

Date: 2012-07-20 04:20 pm (UTC)
From: [identity profile] bytebuster463.livejournal.com
Ну так (если я правильно понял) Хаскель не гарантирует никакой работы с памятью. Потому там нет ничего такого, к чему можно было бы обращаться по i*sizeof(T) + offset
Я не силён в философии ФП (пока что), но мне кажется так...

Тем не менее, вопрос в силе: причём здесь синтаксис? :)

Date: 2012-07-20 04:47 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Там есть массивы, в том числе мутабельные.

А синтаксис при том, что если пытаться делать сортировку быстро, а не просто красиво, то отличия от Си будут в основном синтаксическими.

Date: 2012-07-19 03:30 am (UTC)
From: [identity profile] vyacheslav-f.livejournal.com
Не в первый раз вижу эту строчку
qsort1 s = case s of {[] -> []; (x:xs) -> qsort1 [y | y<-xs, y<x] ++ x : qsort1 [y | y<-xs, y>=x]}
и каждый раз, когда вижу, мне хочется форматнуть человеку бердан. Какой, к свиням, qsort?! Скорость настоящего алгоритма QuickSort (сокращённо qsort) пропорциональна Nlog2N, дополнительные затраты памяти - ноль. А о скорости и ресурсоёмкости этого уебанства даже говорить смешно.
Просто уберите буковку q, и тогда я Вас прощу :)
Edited Date: 2012-07-19 03:31 am (UTC)

Date: 2012-07-19 03:36 pm (UTC)
From: [identity profile] bytebuster463.livejournal.com
Исходник взят, видимо, с этой обучалки (http://en.literateprograms.org/Quicksort_%28Haskell%29). Там же поднимаются вопросы complexity.

Давайте, Вы меня лучше простите за то, что Вы сами ни с того, ни с сего, решили, что qsort = quick sort? :)
qsort - это чтобы не конфликтовало со стандартными методами! ;))

ЗЫ. Почему двоичный логарифм? Натуральный же?

Date: 2012-07-19 03:53 pm (UTC)
From: [identity profile] vyacheslav-f.livejournal.com
Вы сами ни с того, ни с сего, решили, что qsort = quick sort?
man qsort
qsort - это чтобы не конфликтовало со стандартными методами
Как раз qsort - стандартная функция и стандартное сокращение. Пруф - http://ru.wikipedia.org/wiki/qsort . А насчёт конфликтов - где это Вы видели библиотечные функции/методы с названиями sort1, sort2 и sort3?
Почему двоичный логарифм? Натуральный же?
Попытался представить себе алгоритм, скорость которого была бы пропорциональна натуральному логарифму от объёма данных. Не смог.

Date: 2012-07-19 04:30 pm (UTC)
From: [identity profile] bytebuster463.livejournal.com
Ну что поделать, такая жизнь.
Первенького назвали qsort.
Когда появился второй, пришлось первенького переименовать, чтобы со вторым было созвучно.

А про логарифм - спасибо, почитаю, какой он на самом деле.

Date: 2012-07-20 03:15 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Это уже фейл на уровне школьной математики. Как переводятся логарифмы из одного основания в другое? Что происходит с оценкой О(..) при умножении аргумента на константу?

Date: 2012-07-20 03:36 pm (UTC)
From: [identity profile] bytebuster463.livejournal.com
Ну вот такая у меня была хреновая школа, там O() не изучали. Честно.

К моему стыду, чтобы логарифмы перевести, тоже придётся гуглить. Вот честно, никогда не пользовался ими уже почти 20 лет (трясу седыми мудями, да).

Date: 2012-07-20 03:53 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
В общем, в оценках О(..) основание логарифма не имеет значения, они там все эквивалентны получаются.

Date: 2012-07-20 04:14 pm (UTC)
From: [identity profile] bytebuster463.livejournal.com
О, теперь я окончательно запутался, и всё стало на свои места :) Пойду курить маны.

Profile

bytebuster463: (Default)
bytebuster463

April 2017

S M T W T F S
       1
2 3 45678
9101112131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 20th, 2025 12:17 am
Powered by Dreamwidth Studios
OSZAR »