[Python-de] Re: AW: Noch eine Denksportaufgabe

Gerhard Häring haering_python at gmx.de
Thu Oct 10 21:41:32 EDT 2002


Gerson Kurz wrote in gmane.comp.python.general.german:
>> Schreibe eine Prozedur, die die Elemente eines Arrays mit M
>> Elementen um n rotiert. -M < n < M
>>
>> Beispiel: M = 6, n = 2. Vorher: {1, 2, 3, 4, 5, 6}
>> Nachher: {5, 6, 1, 2, 3, 4}
>>
>> Versuche Speicherbedarf zu minimieren.
> 
> Wenn es wirklich um den minimalen Speicherbedarf geht (und nicht um die
> minimale Rechenzeit), dann wäre das hier ganz nett, denke ich:
> 
> def rot(l,m):
>     while m:
>         i = len(l)-1
>         while i > 0:
>             l[i] ^= l[i-1]
>             l[i-1] ^= l[i]
>             l[i] ^= l[i-1]
>             i -= 1
>         m -= 1
> 
> liste = [1,2,3,4,5,6]
> rot(liste,2)
> print liste
> 
> benötigt AFAIK 2 Variablen (i und m), wobei m eigentlich ein Parameter ist,
> der geschreddert wird.
> 
> Natürlich wäre das folgende eine viel schönere und Python angemessenere
                                                     ^
                                                     |
                                        sicher? -----+

> Lösung:
> 
> def rot(l,m):
>     v=[m,len(l)-1,0,lambda
> x,i,j:(j(i,x[i]^x[i-1]),j(i-1,x[i]^x[i-1]),j(i,x[i]^x[i-1])),
>        lambda:v[2]>0
> and(v[3](l,v[2],l.__setitem__),v[5](2,v[2]-1),v[4]()),0,
>        lambda:v[0] and(v[5](2,v[1]),v[4](),v[5](0,v[0]-1),v[6]()) ]
>     v.__setitem__(5,v.__setitem__) or v[6]()

Waaaaaaaaaah!! Weiche von mir!

-- Gerhard






More information about the Python-de mailing list