Kurzusok
/
Crystal
Crystal
/
Feladatok
/
Chaitana kolosszális hullámvasútja
Chaitana kolosszális hullámvasútja

Chaitana kolosszális hullámvasútja

Tanulófeladat

Bevezetés

A tömbök gyakori adatszerkezetek, amelyekkel gyakran dolgozunk. Ezért számos metódus áll rendelkezésre a tömbök kezeléséhez. Többek között rendezésre, megfordításra, beszúrásra és még sok másra.

Ezek közül néhány destruktív, ami azt jelenti, hogy módosítja az eredeti tömböt. Mások nem destruktívak, azaz új tömböt adnak vissza, és nem módosítják az eredetit.

Íme néhány a leggyakoribb metódus közül, amelyeket a tömbök kezelésekor használhatsz:

insert

Amikor egy elemet szúrsz be egy tömbbe, használhatod az insert metódust, amely egy indexet és egy elemet vár argumentumként. Az elem a megadott indexre kerül, a tömb többi eleme pedig jobbra tolódik. Ha az index kívül esik a tömb határain, akkor IndexError keletkezik.

numbers = [1, 2, 3]
numbers.insert(1, 4)
numbers # => [1, 4, 2, 3]

numbers.insert(5, 5) # => Error: Index out of bounds (IndexError)

delete

Ha egy adott elemet szeretnél törölni egy tömbből, használhatod a delete metódust, amely egy elemet vár argumentumként. A metódus visszaadja az eltávolított elemet. Ha az elem nem szerepel a tömbben, akkor nil-t ad vissza.

numbers = [1, 2, 3]
numbers.delete(2) # => 2
numbers           # => [1, 3]

first & last

Ha egy tömb első vagy utolsó elemét szeretnéd megkapni, használhatod a first és a last metódust. Ezek a metódusok egy opcionális argumentumot fogadnak, amely megadja, hány elemet adjanak vissza. Ez javíthatja az olvashatóságot ahhoz képest, mintha a 0 vagy a -1 indexet, vagy egy tartományt használnál. Ha a tömb üres, akkor Enumerable::EmptyError keletkezik.

numbers = [1, 2, 3]
numbers.first # => 1
numbers.last  # => 3

numbers.first(2) # => [1, 2]
numbers.last(2)  # => [2, 3]

empty_array = [] of Int32
empty_array.last # => Error: Empty enumerable (Enumerable::EmptyError)

reverse

Ha meg szeretnél fordítani egy tömböt, használhatod a reverse metódust, amely egy új tömböt ad vissza, benne az elemekkel fordított sorrendben. Fontos megjegyezni, hogy a reverse új tömböt ad vissza, és nem módosítja az eredeti tömböt. Ha módosítani szeretnéd az eredeti tömböt, tegyél egy ! jelet a metódus nevének végére.

numbers = [1, 2, 3]
numbers.reverse # => [3, 2, 1]
numbers         # => [1, 2, 3]

numbers.reverse! # => [3, 2, 1]
numbers          # => [3, 2, 1]

Concat(+)

A hozzáfűző metódus (<<) akkor hasznos, ha objektumokat szeretnél hozzáadni egy tömbhöz. Két tömb összekapcsolásához azonban használhatod a + operátort, amely egy új tömböt ad vissza, benne mindkét tömb elemeivel.

[1, 2] + [3, 4] # => [1, 2, 3, 4]

Ha egy tömböt fűzöl hozzá egy másik tömbhöz, akkor a tömb egyetlen elemként kerül hozzáadásra.

[1, 2] << [3, 4] # => [1, 2, [3, 4]]

empty?

Ha azt szeretnéd ellenőrizni, hogy egy tömb üres-e, használhatod az empty? metódust, amely true értéket ad vissza, ha a tömb üres, és false-t egyébként. Ez javítja az olvashatóságot ahhoz képest, mintha a tömb hosszát hasonlítanád össze a 0 értékkel.

[].empty? # => true
[1, 2, 3].empty? # => false

index

Ha egy elem indexét szeretnéd megkapni egy tömbben, használhatod az index metódust, amely egy elemet vár argumentumként. Ha az elem nem szerepel a tömbben, akkor nil-t ad vissza.

numbers = [1, 2, 3]
numbers.index(2) # => 1

size

Ha szeretnéd tudni, hány elem van egy tömbben, használhatod a size metódust.

numbers = [1, 2, 3]
numbers.size # => 3

count

Ha meg szeretnéd számolni, hogy egy elem hányszor fordul elő egy tömbben, használhatod a count metódust.

fruits = ["apple", "banana", "apple"]
fruits.count("apple")      # => 2
fruits.count("banana")     # => 1
fruits.count("watermelon") # => 0

sort

Ha szeretnél rendezni egy tömböt, használhatod a sort metódust, amely egy új tömböt ad vissza, benne a rendezett elemekkel. A reverse-hez hasonlóan ez a metódus is új tömböt ad vissza, és nem módosítja az eredeti tömböt.

