Kurzusok
/
Julia
Julia
/
Feladatok
/
Madárfigyelő
Madárfigyelő

Madárfigyelő

Tanulófeladat

Bevezetés

A Vectors fogalomban azt mondtuk, hogy „a tömbök a Julia nyelv szívében vannak”, és a vektor egydimenziós.

Ezt figyelembe véve joggal remélhetjük, hogy a nyelv sok sokoldalú és hatékony módot kínál arra, hogy dolgokat csináljunk a vektorokkal, bármit is jelentsen ez.

Vektorokat váró függvények

Néhány nagyon egyszerű függvény vektorbemenetet kap, és skaláris kimenetet ad vissza.

v = [2, 3, 4]
length(v)  # => 3
sum(v)  # => 9

Aritmetika

Tegyük fel, hogy van egy numerikus vektorod, és minden értékből le szeretnél vonni 0,5-öt.

julia> v = [1.2, 1.5, 1.7]
3-element Vector{Float64}:
 1.2
 1.5
 1.7

julia> v - 0.5
ERROR: MethodError: no method matching -(::Vector{Float64}, ::Float64)

Ez nem működik, de mi a helyzet egy másik vektor kivonásával?

julia> v - [0.5, 0.5, 0.5]
3-element Vector{Float64}:
 0.7
 1.0
 1.2

Sikeres, de meglehetősen fárasztó és memóriaigényes, ahogy a vektorok egyre hosszabbak lesznek.

Szerencsére a Juliának van egy „varázslatos” pontja, amivel nagyon egyszerűen megoldhatod ezt a problémát: mindössze v .- 0.5 kell.

A következő szakasz megmagyarázza, miért.

Szórás

Tehát a v - 0.5 nem működik, a v .- 0.5 viszont igen, és meg kell értenünk, mit csinál a pont.

Két dolog, amelyek együtt adják a kívánt eredményt.

1. Elemenkénti alkalmazás

Először is, ha bármely infix operátor elé pontot teszel, az azt jelenti, hogy „alkalmazd ezt a műveletet minden elemre külön-külön”.

Hasonlóképpen, ha egy függvénynév után pontot teszel, az „vektorizálja” azt, még akkor is, ha a függvény skaláris bemenetekre készült.

julia> sqrt.([1, 4, 9])
3-element Vector{Float64}:
 1.0
 2.0
 3.0

2. Szingleton-kiterjesztés

Egy korábbi példában láttuk, hogy ki lehet vonni egyenlő hosszúságú vektorokat, de kérlek, értsd meg, hogy a .- biztonságosabb operátor, mint a -, mert egyértelművé teszi az elemenkénti szándékot.

julia> v .- [0.5, 0.5, 0.5]
3-element Vector{Float64}:
 0.7
 1.0
 1.2

Mi a helyzet az egyenlőtlen hosszúságú vektorokkal?

julia> v .- [0.5, 0.5]
ERROR: DimensionMismatch: arrays could not be broadcast to a common size

julia> v .- [0.5,]
3-element Vector{Float64}:
 0.7
 1.0
 1.2

Általában véve az egyenlőtlen hosszúságok hiba, kivéve, ha az egyik hossza 1 (technikailag egy „szingleton” dimenzió).

A [0.5,] vagy egyszerűen 0.5 alakú szingletonok automatikusan kiterjesztődnek a szükséges hosszra ismétléssel. Ez a broadcasting lényege.

Indexelés

A vektor elemeinek indexszám szerinti kiválasztásáról már volt szó korábbi fogalmakban.

a = collect('A':'Z')  # => 26-element Vector{Char}

# index with an integer
a[2]  # => 'B'

# index with a range
 a[12:2:18]  # => ['L', 'N', 'P, 'R']
 
 # index with another vector
 a[ [1, 3, 5] ]  # => ['A', 'C', 'E']

Logikai indexelés

Lehetőség van arra is, hogy olyan elemeket válasszunk ki, amelyek kielégítenek egy logikai kifejezést (technikailag egy „predikátum”). Ez általában szórást igényel.

julia> a[a .< 'D']
3-element Vector{Char}:
 'A': ASCII/Unicode U+0041 (category Lu: Letter, uppercase)
 'B': ASCII/Unicode U+0042 (category Lu: Letter, uppercase)
 'C': ASCII/Unicode U+0043 (category Lu: Letter, uppercase)

