Список максимумов
От: Аноним  
Дата: 29.02.12 10:04
Оценка:
упрощенно, есть список чисел list[double]
хочу расширить до list[double*double] где второй элемент есть максимум от конца первого...
[1,2,3,2,1]
[(1,3)(2,3)(3,3)(2,2)(1,1)]

Циклами понятно как...

и еще TakeWith выдает тип list[Enumerable([double*double*double])], а Map list[double*double*double]
Re: Список максимумов
От: CodingUnit Россия  
Дата: 29.02.12 10:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>упрощенно, есть список чисел list[double]

А>хочу расширить до list[double*double] где второй элемент есть максимум от конца первого...
А>[1,2,3,2,1]
А>[(1,3)(2,3)(3,3)(2,2)(1,1)]

А>Циклами понятно как...


А>и еще TakeWith выдает тип list[Enumerable([double*double*double])], а Map list[double*double*double]

def loop(lst, acc)
{
 match (lst)
 {
  | []           => acc.Rev()
  | head :: tail => loop(tail, (head, tail.Max()) :: acc)
 }
}

def res = loop(lst, [])
Re[2]: Список максимумов
От: Аноним  
Дата: 29.02.12 11:12
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>Здравствуйте, Аноним, Вы писали:


А>>упрощенно, есть список чисел list[double]

А>>хочу расширить до list[double*double] где второй элемент есть максимум от конца первого...
А>>[1,2,3,2,1]
А>>[(1,3)(2,3)(3,3)(2,2)(1,1)]

А>>Циклами понятно как...


А>>и еще TakeWith выдает тип list[Enumerable([double*double*double])], а Map list[double*double*double]



CU>def loop(lst, acc)

CU>{
CU> match (lst)
CU> {
CU> | [] => acc.Rev()
CU> | head :: tail => loop(tail, (head, tail.Max()) :: acc)
CU> }
CU>}

CU>def res = loop(lst, [])


Циклами и я могу... хочется чере map, fold и прочий матан.... (вообще так ли уж надо было его вставлять?)
Re: Список максимумов
От: CodingUnit Россия  
Дата: 29.02.12 11:14
Оценка: 51 (1)
Здравствуйте, Аноним, Вы писали:

А>упрощенно, есть список чисел list[double]

А>хочу расширить до list[double*double] где второй элемент есть максимум от конца первого...
А>[1,2,3,2,1]
А>[(1,3)(2,3)(3,3)(2,2)(1,1)]

А>Циклами понятно как...


А>и еще TakeWith выдает тип list[Enumerable([double*double*double])], а Map list[double*double*double]



а еще можно так:


def lst = [1, 2, 3, 2, 1];
def (res, _) = lst.FoldRight(([], 0), (x, (res, max)) => if (x > max) ((x, x) :: res, x) else ((x, max) :: res, max));
Re[2]: Список максимумов
От: Аноним  
Дата: 29.02.12 11:23
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>Здравствуйте, Аноним, Вы писали:


А>>упрощенно, есть список чисел list[double]

А>>хочу расширить до list[double*double] где второй элемент есть максимум от конца первого...
А>>[1,2,3,2,1]
А>>[(1,3)(2,3)(3,3)(2,2)(1,1)]

А>>Циклами понятно как...


А>>и еще TakeWith выдает тип list[Enumerable([double*double*double])], а Map list[double*double*double]



CU>а еще можно так:



CU>
CU>def lst = [1, 2, 3, 2, 1];
CU>def (res, _) = lst.FoldRight(([], 0), (x, (res, max)) => if (x > max) ((x, x) :: res, x) else ((x, max) :: res, max));

CU>



понял, то что и было интересно.
Re[3]: Список максимумов
От: _NN_ www.nemerleweb.com
Дата: 29.02.12 12:34
Оценка:
Здравствуйте, Аноним, Вы писали:

def loop(lst, acc)
{
  match (lst)
  {
    | [] => acc.Rev()
    | head :: tail => loop(tail, (head, tail.Max()) :: acc)
  }
}

def res = loop(lst, [])


А>Циклами и я могу... хочется чере map, fold и прочий матан.... (вообще так ли уж надо было его вставлять?)


А Fold не рекурсия ?
  public FoldLeft[T, TOut] (l : list [T], mutable acc : TOut, f : T * TOut -> TOut) : TOut {
      def loop (_) {
        | [] => acc
        | x :: xs =>
          acc = f (x, acc);
          loop (xs)
      }
      loop (l);
    }

  public FoldRight[T, TOut] (l : list [T], acc : TOut, f : T * TOut -> TOut) : TOut {
     match (l) {
       | [] => acc
       | x :: xs => f (x, FoldRight (xs, acc, f))
    }
  }


