Portál AbcLinuxu, 1. května 2025 07:10
[flat(0 xx $n, @a)]
by si asi zasloužilo rozepsat na více řádků (možná pomocí prepend
).1 2 2 1
a 3
0 0 0 1 2 2 1 0 0 1 2 2 1 0 0 1 2 2 1 0 0 1 2 2 1 0 0 0 ----------------- 1 3 5 6 5 3 1vrátí
1 3 5 6 5 3 1
.
Teď ke kódu:
[flat(0 xx $n, @a)]
nultý prvek bude pole @a a před ním $n nul,{ .rotate }
další prvek získáme tak, že předešlí prvek rotujeme,{ .[0] != 0 }
získávej nové prvky (pole) dokud nebude na začátku nula,[Z+]
sečti pole po prvcích.for
, tak by to podle mě kód prodloužilo a čitelnost nezlepšilo. Doufám, že jsem tento kód alespoň částečně vysvětlil.
...
, tak je to věc, na kterou je potřeba si zvyknout. Mně nečitelný nepřipadá. Já na něj nahlížím jako na jakýsi druh koncové rekurze, kde se zaznamenávají i mezivýsledky. Ale je pro mě snadnější a přirozenější myslet pomocí operátoru ...
, než používat přímo podprogramy s koncovou rekurzí.
rotate_sum
. Snad je to teď čitelnější.
say 0, 1, * + * ...^ * > 1000Takze jestli to spravne chapu: Vyraz s hvezdickou vytvori lambda funkci. Takze treba
* + *
se prelozi na:
def f1(a, b): return a + bPrvni hvezdicka je prvni parametr, druha druhy, ... Druhy vyraz s hvezdickou je druha lambda funkce:
def f2(a): return a > 1000Potom pri pouziti:
say 0, 1, f1 ...^ f2runtime nejak dynamicky zjisti ze jsou tam funkce misto hodnot a zavola je k vygenerovani hodnot. A jde nejak zapsat pomoci hvezdicek treba
b - a
?
{ $^b - $^a }
nebo v případě s infix operátor jako je -
lze použít i hyper operátor R
, který operátor obrací * R- *
.
say ( 0, 1, {$^b - $^a} ...^ * ).[^10]; say ( 0, 1, * R- * ...^ * ).[^10];
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.