Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
https://github.com/timbl/standard
> Single quotes for strings – when they are code eg 'color: blue'
> Double quotes for strings – when they are natural language and need I18n, eg "Error you have run out of space"
> чистые функции
Приведи реальный пример чистой функции изменяющей DOM.
А пусть компилятор как надо сразу скомпилирует и заменит на мо-дефекацию, если нужно. Ссылочная прозрачность и более корректный код в наш век дешёвых программистов - важнее мизерной просадки пирфоманса в тех местах, где компилятор не смог заменить на мо-дефекацию.
Ну ты определись, тебе в один проход по списку и лениво-иммутабельно, или считать сумму и делить на длину
>А байтоёбы причём?
Ну а кто виноват в том что 5/6*2.6 +2/6 === 2.5000000000000004?
>>Определять где конец
>Зачем? Зачем?
Ну вот представь, у тебя биржевая лента, в которой по 123456 котировок в секунду приходит и тебе надо считать в лайв-режиме среднюю котировку за день. Ты на каждое новое значение будешь постоянно растущий список пересчитывать?
В такой ситуации идеально подойдёт «естественный, простой и очевидный способ». Есть сумма, есть счётчик, приходит новое значение — увеличиваем сумму и счётчик, надо показать среднюю котировку — делим сумму на счётчик и течём.
А в ФП реально питушня какая-то получится, либо тормозная, либо неидиоматическая.
Я ориентировался на потенциально бесконечные потоки данных, где вся ленивость и иммутабельность могут показать себя, но любимого тут "реального примера" привести не смогу
Это кстати напрявляет на мысль, что такие алгоритмы очень просто паралеллить: мы дробим список, находим среднее для каждого подсписка, потом взвешенно их суммируем и так можно дробить хоть до пар по 2, а там и по-хитрому считать среднее
Зацените как они по-байтоёбски среднее для сплита находят
public Spliterator<T> trySplit() {
int lo = origin; // divide range in half
int mid = ((lo + fence) >>> 1) & ~1; // force midpoint to be even
if (lo < mid) { // split out left half
origin = mid; // reset this Spliterator's origin
return new TaggedArraySpliterator<>(array, lo, mid);
}
else // too small to split
return null;
}
> как найти в хацкеле среднее арифметическое списка за один проход по списку и О(1) памяти?
Вот как раз как-то так, только в хаскеле. Думаю, стандартные функции свёртки должны оптимизнуться.
А если нет, то стоит писать явную хвостовую рекурсию:
avg arr = sum / len where
(sum, len) = avg' arr (0, 0)
avg' [] res =res
avg' (x:xs) (sum, len) = avg' xs (sum+x, len+1)
Роман рассказал, что в свое время интервьюировал не меньше двух десятков хаскеллистов в Киеве.
И практически никто не смог во время интервью решить такую задачку: есть длинный список чисел, надо найти их среднее арифметическое за один проход по списку и О(1) памяти.
> я бы смог расписать последовательность редукций, обнаружить проблему и предложить методы решения, но времени бы на это ушло немеряно
Бля, я к ФП отношусь уважительно, но это реально какой багор )))
Ну по императивным языкам можно тоже судить по C и PHP.
* В ИП снизил уровень внимания ниже 100% - UB, которое будет ждать тебя в коде годы, и никакая хвалёная статическая питушня тебя не спасёт.
* В ИП программа не может освободить память. Вся память освобождается только после завершения программы.
* В ИП имена функций плохо сочетаются друг с другом, ИП - неконсистентное говно.
* В ИП нельзя вернуть что-то сложнее числа или структуры, массив вернуть нельзя.
Поэтому ИП - говно.
Haskell - довольно таки примитивное, но монстровое поделие, полное нелепых нагромождений.
Человек, который хорошо в нем ориентируется - это хорошее зубрилко а не хороший программист.
Умение героически преодолевать трудности, которые создает твой собственный инструмент, вместо того, чтобы решать непосредственно прикладную задачу, в современно мире ценится разве что только среди прыщавых сосок.
Работодатель же это сомнительное умение не ценит, и совершенно справедливо.
Потому производительность труда этих борщехлёбов настолько поганая, что больше платить им просто невозможно.
Рантаймы же для нормальных платформ пишут обычно на голом Си, и они как правило очень компактны и минимальны.
Для пустого списка среднее арифметическое не определено, в условиях задачи результат для пустого списка не определён, а потому для пустого списка поведение не определено!
Я кстати когда-то пытался интерпретатор лишпа написать. Сейчас сорцы посмотрел, у меня там джвусвязные списки и сплошные рукурсии, ни одного цикла. У меня даже удаление списка и получение последнего елемента через рекурсию делалось.
> Считать в рамках обычных интов нужно или изощрённое байтоёбство или длинная арифметика.
А вот интересно, если длина списка заранее не известна — байтоёбство поможет? У меня такое ощущение, что не особо.
Битоёбство поможет если длина списка кратна степени двойки. Тогда даже делений не нужно.
Достаточно просто найти попарно находить среднее.
(a&b) + ((a^b)>>1)
И то, этот код неочевидно округляет отрицательные аргументы.
> если длина списка заранее не известна — байтоёбство поможет
При рандомной длине нужно или суммировать всё в более широком типе.
Или сохранять старшие биты в новую переменную. И потом делить их по частям.
> Single quotes for strings – when they are code eg 'color: blue'
> Double quotes for strings – when they are natural language and need I18n, eg "Error you have run out of space"
господи как же они заебали блядь
то eslint, то standard, то ставь точку с запятой, то не ставь
Я поставил себе prettier, он мне и кавычки двойные ставит, и точки с запятой
Выглядит уебищно и мне не нравится, но менять мне лень, а так хоть однородно
Если отвлекаться на всю примитивную херню, времени на мысли не останется. Внимание так и рассеивается на мелочи.
Как думаете, программист должен
А. автоматизировать задачу заказчика
Б. пердолиться с указателями в языке без ГЦ
В. из кожи вон лезть, чтобы выполнить дебильный конвеншн, ничем не обоснованный?
Разумный кодстайл позволяет исполнять себя автоматически. А значит его можно повесить на коммит, чтобы весь код был красивым, не важно, кто там у себя в кьюбикле насколько извращённо его написал.
Учитывая твои познаниях в разных областях науки и техники, охарактеризовать тебя как личность можно вкратце: "онъ и швеъц, и жнецъ и хуйца сосѣцъ на дуде игрецъ"
> Single quotes for strings – when they are code eg 'color: blue'
> Double quotes for strings – when they are natural language and need I18n, eg "Error you have run out of space"
> чистые функции
Приведи реальный пример чистой функции изменяющей DOM.
Да и ГЦ заебётся чистить. Странички в интернетах довольно большие и постоянно жопоскриптами дрочатся.
То как найти в хацкеле среднее арифметическое списка за один проход по списку и О(1) памяти?
Мдяяя. Оказывается на этой простой задачке ломают зубы вообще все.
Высокоуровевный же язык, со сборщиком мусора. ФУНКЦИОНАЛЬНЫЙ.
>А байтоёбы причём?
Ну а кто виноват в том что 5/6*2.6 +2/6 === 2.5000000000000004?
Разве трудно считать сумму лениво-иммутабельно?
Можно передать в массиве сумму и count.
А в конце поделить.
Определять где конец - это уже какая-то императивная хуйня
>Определять где конец
Зачем? Зачем?
>Зачем? Зачем?
Ну вот представь, у тебя биржевая лента, в которой по 123456 котировок в секунду приходит и тебе надо считать в лайв-режиме среднюю котировку за день. Ты на каждое новое значение будешь постоянно растущий список пересчитывать?
А в ФП реально питушня какая-то получится, либо тормозная, либо неидиоматическая.
>Ты на каждое новое значение будешь постоянно растущий список пересчитывать?
Да. И это лучше, чем каждый раз терять точность на плавающих питухах.
Это же деньги.
Там на округлениях миллионы могут накапать.
https://www.youtube.com/watch?v=N7JBXGkBoFc
Хотя, в этом конечно есть свой резон.
Числа тут примерно одного порядка.
Если это среднее ни на что не влияет, и допустим нужно для вывода котировок на трейдерском сайте.
Тогда это вполне приемлимая реализация.
Потом нам приходит пачка чисел. Мы вычисляем ищем взвешенное среднее, а к count прибавляем размер пришедшего батча.
>(count-1)/count * res + curr/count: curr
Просто меня покоробило 2 деления и 1 умножение на каждой итерации.
Если считать среднее батча самым тривиальным способом, а уже потом находить взвешенное среднее, то получится очень годно.
В жабе допустим для этого сделали Spliteratorы в Stream.
Проблема в том что оверхед на создание потоков и синхронизацию, для таких простых задач съедает выгоду от многопоточности.
Я когда-то пытался одну программу на крестах таким образом сделать многопоточной, используя лямбды и тред-пул.
Причём вычисление там было посложнее, чем «посчитай среднее N чисел».
В итоге оно работало чуточку дольше, но при этом грузило 2-3 ядра вместо одного.
https://docs.oracle.com/javase/8/docs/api/java/util/Spliterator.html
Зацените как они по-байтоёбски среднее для сплита находят
>>> (unsigned right shift)
Вот как раз как-то так, только в хаскеле. Думаю, стандартные функции свёртки должны оптимизнуться.
А если нет, то стоит писать явную хвостовую рекурсию:
За один проход, хочу заметить.
https://ideone.com/3JdsWI
https://nponeccop.livejournal.com/449682.html?thread=3937170#t3937170
Бля, я к ФП отношусь уважительно, но это реально какой багор )))
Кстати, нагуглил: https://wiki.haskell.org/Foldr_Foldl_Foldl'. Багор-с!..
Ну и 5 императивных строк, которые в говне валяют эти потуги. Никаких оптимизаций тут нет, но они и не нужны.
Ведь задача какая была?
Показать, что хаскель-отребье обделалась и наврало.
Версия на сишке компактней, быстрее, проще и выигрывает во всём.
К тому же, нужно понимать, что никому никакие оптимизации в for сишке ненужны.
А тем, кому они нужны - напишет себе то, что ему нужно.
Поэтому хацкель-отребье так любит брать подобную херню и кого-то побеждать, правда оппонент как всегда не явился.
Пойти и писать реальные программы, реальную логику - отребье не может.
Соревноваться с лучшим - это не удел отребья.
* В ИП снизил уровень внимания ниже 100% - UB, которое будет ждать тебя в коде годы, и никакая хвалёная статическая питушня тебя не спасёт.
* В ИП программа не может освободить память. Вся память освобождается только после завершения программы.
* В ИП имена функций плохо сочетаются друг с другом, ИП - неконсистентное говно.
* В ИП нельзя вернуть что-то сложнее числа или структуры, массив вернуть нельзя.
Поэтому ИП - говно.
> массив вернуть нельзя
Сомнительное утверждение.
Особенно от человека, знающего js.
Cтандартное функцианальное кудахтанье: «оно должно питумизнуться», «хвостовая питушня», «заедушник не лолжен ни о чём думать».
https://thedeemon.livejournal.com/101735.html
Человек, который хорошо в нем ориентируется - это хорошее зубрилко а не хороший программист.
Умение героически преодолевать трудности, которые создает твой собственный инструмент, вместо того, чтобы решать непосредственно прикладную задачу, в современно мире ценится разве что только среди прыщавых сосок.
Работодатель же это сомнительное умение не ценит, и совершенно справедливо.
Потому производительность труда этих борщехлёбов настолько поганая, что больше платить им просто невозможно.
Рантаймы же для нормальных платформ пишут обычно на голом Си, и они как правило очень компактны и минимальны.
Именно поэтому я за «Python».
>среднее арифметическое списка за один проход по списку и О(1) памяти?
>> за один проход по списку
Мы вам перезвоним.
А мы передали кастомную реализацию связного списка.
bootcamp_dropout правильно сказал: длина неизвестна.
Причём я думал, что в этой задаче скриптухов подловить нереально.
Особенно питонистов с их длинными интами, но жсеров и пхпшников тоже.
Это и плохо.
int не переполнится?
Даже 2 инта нетривиально посчитать.
avg = (uncurry /) . fold (\(s, c) x -> (s + x, c + 1)) (0, 0)
З.Ы. На пустом поделит на 0, да. Но тут все участники специальной олимпиады на него делят.
Ты так говоришь, будто делить на 0 это что-то плохое.
avg([]) = 0/0
NaN
На пустом будет NaN. Что логично: среднее арифметическое от пустоты — это не число.
O(N)
https://nponeccop.livejournal.com/449682.html
Собственно из-за постоянной борьбы с ленивостью я и забросил хаски.
Выздоровел.
С такими "оптимизациями" иди на пхп ебашить.
Функцианальненько )))
Настоящий Сишник сделал бы null terminated array.
Только массивы, только хардкор!
>>> А мы передали кастомную реализацию связного списка.
.
Моча какая-то
https://ideone.com/WneDbX
Я же говорю: переполнение.
Считать в рамках обычных интов нужно или изощрённое байтоёбство или длинная арифметика.
А вот интересно, если длина списка заранее не известна — байтоёбство поможет? У меня такое ощущение, что не особо.
Достаточно просто найти попарно находить среднее.
И то, этот код неочевидно округляет отрицательные аргументы.
> если длина списка заранее не известна — байтоёбство поможет
При рандомной длине нужно или суммировать всё в более широком типе.
Или сохранять старшие биты в новую переменную. И потом делить их по частям.
> Double quotes for strings – when they are natural language and need I18n, eg "Error you have run out of space"
господи как же они заебали блядь
то eslint, то standard, то ставь точку с запятой, то не ставь
Выглядит уебищно и мне не нравится, но менять мне лень, а так хоть однородно
Зачем за ним нужно проверять даже такую примитивную вещь как кавычки?
Как думаете, программист должен
А. автоматизировать задачу заказчика
Б. пердолиться с указателями в языке без ГЦ
В. из кожи вон лезть, чтобы выполнить дебильный конвеншн, ничем не обоснованный?
Разумный кодстайл позволяет исполнять себя автоматически. А значит его можно повесить на коммит, чтобы весь код был красивым, не важно, кто там у себя в кьюбикле насколько извращённо его написал.