Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[13.58.244.216] |
|
Страницы: (4) 1 2 [3] 4 все ( Перейти к последнему сообщению ) |
Сообщ.
#31
,
|
|
|
И все?! нет батенька от меня так просто не отделаться будьте добры всю функцию wordNums В прошлом примере я не юзал композицию, в отличие от примера на Хаскелле, давайте заюзим в wordNums композицию и дополнительно для words каррирование. Я не стал юзать кастомную функцию compose и править ручками words, а заюзал библу Ramda const R = require('ramda'); const wordNums = s => R.compose( a => a.map(ws => [ws.length, ws[0]]), group, qsort, R.curry(words)(c => c === ' ') )(s); ......... получилось длинее, но так для практики пойдет Еще улучшим код, добавим функцию isSpace const wordNums = s => R.compose( a => a.map(ws => [ws.length, ws[0]]), group, qsort, R.curry(words)(isSpace) )(s); const isSpace = c => /[\s\.;,!?-]/.test(c); теперь можно изи добавлять символы игнора |
Сообщ.
#32
,
|
|
|
Цитата Serafim @ Код смотрится отвратно. Я могу сократить его в 10 раз и сделать на порядки читаемее... И тишина... походу парнишка сдулся? Симка балабол! |
Сообщ.
#33
,
|
|
|
function wordNums(it) { return it.length; } Добавлено А, не, так не получится Добавлено Потому что слова могут быть разделены чем угодно, получается от итератора не получить длины. Т.к. деление по пробелам - некорректно. В итоге: return sentence.split(/\W+/).length; Т.е. в функции выше (самой первой) сплит по пробелу надо заменить на сплит по регулярке, а затем длину от итератора. А т.к. JS дерьмо и в нём нет корутин, то вместо return передаём значение в анонимочку Добавлено на пыхе это было бы так: Скрытый текст function words(string $sentence): iterable { $buffer = ''; foreach (\str_split($sentence) as $char) { // Итератор по чарам if (\preg_match(yield $separator, $char)) { // Корутина разделения символов по регулярке с произвольным разделителем $buffer = '' && yield $buffer; // Возвращаем буфер continue; } $buffer .= $char; // Конкатенируем с буфером } } function word_nums(iterable $words): iterable { foreach ($words as $i => $word) { // Пробегаемся по словам yield $word; // Возвращаем слово } return $i; // Возвращаем последний индекс } Добавлено Цитата Cfon @ И тишина... походу парнишка сдулся? Да потому что ты хренью страдаешь. Из нормального кода делаешь хрень. Функциональщина нужна там, где она будет профитна, а не везде её пихать. Функции от коллекций в JS работают сразу над всем массивом. Ты его весь держишь в памяти. Это полная дичь. В моём же примере память выделяется ровно в пару-тройку байт. Как только очередное слово находится - память вычищается сразу же. И опять же приходим к тому, что в JS нет вообще ленивых коллекций: https://github.com/ramda/ramda/blob/master/source/map.js#L45 А намного правильнее было бы: export default *function(cb, iterator) { for (let item of iterator) { yield cb(item); } } |
Сообщ.
#34
,
|
|
|
Цитата Serafim @ Да потому что ты хренью страдаешь. Из нормального кода делаешь хрень. Функциональщина нужна там, где она будет профитна, а не везде её пихать. Функции от коллекций в JS работают сразу над всем массивом. Ты его весь держишь в памяти. Это полная дичь. В моём же примере память выделяется ровно в пару-тройку байт. Как только очередное слово находится - память вычищается сразу же. В каком примере?! Ты пока написал пол того что делает мой код! Напиши всю wordNums так чтобы не жрало память, хоть на пыхе хоть на чем мля но тока напиши! А не язычком моли Код на пыхе что делает? Вывод в итоге какой? Мне надо получить из предложения, список пар где будет слово и число его повторений в предолжении, например "hello world hello" -> [[2, "hello"], [1, " world"]] Да и напиши свой гавнокод как обещал в 10 раз меньше моего гавнокода Я буду считать строки Добавлено Цитата Serafim @ А т.к. JS дерьмо и в нём нет корутин, то вместо return передаём значение в анонимочку почему нет корутин? есть генераторы введенные в ES6 поддерживают их |
Сообщ.
#35
,
|
|
|
Цитата Cfon @ Ты пока написал пол того что делает мой код! Напиши всю wordNums так чтобы не жрало память, хоть на пыхе хоть на чем мля но тока напиши! Ну сам попросил: foreach ($words as $word) { yield \substr_count($sentence, $word) => $word; } Итератор, который возвращает в качестве ключа количество слов, а в качестве значения само слово. Цитата Cfon @ генераторы введенные в ES6 поддерживают их генераторы - это не корутины. У генераторов в ES6 нет возможностей корутин. |
Сообщ.
#36
,
|
|
|
Цитата Serafim @ foreach ($words as $word) { yield \substr_count($sentence, $word) => $word; } Итератор, который возвращает в качестве ключа количество слов, а в качестве значения само слово. Вывод какой будет тут? Как можно проверить? И у тебя юзаеться готовая фунция substr_count! ты за кого меня держишь? , у меня же все ручками! Ну кроме map Я тоже могу привести в одну функцию const wordNums = s => group( qsort( words(c => c === ' ', s))).map(ws => [ws.length, ws[0]]); Если на входе строка к примеру "hello world hello", а на выходе массив, в котором каждый элемент представлял два значения, первое - слово, второе - число его повторов или наоборот без разницы . Я уже выше приводил // [ [2, "hello"], [1, "world"] ] У тебя так? Цитата Serafim @ генераторы - это не корутины. У генераторов в ES6 нет возможностей корутин. Что ты понимаешь под корутинами? |
Сообщ.
#37
,
|
|
|
Цитата Cfon @ Что ты понимаешь под корутинами? что тут опять начинается?!! было же всё тихо и спокойно... Сифон сам себе байки рассказывал, никого не трогал... и тут вдруг какой-то коротин Добавлено я фапще не в теме, поэтому буду ляпать для начала, что не попада array_count_values( preg_split( '/\s+/', $string ) ); |
Сообщ.
#38
,
|
|
|
Цитата K313 @ я фапще не в теме, поэтому буду ляпать для начала, что не попада array_count_values( preg_split( '/\s+/', $string ) ); да попада но тока ты юзаешь готовые функции, а надо ручками |
Сообщ.
#39
,
|
|
|
Цитата Cfon @ а ты сам то чё? целую либу заюзал? Я не стал юзать кастомную функцию compose и править ручками words, а заюзал библу Ramda |
Сообщ.
#40
,
|
|
|
Цитата K313 @ Цитата Cfon @ а ты сам то чё? целую либу заюзал? Я не стал юзать кастомную функцию compose и править ручками words, а заюзал библу Ramda Ramda.compose не относиться к решению нашей задаче, ее можно не юзать. Вот без compose const wordNums = s => group( qsort( words(c => c === ' ', s))).map(ws => [ws.length, ws[0]]); А вот вам императивный вариант wordNums, писал на дровнях function wordNums(s) { const ws = words(c => c === ' ', s); const result = []; const o = {}; for (const w of ws) { o[w] = o[w] ? o[w] + 1 : 1; } for (const w in o) { result.push([o[w], w]); } return result; } Все приходится делать самому! ПС. надо ишо words на императивные рельсы поставить |
Сообщ.
#41
,
|
|
|
ОК а вот и императивный words
function words(p, s) { const result = []; let word = '', cc; let i = 0, len = s.length; while (i < len) { cc = s[i]; if (!p(c)) word += cc; if (p(c) && word !== '') { result.push(word); word = ''; } if (i === len - 1) { result.push(word); } } } ПС. писал на дровнях сильно не пинайте, это чисто императивный стиль Вспомнил старый добрый Си |
Сообщ.
#42
,
|
|
|
Зато в свое время в нем были эпичные баги: https://twitter.com/bos31337/status/116372971509121025 |
Сообщ.
#43
,
|
|
|
Надеюсь теперь с компилятором GHC все порядке
|
Сообщ.
#44
,
|
|
|
Хаскель изучил
догадайтесь че я щас изучаю? |
Сообщ.
#45
,
|
|
|
VBScript?
|