https://github.com/rsdn/nemerle/blob/master/lib/list.n#L986

Беглым взглядом видно, что наш цикл хорошо ложится на FoldRight.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: Список максимумов
От: Аноним  
Дата: 29.02.12 12:39
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Здравствуйте, Аноним, Вы писали:


_NN>
_NN>def loop(lst, acc)
_NN>{
_NN>  match (lst)
_NN>  {
_NN>    | [] => acc.Rev()
_NN>    | head :: tail => loop(tail, (head, tail.Max()) :: acc)
_NN>  }
_NN>}

_NN>def res = loop(lst, [])
_NN>


А>>Циклами и я могу... хочется чере map, fold и прочий матан.... (вообще так ли уж надо было его вставлять?)


_NN>А Fold не рекурсия ?

_NN>
_NN>  public FoldLeft[T, TOut] (l : list [T], mutable acc : TOut, f : T * TOut -> TOut) : TOut {
_NN>      def loop (_) {
_NN>        | [] => acc
_NN>        | x :: xs =>
_NN>          acc = f (x, acc);
_NN>          loop (xs)
_NN>      }
_NN>      loop (l);
_NN>    }

_NN>  public FoldRight[T, TOut] (l : list [T], acc : TOut, f : T * TOut -> TOut) : TOut {
_NN>     match (l) {
_NN>       | [] => acc
_NN>       | x :: xs => f (x, FoldRight (xs, acc, f))
_NN>    }
_NN>  }
_NN>


_NN>https://github.com/rsdn/nemerle/blob/master/lib/list.n#L986


_NN>Беглым взглядом видно, что наш цикл хорошо ложится на FoldRight.


Это я знаю, но вот как написать через Fold не допер... не догадался что аккамулятором может быть и список.
Re[5]: Список максимумов
От: CodingUnit Россия  
Дата: 01.03.12 06:04
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Это я знаю, но вот как написать через Fold не допер... не догадался что аккамулятором может быть и список.


Вообще все функции начиная от Map, Iter, и другие есть частные случаи Fold, в них всех аккумулятором является список.
Re: Список максимумов
От: VoidEx  
Дата: 01.03.12 11:22
Оценка:
Здравствуйте, Аноним, Вы писали:

А>упрощенно, есть список чисел list[double]

А>хочу расширить до list[double*double] где второй элемент есть максимум от конца первого...
А>[1,2,3,2,1]
А>[(1,3)(2,3)(3,3)(2,2)(1,1)]

А>Циклами понятно как...


Вот Haskell

f = uncurry zip . (id &&& map maximum . init . tails)


По желанию перевести на любой язык.
Re[2]: Список максимумов
От: VoidEx  
Дата: 01.03.12 11:23
Оценка:
Здравствуйте, VoidEx, Вы писали:

VE>Здравствуйте, Аноним, Вы писали:


Точнее просто:

f = uncurry zip . (id &&& map maximum . tails)
Re[3]: Список максимумов
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.03.12 20:04
Оценка:
Здравствуйте, VoidEx, Вы писали:

VE>Точнее просто:

VE>
VE>f = uncurry zip . (id &&& map maximum . tails)
VE>


Еще надо на К и J для полноты картины. А моно и jpeg-ом его... Не фиг читать что не попадя. :)
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Список максимумов
От: WolfHound  
Дата: 01.03.12 20:07
Оценка: :)
Здравствуйте, VladD2, Вы писали:

VD>Еще надо на К и J для полноты картины. А моно и jpeg-ом его... Не фиг читать что не попадя.

Это все попса. Наш выбор Jot.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Список максимумов
От: Аноним  
Дата: 02.03.12 06:28
Оценка:
Здравствуйте, VoidEx, Вы писали:

VE>Здравствуйте, VoidEx, Вы писали:


VE>>Здравствуйте, Аноним, Вы писали:


VE>Точнее просто:


VE>
VE>f = uncurry zip . (id &&& map maximum . tails)
VE>


У этого алгоритма не будет случайно n^2 порядок операций?
Re[4]: Список максимумов
От: VoidEx  
Дата: 02.03.12 10:19
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, VoidEx, Вы писали:


VE>>Точнее просто:

VE>>
VE>>f = uncurry zip . (id &&& map maximum . tails)
VE>>


