Kurzusok
/
Gleam
Gleam
/
Feladatok
/
Kitalálós játék
Kitalálós játék

Kitalálós játék

Tanulófeladat

Bevezetés

Case kifejezések

A Gleamben a case kifejezéssel feltételesen hajthatsz végre kódot. Egy case kifejezéssel egy értéket egy vagy több mintával lehet összevetni. Ilyen minta például a literál minta, amely egy értéket egy literál értékkel vet össze (pl. 1 vagy "hello").

A case kifejezéseket a case kulcsszóval írod le:

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    1 -> "One"
  }
}

Bár ez más nyelvek switch utasításaira hasonlíthat, a mintaillesztés akkor mutatja meg igazi erejét, amikor más mintákat is használsz. Ilyen minta a változóminta, amellyel egy értéket rendelhetsz egy változóhoz. Ebben a példában az i változó a number értékét kapja, ha az nem 0:

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    i -> "Non zero"
  }
}

Bizonyos esetekben további feltételt szeretnél adni egy mintához. Ezt nevezik guardnak (klauzula), amelyet az if kulcsszóval adhatsz hozzá:

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    i if i < 0 -> "Negative number"
  }
}

Teljesítménybeli okokból a guardokban csak alapvető matematikai és logikai operátorok engedélyezettek, más függvények nem használhatók guardokban.

A fenti példában nem minden lehetséges bemenethez tartozik illeszkedő minta. A fordító ezt észleli, és hibát jelez. Ezt nevezik kimerítő ellenőrzésnek. A figyelmeztetés megoldásához minden esetet kezelni kell. Erre az eldobó minta használható, amely bármely értékre illeszkedik:

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    i if i < 0 -> "Negative number"
    _ -> "Positive number"
  }
}

// No compiler error

Egy klauzulában több mintát is össze lehet vetni, a mintákat a | választja el egymástól. Egy klauzulához csak egy guard adható:

pub fn describe(number: Int) -> String {
  let yell = True
  case number {
    0 -> "Zero"
    3 | 5 -> "One of the first odd prime numbers"
    2 | 4 | 6 | 8 if !yell -> "One of the even numbers less than 10"
    i if i % 2 == 0 && yell -> "[Yelling] I'm telling you! It's a even nunber"
    i if i < 0 -> "Negative number"
    _ -> "Positive number"
  }
}
// No compiler error

A case kifejezések felülről lefelé vetik össze az értéket minden mintával, amíg illeszkedő mintát nem találnak, majd végrehajtják a hozzá tartozó logikát. A minták sorrendje számít!

Utasítások

Ebben a feladatban egy számkitalálós játékot játszol egy barátoddal. A szabályok egyszerűek: titokban választasz egy számot 1 és 100 között, és a barátod megpróbálja kitalálni, hogy melyik számot választottad. Hogy segíts a barátodnak, különbözőképpen válaszolsz attól függően, hogy mennyire volt közel a tipp a választott számodhoz (42). Ezek a szabályok a különböző válaszokhoz:

  • Ha a tipp 42: "Correct"
  • Ha a tipp 41 vagy 43: "So close"
  • Ha a tipp kevesebb, mint 41: "Too low"
  • Ha a tipp nagyobb, mint 43: "Too high"

Négy feladatod van, hogy kódold a tippekre adott válaszokat.

1. Válasz egy helyes tippre

Valósítsd meg a reply függvényt, hogy válaszolj egy helyes tippre:

reply(42)
// -> "Correct"

2. Válasz egy közeli tippre

Módosítsd a reply függvényt, hogy válaszolj a közeli tippekre:

reply(41)
// -> "So close"

3. Válasz a túl alacsony tippekre

Módosítsd a reply függvényt, hogy válaszolj a túl alacsony tippekre:

reply(25)
// -> "Too low"

4. Válasz a túl magas tippekre

Módosítsd a reply függvényt, hogy válaszolj a túl magas tippekre:

reply(88)
// -> "Too high"
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Gleam Exercism

Készen állsz elkezdeni a(z) Kitalálós játék feladatot?

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