Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Advanced 1

src/livebook/advanced.livemd

Advanced 1

Mix.install([
  {:vega_lite, "~> 0.1.10"},
  {:kino_vega_lite, "~> 0.1.13"}
])

Introduktion

Da du allerede har styr på mindst ét sprog har vi en betydelig mængde viden der er transferable. Det vil vi prøve at udnytte.

Forberedelse

Dette trins opave er:

  1. Check dette repositorie ud (eller download filerne): https://github.com/aslakjohansen/livebook-demos
  2. Åben index.livemd i Livebook.
  3. Evaluér den sidste celle. Dette giver dig en oversigt over de demoer der er tilgængelige i repositoriet.
  4. Klik dig igennem følgende demoer:
    1. Basic data types
    2. Control structures
    3. Pattern matching
    4. Pipelines
    5. Primitive concurrency

Øvelse

Dette moduls øvelser tager udgangspunkt i følgende to definitioner:

defmodule Circle do
  defstruct [:x, :y, :r]
end
circles = [
  %Circle{x: 0, y: 0, r: 1.0},
  %Circle{x: 3, y: 3, r: 2},
  %Circle{x: -7.1, y: -2.3, r: -1.32},
  %Circle{x: -2, y: -1.5, r: 1.2},
  %Circle{x: 1.2, y: -3.2, r: 0.3},
  %Circle{x: 2.1, y: 2.45, r: -3.8},
  %Circle{x: -3.7, y: 4.7, r: 1.7},
  %Circle{x: -6.13, y: -4.93, r: 2.3},
  %Circle{x: 2.4, y: -1.25, r: -2.57},
  %Circle{x: -5.54, y: 5.31, r: 2.1},
  %Circle{x: 7.3, y: -4.3, r: 3.5},
]

Øvelse 1: Nogle af disse cirkler har en negativ radius. Skriv noget kode i cellen herunder der vender sådanne radiuser om (ved at gange dem med $-1$). Resultatet skal gemmes tilbage i circles.

Øvelse 2: Skriv noget kode der på baggrund af definitionen af circles variablen fra ovenstående celle udregner summen af arealerne af disse cirkler.

Arealet af en cirkel med radius $r$ er:

$ A(r) = \pi r^2 $

Øvelse 3: Skriv en funktion der tager en radius $r{in}$ som input og returnerer en radius $r{out}$ hvorom det gælder, at $A(r{out}) = 2 \cdot A(r{in})$.

Øvelse 4: Skriv noget kode der på baggrund af ovenstående liste af cirkler fordobler disse cirklers areal og gemmer resultatet tilbage i samme variabel.

Øvelse 5: Skriv noget kode der på baggrund af samme variabel udregner den største distance mellem to cirkler.

Distancen $D$ mellem punktet $P_1 : (x_1, y_1)$ og $P_2 : (x_2, y_2)$ kan udregnes med Pythagoras:

$ D = \sqrt{(x_2-x_1)^2 + (x_2-x_1)^2} $

Øvelse 6: Nu skal disse cirkler plottes. Jeg har skrevet noget kode der kan plotte data, men dette kode kan ikke finde ud af at bruge en liste af structs. I stedet skal den have en liste af maps hvor alle keys er strenge. Din opgave er derfor at konvertere de data der ligger i circles til dette format og at gemme resultatet i en variabel der hedder data.

alias VegaLite, as: Vl
Vl.new(width: 400, height: 300)
|> Vl.data_from_values(data)
|> Vl.mark(:point)
|> Vl.encode_field(:x, "x", type: :quantitative)
|> Vl.encode_field(:y, "y", type: :quantitative)
|> Vl.encode_field(:size, "r", type: :nominal, title: "Radius")

Næste trin …

Når du er færdig går du til næste set øvelser her.