VD>Еще надо на К и J для полноты картины. А моно и jpeg-ом его... Не фиг читать что не попадя.


Зачем K, на нём хоть и непонятно, зато запись короче. Лучше на Nemerle, и кода больше, и без поллитру не разобрать.
Re[4]: Список максимумов
От: VoidEx  
Дата: 02.03.12 10:22
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, VoidEx, Вы писали:


VE>>Здравствуйте, VoidEx, Вы писали:


VE>>>Здравствуйте, Аноним, Вы писали:


VE>>Точнее просто:


VE>>
VE>>f = uncurry zip . (id &&& map maximum . tails)
VE>>


А>У этого алгоритма не будет случайно n^2 порядок операций?


Ну если скорость не порадует, напишете правило перезаписи на свой maxMaximumTails без изменения кода самой функции.
Re[5]: Список максимумов
От: CodingUnit Россия  
Дата: 02.03.12 10:38
Оценка:
Здравствуйте, VoidEx, Вы писали:

VE>Здравствуйте, VladD2, Вы писали:


VD>>Здравствуйте, VoidEx, Вы писали:


VE>>>Точнее просто:

VE>>>
VE>>>f = uncurry zip . (id &&& map maximum . tails)
VE>>>


VD>>Еще надо на К и J для полноты картины. А моно и jpeg-ом его... Не фиг читать что не попадя.


VE>Зачем K, на нём хоть и непонятно, зато запись короче. Лучше на Nemerle, и кода больше, и без поллитру не разобрать.


если у нас использовать функцию Tails и Maximum то запись получится короче, здесь просто у вас используются встроенные библиотечные функции, а у нас их нет, и кода больше для реализации этих вещей.
Re[5]: Список максимумов
От: Аноним  
Дата: 02.03.12 10:41
Оценка:
Здравствуйте, VoidEx, Вы писали:

VE>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, VoidEx, Вы писали:


VE>>>Здравствуйте, VoidEx, Вы писали:


VE>>>>Здравствуйте, Аноним, Вы писали:


VE>>>Точнее просто:


VE>>>
VE>>>f = uncurry zip . (id &&& map maximum . tails)
VE>>>


А>>У этого алгоритма не будет случайно n^2 порядок операций?


VE>Ну если скорость не порадует, напишете правило перезаписи на свой maxMaximumTails без изменения кода самой функции.



тогда это точно длиннее и сложнее чем Немерле....
Re[6]: Список максимумов
От: VoidEx  
Дата: 02.03.12 10:50
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>если у нас использовать функцию Tails и Maximum то запись получится короче, здесь просто у вас используются встроенные библиотечные функции, а у нас их нет, и кода больше для реализации этих вещей.


Да прям уж короче. Семантически будет столько же.
Можно, конечно, и так написать.
x `zip` map maximum (tails x)


А правила перезаписи у вас есть?

Но в общем-то это всё оффтоп и ясное дело, что вопрос в библиотечных функциях. Топикстартер просил через "всякий матан", я и написал, а уж перевести это можно хоть на C++.
Своим постом я лишь хотел показать, какие нужны функции, чтобы выглядело читаемо и понятно.
"список и максимумы хвостов списка"
Re[6]: Список максимумов
От: VoidEx  
Дата: 02.03.12 11:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>тогда это точно длиннее и сложнее чем Немерле....


Любой приведённый здесь вариант на Немерле переводится на Хаскель напрямую. Более того, я вам привёл вариант, при котором код функции остаётся понятным и коротким, а работает так быстро, как вам надо. При этом вы делаете вывод, что это "длиннее и сложнее". Чувствуется религия, поэтому я умываю руки.
Re[7]: Список максимумов
От: Аноним  
Дата: 02.03.12 11:26
Оценка:
Здравствуйте, VoidEx, Вы писали:

VE>Здравствуйте, Аноним, Вы писали:


А>>тогда это точно длиннее и сложнее чем Немерле....


VE>Любой приведённый здесь вариант на Немерле переводится на Хаскель напрямую. Более того, я вам привёл вариант, при котором код функции остаётся понятным и коротким, а работает так быстро, как вам надо. При этом вы делаете вывод, что это "длиннее и сложнее". Чувствуется религия, поэтому я умываю руки.


тут не в религии дело... Если такие преобразования прописаны в библиотеке Хаскеля(переписования), то вариант его намного лучше... Иначе если необходимо писать кусок кода переписывания, то получается и больше и сложнее
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.