numbers = [3, 2, 1]
numbers.sort # => [1, 2, 3]
numbers      # => [3, 2, 1]

numbers.sort! # => [1, 2, 3]
numbers       # => [1, 2, 3]

Utasítások

Chaitana egy nagyon népszerű vidámpark tulajdonosa. A gyönyörűen parkosított terület kellős közepén csupán egyetlen attrakciója van: A világ legnagyobb hullámvasútja(TM). Bár csak ez az egy látnivaló van, az emberek a világ minden tájáról utaznak ide, és órákig állnak sorban, hogy kipróbálhassák Chaitana hiperhullámvasútját.

Ehhez az attrakcióhoz két sor tartozik, mindegyiket egy-egy array képviseli:

  1. Normál sor
  2. Expressz sor (más néven gyorssáv), ahol az emberek plusz díjat fizetnek az elsőbbségi hozzáférésért.

Azt a feladatot kaptad, hogy írj egy kis kódot, amellyel jobban kezelhetők a park vendégei. A lehető leghamarabb meg kell valósítanod a következő függvényeket, mielőtt a vendégek (és a főnököd, Chaitana!) kiakadnak.

1. Személy hozzáadása a sorhoz

Definiáld a ColossalCoaster.add_to_queue metódust, amely 4 argumentumot vár, <express_queue>, <normal_queue>, <ticket_type>, <person_name>, és visszaadja a megfelelő sor frissített változatát a személy nevével.

  1. A <ticket_type> egy Int32, ahol az 1 == express_queue, a 0 == normal_queue.
  2. A <person_name> annak a személynek a neve (egy String), akit a megfelelő sorhoz kell hozzáadni.
express_queue = ["Tony", "Bruce"]
normal_queue = ["RobotGuy", "WW"]
ColossalCoaster.add_to_queue(express_queue, normal_queue, 1, "RichieRich")
# => ["Tony", "Bruce", "RichieRich"]

2. Hol vannak a barátaim?

Egy ember későn érkezett a parkba, de ahhoz a sorhoz szeretne csatlakozni, ahol a barátai várakoznak. Fogalma sincs azonban, hogy hol állnak a barátai, és nincs térerő sem, hogy felhívja őket.

Definiáld a ColossalCoaster.find_my_friend metódust, amely 2 argumentumot vár, queue és friend_name, és visszaadja a személy nevének helyét a sorban.

  1. A <queue> egy array, amely a sorban álló embereket tartalmazza.
  2. A <friend_name> annak a barátnak a neve, akinek az indexét (a sorban elfoglalt helyét) meg kell keresned.
ColossalCoaster.find_my_friend(["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], "Steve")
# => 1

3. Csatlakozhatok hozzájuk?

Most, hogy megkerestük a barátaikat (a fenti 2. részfeladatban), a későn érkező hozzájuk szeretne csatlakozni a sorban elfoglalt helyükön. Definiáld a ColossalCoaster.add_with_friends metódust, amely 3 argumentumot vár: queue, friend_name és person_name.

  1. A <queue> egy array, amely a sorban álló embereket tartalmazza.
  2. A <friend_name> annak a barátnak a neve, akinek a helyére az illetőt be kell szúrni.
  3. A <person_name> annak a személynek a neve, akit az adott indexpozícióhoz kell hozzáadni.

Add vissza a frissített sort, benne a későn érkező nevével.

ColossalCoaster.add_with_friends(["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], "Steve", "Bucky")
# => ["Natasha", "Bucky", "Steve", "T'challa", "Wanda", "Rocket"]

4. Gonosz ember a sorban

Épp most hallottad a sorból, hogy van egy igazán gonosz ember, aki lökdösődik, kiabál és bajt csinál. Ki kell dobnod ezt a gazembert a rossz viselkedése miatt!

Definiáld a ColossalCoaster.remove_from_queue metódust, amely 2 argumentumot vár, queue és person_name.

  1. A <queue> egy array, amely a sorban álló embereket tartalmazza.
  2. A <person_name> annak a személynek a neve, akit ki kell dobni.

Add vissza a frissített sort, amelyből hiányzik a gonosz ember neve.

ColossalCoaster.remove_from_queue(["Natasha", "Steve", "Eltran", "Wanda", "Rocket"], "Eltran")
# => ["Natasha", "Steve", "Wanda", "Rocket"]

5. A sor rendezése

Adminisztratív okokból egy adott sorban lévő összes nevet ábécésorrendbe kell rendezned.

Definiáld a ColossalCoaster.sorted_queue metódust, amely 1 argumentumot vár: queue (a sorban álló embereket tartalmazó array). A metódusnak az array egy rendezett másolatát kell visszaadnia.

ColossalCoaster.sorted_queue(["Natasha", "Steve", "Eltran", "Natasha", "Rocket"])
# => ['Eltran', 'Natasha', 'Natasha', 'Rocket', 'Steve']
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Crystal Exercism

Készen állsz elkezdeni a(z) Chaitana kolosszális hullámvasútja feladatot?

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