Gaisā. Mirklis. Nogādāts.

Nākotne sāksies šodien, ja vien tu palīdzēsi. Mums ir droni, kuri spēj nogādāt sūtījumus visā Latvijā. Tavs uzdevums ir izveidot loģiku, kas ļaus šiem droniem veikt piegādi, bet esi uzmanīgs - katra kļūda var maksāt drona dzīvību...

Balvu fonds

3 portatīvie datori MacBook Air labāko risinājumu izstrādātājiem. Datoru varēs iegūt, ja risinājums būs pilnvērtīgs un ja iepriekšējā konkursā neieguvi datoru. Ja ieguvi, tad būs cita motivācijas balva.

Uzdevuma izpildes norādījumi

  • Drīksti izmantot interneta resursus, tajā skaitā Google Maps un ChatGPT.
  • Nedrīksti izmantot kursa biedru un citu cilvēku palīdzību.
  • Koda kārtīgums un dokumentēšana (komentāri) var dot papildu punktus.
  • Darbu drīksti realizēt gan skola.hex.lv, gan lokālā vidē.
  • Darba laiks ir no 10:20 līdz 14:30.
  • Kad uzdevums pabeigts, visas datnes iesniedz skolo.lv kursa Sistēmu programmēšana uzdevumā Draugiem Group pavasara konkurss.

Ir zināms

  • Piegādājamās paciņas minimālā masa ir 0,01 kg, maksimālā masa ir 1 kg.
  • Drona maksimālā kravas masa ir 1 kg.
  • Drons var vienlaicīgi pārvietot vairākas paciņas, ja to kopējā masa nepārsniedz 1 kg.
  • Bāzes stacijā atrodas drona uzlādes punkts un visas piegādājamās paciņas.
  • Jo paciņas masa ir lielāka, jo uz tuvāku galamērķi tā ir jānogādā.
  • Ja lidojuma sākumā drona akumulators ir pilnībā uzlādēts, tad drona maksimālais veiktais attālums atkarībā no kravas masas mainās tā, kā dots grafikā.
  • No bāzes stacijas drons izlido tikai ar pilnībā uzlādētu akumulatoru.
  • Zeme ir apaļa.

Tiek pieņemts

  • Drons lidojumus veic bezvējā - vēja virziens un ātrums nav jāņem vērā.
  • Drona baterijas kapacitāte nesamazinās pēc atkārtotas uzlādes.
  • Enerģija, kas tiek patērēta, paceļoties un nolaižoties, nav jāņem vērā.
  • Apkārtējās vides temperatūra, lidojuma augstums virs jūras līmeņa, atmosfēras spiediens, paciņas izmērs vai jebkurš cits faktors neietekmē drona veikto ceļu.
  • Piegādes vieta var būt jebkura vieta Latvijas teritorijā un tās tuvumā, tāpēc Latvijas teritoriju var vienkāršot par taisnstūri, kā parādīts attēlā ar oranži - dzelteno līniju.

Uzdevumi

1

generatePackages()

Izveido funkciju generatePackages(), kura atgriež 10 nejuši izvēlētas paciņu masas, izteiktas gramos.

  • Rezultātam jābūt JSON formātā (piemērā dotas tikai 3 masas): [156, 450, 378]
  • Visas vērtības ir naturāli skaitļi robežās no 10 līdz 1000.
  • Izsaucot funkciju atkārtoti, katru reizi tiek atgrieztas citas masas.
  • Saglabā šo funkciju datnē packages.php

Izveido funkciju generateLocations(), kura atgriež 10 nejauši izvēlētu vietu koordinātas vienkāršotajā Latvijas teritorijā.

  • Rezultātam jābūt JSON formātā (piemērā dotas tikai 3 vietas): [{"lat":57.1540,"long":24.8558},{"lat":56.6539,"long":23.7230},{"lat":57.0122,"long":24.9544}]
  • Vērtībām jābūt ar 4 decimālcipariem.
  • Izsaucot funkciju atkārtoti, katru reizi tiek atgrieztas citas koordinātas.
  • Saglabā šo funkciju datnē locations.php
2

generateLocations()

3

calculateDeliveryPlan($home, $dst, $pkg)

Izveido funkciju calculateDeliveryPlan($home, $dst, $pkg), kura saņem:

  • $home - drona bāzes stacijas koordinātas JSON fromāts. Piemērs: {“lat”:57.3183,“long”:25.2833}
  • $dst - 10 piegādes vietu koordinātes JSON formātā. Saīsināts piemērs: [{"lat":57.1540,"long":24.8558},{"lat":56.6539,"long":23.7230},{"lat":57.0122,"long":24.9544}]
  • $pkg - 10 paciņu masas JSON formātā. Saīsināts piemērs: [156, 450, 378]

Ņemot vērā visus iepriekš minētos uzdevuma nosacījumus un drona iespējas, funkcija aprēķina paciņu piegādes plānu tā, lai drons:

  • kopumā nolidotu pēc iespējas mazāk kilometru,
  • viena lidojuma laikā paciņas ar lielāko masu piegādātu vispirms,
  • bāzē atgrieztos bez kravas,
  • neizlādētos lidojuma laikā.

Piegādes plāna izvades piemērs

Izveidotā funkcija skola.hex.lv konsolē vai HTML lapā izvada pilnu paciņu piegādes plānu (piemērā plāns ir saīsināts).

  • Paņem 1. paciņu, masa 450 grami
  • Paņem 2. paciņu, masa 378 grami
  • Lido 31.56 km uz 0. vietu, koordinātas: 57.1540, 24.8558
  • Noliek 1. paciņu, masa 450 grami
  • Lido 16.85 km uz 2. vietu, koordinātas: 57.0122, 24.9544
  • Noliek 2. paciņu, masa 378 grami
  • Lido 39.39 km uz bāzi un uzlādē akumulatoru
  • Paņem 0. paciņu, masa 156 grami
  • Lido 119.97 km uz 1. vietu, koordinātas: 56.6539, 23.7230
  • Lido 119.97 km uz bāzi un uzlādē akumulatoru
  • Visas paciņas nogādātas veiksmīgi

Piegādes plāna izvades nosacījumi

  • Paciņas un piegādes vietas numurē no 0. līdz 9.
  • Ja iespējami vairāki piegādes plāni, izvadīt var jebkuru no tiem.
  • Atkarībā no tā, vai funkciju veido skola.hex.lv vai citur, rindiņu atdalīšanai vari izmantot gan \n, gan <ul><li></li></ul>, gan citus paņēmienus.
  • Saglabā šo funkciju datnē drone-logic.php
  • Šajā datnē var atrasties arī citas nepieciešamās funkcijas.
  • Veiksmīgs vizuālais noformējums šīs funkcijas izvadē var dot papildu punktus.