# [erlang-questions] Matrix rotator

Johnny Billquist < >
Mon Jun 15 02:45:46 CEST 2009

```Oh, and if you don't mind not being able to do tail recursion
optimization, you can do it like this:

rotate2([]) ->
[];
rotate2(L = [H|_]) ->
rotate2(length(H),L).

rotate2(0,_) ->
[];
rotate2(N,L) ->
[extract2(N,L)|rotate2(N-1,L)].

extract2(_,[]) ->
[];
extract2(N,[H|T]) ->
[lists:nth(N,H)|extract2(N,T)].

Which I think is much prettier.

Johnny

Johnny Billquist wrote:
> Tony Arcieri wrote:
>> On Sun, Jun 14, 2009 at 2:08 PM, Johnny Billquist < >> <mailto: >> wrote:
>>
>>     The problem is rather trivial in itself. Are you looking for some
>>     particularly efficient algorithm, or what?
>>
>>
>> Whatever you'd like, but creative or clever solutions are always
>> interesting.
>
> Ok. A really trivial solution then:
>
> -----------------
> rotate([]) ->
>     [];
> rotate(L = [H|_]) ->
>     rotate(length(H),L,[]).
>
> rotate(0,_,R) ->
>     lists:reverse(R);
> rotate(N,L,R) ->
>     rotate(N-1,L,[extract(N,L,[])|R]).
>
> extract(_,[],R) ->
>     lists:reverse(R);
> extract(N,[H|T],R) ->
>     extract(N,T,[lists:nth(N,H)|R]).
> ------------------
>
>
> And an example run:
>
> 17> test:rotate([[a,b,c],[d,e,f]]).
> [[c,f],[b,e],[a,d]]
> 18>
>
>     Johnny
>
>

--
Johnny Billquist                  || "I'm on a bus
||  on a psychedelic trip
email: ||  Reading murder books
pdp is alive!                     ||  tryin' to stay hip" - B. Idol
```