Re: Re: question in mathematica
- To: mathgroup at smc.vnet.net
- Subject: [mg80171] Re: [mg80143] Re: question in mathematica
- From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
- Date: Tue, 14 Aug 2007 07:01:52 -0400 (EDT)
- References: <fa11b990e477.46baf2d3@bgu.ac.il> <200708130842.EAA27991@smc.vnet.net>
On 13 Aug 2007, at 10:42, m.r at inbox.ru wrote:
> On Aug 11, 1:43 am, Andrzej Kozlowski <a... at mimuw.edu.pl> wrote:
>> First, please send such question to the MathGroup,
>>
>> mathgr... at smc.vnet.net
>>
>> not me personally. (I really have desire, tiem or ability to replace
>> the enitre MathGroup.)
>> So I have decided to post this question to the MathGroup in case
>> someone else finds it interesting.
>>
>> Also, there is something about this question and the earlier you sent
>> me that make sme suspicious. What do you say "you need to use
>> recursion and pattern matching, Select and Join"? This sounds to me
>> like some sort of test problem so I have decided to answer it but
>> without using any of these functions (although it may not be the
>> simplest way to do this). So here is my answer:
>>
>> ls = {9, 2, 10, 3, 14, 9};
>>
>> Reverse[Last[Last[Reap[NestWhile[With[{a = First[Ordering[#, -1]]},
>> Sow[#[[a]]]; Take[#, a - 1]] &,ls,Length[#] > 0 &]]]]]
>>
>> {9, 10, 14}
>>
>> On 10 Aug 2007, at 10:12, Ivan Egorov wrote:
>>
>>> I have one more question.
>>
>>> Write a function maxima[lis_List] which, given a list of numbers,
>>> produces a list of those
>>
>>> numbers greater than all those that precede them. For example
>>
>>> maxima[{ 9, 2, 10, 3, 14, 9}] returns { 9, 10, 14}. You need to use
>>> recursion, pattern matching,
>>
>>> Select and Join.
>>
>>> =E2=80=8E
>
> I'll make it easier for myself and use pattern matching:
>
> In[1]:= ReplaceList[{9, 2, 10, 3, 14, 9},
> {s___, x_, ___} /; Max[s] < x :> x]
>
> Out[1]= {9, 10, 14}
>
> Maxim Rytin
> m.r at inbox.ru
>
>
I just noticed that the two programs are only equivalent if the lists
of numbers do not contain repetitions. With repetitions the answers
can differ:
ls = RandomInteger[{0, 100}, {200}];
Reverse[
Last[Last[
Reap[
NestWhile[
With[{a = First[Ordering[#, -1]]}, Sow[#[[a]]]; Take[#, a -
1]] &, ls,
Length[#] > 0 &]]]]] // Timing
{0.003511, {97, 98, 98, 99, 100}}
ReplaceList[ls, {s___, x_, ___} /; Max[s] < x :> x] // Timing
{0.039012, {97, 98, 99, 100}}
Of course (in Mathematica 6) one can remove repetitions in a list
without significant loss of performance.
Andrzej Kozlowski
- References:
- Re: question in mathematica
- From: m.r@inbox.ru
- Re: question in mathematica