Portál AbcLinuxu, 6. prosince 2025 14:57
[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.