Szeregi matematyczne, weźmy na przykład kolejną sekwencję przedstawioną tutaj jako tablicę:
my @seq = my $a=0, {++$a} ... *;
for @seq[^10].kv {state $f=0; ($^k < 4 or $^k > 7) ?? say "a$^k = " ~ $^v !! (say "..." if $f ne 1; $f=1) };
Wydruki:
a0 = 0
a1 = 1
a2 = 2
...
a8 = 8
a9 = 9
Moje pytania: 1 - Czy istnieje prosty sposób na usunięcie tylko pierwszego elementu, tj. a0 = 0
Z wydruku?
2- Czy ten kod może być bardziej idiomatyczny?
Dziękuję Ci.
Odpowiedzi:
Rozwiązanie typu barebones
Zacznijmy od bardzo prostego rozwiązania do drukowania streszczenia sekwencji. Nie zajmuje się szczegółami dodanymi do pytania, ale jest dobrym punktem wyjścia:
W przeciwieństwie do tego
.kv
, który konwertuje swojego wywoływacza do postacikey1, value1, key2, value2, key3, value3, ...
, tj. 6 elementów, jeśli jego wywoływacz zawiera 3 elementy,.pairs
przekształca swojego wywoływacza do postacikey1 => value1, key2 => value2, key3 => value3, ...
.Użyłem
.pairs
zamiast.kv
częściowo, ponieważ oznaczało to, że mogłem użyć».gist
później w kodzie, aby bez wysiłku uzyskać ładnykey1 => value1
wyświetlacz dla każdego elementu. Zmodyfikujemy to poniżej, ale to dobry początek idiomatyczny..head
I.tail
połączenia są idiomatyczne sposób na tworzenie małych list pierwszych i ostatnich n elementów z listy invocant (pod warunkiem, że nie jest leniwy, więcej na ten temat w MO).Biorąc pod uwagę to wstępne rozwiązanie,
say seq-range-gist (0,1 ... Inf)[^10]
wyświetla:Następnie chcemy móc „upuścić tylko pierwszy element ... z wydruku”. Niestety
say seq-range-gist (0,1 ... Inf)[1..9]
wyświetla:Chcemy, aby liczba po lewej stronie
=>
zachowała numerację oryginalnej sekwencji. Aby to umożliwić, rozdzieliliśmy leżącą u podstaw sekwencję z zakresu, który chcemy wyodrębnić. Dodajemy drugi parametr / argument@range
i dołączamy[@range]
do drugiego wiersza sub:Teraz możemy napisać
say seq-range-gist (0,1 ... Inf), 1..9
do wyświetlenia:W swoim pytaniu użyłeś formatu
aINDEX = VALUE
zamiastINDEX => VALUE
. Aby umożliwić dostosowanie GIST, dodajemy trzeci&gist
rutynowy parametr / argument i wywołujemy go zamiast wbudowanej.gist
metody:Zauważ, że
seq-range-gist
teraz.&gist
nie są wywołania „metody” w treści sub.gist
. Składnia.&foo
wywołuje podrzędny&foo
(który jest zwykle wywoływany przez napisanie po prostufoo
), przekazując wywoływacza po lewej stronie.
jako$_
argument do podrzędnego.Zauważ też, że nadałem
&gist
parametrowi nazwę, poprzedzając go znakiem:
.Teraz
say seq-range-gist (0,1 ... Inf), 1..9, gist => { "a{.key} = {.value}" }
wyświetla:Dodawanie polskiego
Pozostała część tej odpowiedzi jest dodatkowym materiałem dla czytelników, którym zależy na języku polskim.
say seq-range-gist (0, 1, 2, 3), ^3
wyświetla:Ups I nawet gdyby było więcej par niż głowa i ogon łącznie, więc przynajmniej nie otrzymywaliśmy powtarzających się linii, nadal byłoby bezcelowe stosowanie
head, ..., tail
podejścia, aby uniknąć tylko jednego lub dwóch elementów. Zmieńmy ostatnią instrukcję w treści podrzędnej, aby wyeliminować następujące problemy:Następnie byłoby miło, gdyby subwoofer zrobił coś pożytecznego, gdyby został wywołany bez zasięgu lub istoty. W większości przypadków możemy to naprawić, nadając parametrom
@range
i&gist
odpowiednie wartości domyślne:Jeśli nie
@seq
jest leniwy , domyślnie jest to pełny zakres . Jeśli jest nieskończony (w takim przypadku jest również leniwy), to domyślnie do 100 jest w porządku. Ale co, jeśli jest leniwy, ale daje mniej niż 100 zdefiniowanych wartości? Aby uwzględnić tę sprawę, dołączamy do deklaracji:@range
@seq
@seq
@seq
.grep: *.value.defined
@pairs
Kolejnym prostym ulepszeniem byłyby opcjonalne parametry głowy i ogona, prowadzące do ostatecznego dopracowanego rozwiązania:
źródło
...
częścią, dzięki czemu wygląda bardziej jak program w języku C. To naprawdę odpowiada na obie części mojego pytania. Jeśli chodzi o „kompleksowe” rozwiązanie, wygląda naprawdę onieśmielająco.Możesz pominąć pierwsze N wartości na dowolnym
Iterable
lub zaSequence
pomocąskip
:Jeśli nie podasz liczby, pominie tylko jeden element.
źródło
skip
Wydaje się usunąć tylko ouput czyli element z indeksem 0th (a0) pozostaje. Próbowałem@seq:delete
i właśnie zastąpiłem 0 element(Any)
skip
Będzie po prostu działać tak, jakby pominięte elementy nie istnieją. To może być lub nie być to, czego chcesz :-)skip
pomiędzy tak, że brzmi:for @seq[^10].skip(0).kv
to dosłownie nie pominąć elementu 0TH i to nie ma znaczenia, czy dam jako argument doskip
1 lub 2, po prostu wypacza się ponadto. Potrzebuję praktycznego sposobu na usunięcie 0 elementu od podstaw.for @seq[^10].kv.skip(2)
jest to, czego szukasz?skip
po tym,.kv
ale używając argumentów innych niż 2, więc to nie zadziałało. Dziękuję za rozwiązanie.Może to być nieco bardziej idiomatyczne:
Nie musisz używać zmiennej leksykalnej w sekwencji; albo
Whatever
czy zmienne zastępcze mogą być bezpiecznie stosowane w sekwencjach. Następnie możesz po prostu wybrać elementy sekwencji, które chcesz wydrukować. Który zwraca«(0 1 2 3)(7 8 9 10)»
źródło
whatever
Operator refreshening ale wyjście seria / sekwencja nie rozwiązuje głównego problemu. Chciałbym wydrukować serię tak, jak są one widoczne w podręcznikach matematyki, tj. Z...
zapisem pomiędzy nimi.