Bonyolultabb kifejezéseknél a pontok hajlamosak elszaporodni (de kicsik és könnyű beírni őket).

julia> a[a .< 'D' .|| a .> 'W']
6-element Vector{Char}:
 'A': ASCII/Unicode U+0041 (category Lu: Letter, uppercase)
 'B': ASCII/Unicode U+0042 (category Lu: Letter, uppercase)
 'C': ASCII/Unicode U+0043 (category Lu: Letter, uppercase)
 'X': ASCII/Unicode U+0058 (category Lu: Letter, uppercase)
 'Y': ASCII/Unicode U+0059 (category Lu: Letter, uppercase)
 'Z': ASCII/Unicode U+005A (category Lu: Letter, uppercase)

Emlékeztetőül: a „vektor” valójában bármilyen megfelelő rendezett iterálható lehet, például egy tartomány:

julia> n = 3:10
3:10

julia> n[isodd.(n)]
4-element Vector{Int64}:
 3
 5
 7
 9

Utasítások

Szenvedélyes madárfigyelő vagy, aki számontartja, hány madár járt a kertedben az elmúlt hét napban.

Hat részfeladat vár rád, és mindegyik a kertedbe látogató madarak számával foglalkozik.

1. Ellenőrizd, hány madár járt ma a kertedben

Valósítsd meg a today() függvényt, amely visszaadja, hogy ma hány madár járt a kertedben. A madárszámok napok szerint követik egymást: az első elem a legrégebbi naphoz tartozó szám, az utolsó pedig a maihoz.

julia> birds_per_day = [2, 5, 0, 7, 4, 1]
julia> today(birds_per_day)
1

2. Növeld meg a mai napi számot

Valósítsd meg az increment_todays_count() függvényt, amely megnöveli a mai napi számot:

julia> birds_per_day = [2, 5, 0, 7, 4, 1]
julia> increment_todays_count(birds_per_day)
[2, 5, 0, 7, 4, 2]

3. Ellenőrizd, volt-e olyan nap, amikor egyetlen madár sem járt a kertedben

Valósítsd meg a has_day_without_birds() függvényt, amely true értéket ad vissza, ha volt olyan nap, amikor nulla madár járt a kertedben; egyébként false értéket ad vissza:

julia> birds_per_day = [2, 5, 0, 7, 4, 1]
julia> has_day_without_birds(birds_per_day)
true

4. Számítsd ki a látogató madarak számát az első néhány napra

Valósítsd meg a count_for_first_days() függvényt, amely visszaadja, hány madár járt a kertedben a hét elejétől kezdve, de a számolást korlátozd a hét elejétől számított megadott számú napra.

julia> birds_per_day = [2, 5, 0, 7, 4, 1]
julia> count_for_first_days(birds_per_day, 4)
14

5. Számítsd ki a forgalmas napok számát

Némelyik nap forgalmasabb, mint a többi. Forgalmas nap az, amikor öt vagy több madár járt a kertedben. Valósítsd meg a busy_days() függvényt, amely visszaadja a forgalmas napok számát:

julia> birds_per_day = [2, 5, 0, 7, 4, 1]
julia> busy_days(birds_per_day)
2

6. Számítsd ki a napi átlagokat a hét napjai szerint

Úgy döntesz, hogy bővíted a nyilvántartásodat, és több hétre is vezetni fogod a számokat. Mindegyik esetben a számok a hét napjai szerint rendeződnek, a hétfő az első bejegyzés, a vasárnap az utolsó.

Valósítsd meg az average_per_day() függvényt, amely két hét átlagát adja vissza.

julia> week1 = [7, 2, 9, 1, 3, 0, 10]
julia> week2 = [2, 6, 4, 1, 3, 8, 9]
julia> average_per_day(week1, week2)
[4.5, 4.0, 6.5, 1.0, 4.0, 3.0, 9.5]
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Julia Exercism

Készen állsz elkezdeni a(z) Madárfigyelő feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Julia nyelvet 35 fogalom128 feladat segítségével, valódi emberi mentorálással, mindez ingyen.