Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.programming > #6198

Re: Rotation

From Kaz Kylheku <kaz@kylheku.com>
Newsgroups comp.programming
Subject Re: Rotation
Date 2016-01-05 04:59 +0000
Organization Aioe.org NNTP Server
Message-ID <20160104205905.491@kylheku.com> (permalink)
References <f8f1edff-9175-4210-8877-fdd0ffa4f42c@googlegroups.com> <n6f5qs$lme$1@dont-email.me>

Show all headers | View raw


On 2016-01-05, BartC <bc@freeuk.com> wrote:
> On 04/01/2016 17:25, Paul wrote:
>> Suppose we want to rotate the list of numbers [1, 2, 3, 4, ..., 10]
>> so that it begins with a 4 and we end up with [4,...10, 1, 2, 3].
>>
>> I was looking at the standard-library c++ way to do this from
>> http://www.cplusplus.com/reference/algorithm/rotate/
>>
>> There we get (as an example) the code below.  To rotate as above,
>> middle would be the pointer to 4 which is indexed 3 in c++ which
>> begins counting at zero.
>>
>> template <class ForwardIterator>
>>    void rotate (ForwardIterator first, ForwardIterator middle,
>>                 ForwardIterator last)
>> {
>>    ForwardIterator next = middle;
>>    while (first!=next)
>>    {
>>      swap (*first++,*next++);
>>      if (next==last) next=middle;
>>      else if (first==middle) middle=next;
>>    }
>> }
>>
>>
>> I can verify that this code works for special cases but it's not
>> intuitively clear that it should always work. 
>
> It's easy enough to test. I'm not familiar with C++ so I tried this 
> somewhat different language, doing an in-place left-rotation of the 
> caller's data:
>
> proc rotate(&a,middle)=
>      first := a.lwb
>      last := a.upb+1
>      next := middle
>
>      while first <> next do
>          swap(a[first++], a[next++])
>          if next = last then
>              next := middle
>          elsif first = middle then
>              middle := next
>          fi
>      od
> end

Lol, blub languages.

$ ./txr
This is the TXR Lisp interactive listener of TXR 129.
Use the :quit command or type Ctrl-D on empty line to exit.
1> (defparm a (range 0 9))
a
2> (defparm b (range 0 9))
b
3> a
(0 1 2 3 4 5 6 7 8 9)
4> b
(0 1 2 3 4 5 6 7 8 9)
5> (rotate [a 0..8] [a 8..:])
(0 1 2 3 4 5 6 7)
6> (rotate [b 0..2] [b 2..:])
(0 1)
7> a
(8 9 0 1 2 3 4 5 6 7)
8> b
(2 3 4 5 6 7 8 9 0 1)

Back to comp.programming | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

Rotation Paul <pepstein5@gmail.com> - 2016-01-04 09:25 -0800
  Re: Rotation David Brown <david.brown@hesbynett.no> - 2016-01-04 23:51 +0100
  Re: Rotation BartC <bc@freeuk.com> - 2016-01-05 01:24 +0000
    Re: Rotation Kaz Kylheku <kaz@kylheku.com> - 2016-01-05 04:59 +0000
      Re: Rotation BartC <bc@freeuk.com> - 2016-01-05 12:22 +0000
      Re: Rotation BartC <bc@freeuk.com> - 2016-01-05 12:55 +0000
        Re: Rotation Kaz Kylheku <kaz@kylheku.com> - 2016-01-05 14:37 +0000
          Re: Rotation BartC <bc@freeuk.com> - 2016-01-05 18:48 +0000
  Re: Rotation Melzzzzz <mel@zzzzz.com> - 2016-01-05 09:13 +0100

csiph-web