Kurzusok
/
R
R
/
Feladatok
/
Blackjack
Blackjack

Blackjack

Tanulófeladat

Bevezetés

A switch() függvény tömör alternatívája lehet egy hosszú if ... else if vizsgálatsorozatnak. A switch()-nek átadott változó leggyakrabban string, és ilyenkor az idézőjeleket el lehet hagyni a választóból.

star <- function(type) {
  switch(type,
    M = , # will "fall through" if no value given
    K = "red dwarf",
    G = "Earth-like",
    "bigger star" # only correct for O,B,A,F
  )
}

> star("M")
[1] "red dwarf"

Figyeld meg, hogy az opciók csak akkor csúsznak át a következőre, ha az érték üresen marad, ahogy az M is a fenti példában. Nem kell break utasításokat használni, mint néhány más nyelvben.

Amikor character típusra váltunk, az utolsó érték lesz az alapértelmezett, mint itt is. Egész típusoknál nem adható meg alapértelmezett érték.

Függvények a dplyr-ben

A base R switch-e meglehetősen korlátozott: csak egyetlen bemenetre tud pontos egyezést végezni. Ez ésszerűnek tűnt, amikor az R 1993-ban megjelent, de a modern használathoz fejlesztésre szorul.

Note

Ahogy a Conditionals fogalomban említettük, a tidyverse csomaggyűjtemény célja, hogy kiegészítse (és néha helyettesítse) a base R funkcionalitását anélkül, hogy a visszafelé kompatibilitást befolyásolná.

A dplyr csomagot úgy hozhatod be, ha a kódod elejére írod a library(dplyr) (az egyes csomaghoz) vagy a library(tidyverse) (a teljes gyűjteményhez) utasítást.

A dplyr csomag két további függvényt kínál a switch-hez kapcsolódóan.

A recode_values és replace_values függvények

Ez a két rokon függvény vektorizált, switch-szerű leképezést tesz lehetővé a régi értékekről az új értékekre.

A fő különbség közöttük az, hogy a recode_values() teljesen új vektort hoz létre, míg a replace_values() egy meglévő vektor részleges frissítését teszi lehetővé.

Az egyeztetés továbbra is pontos, de:

  • A bal oldali opciók vektorok is lehetnek, és a bemenet akkor egyezik, ha bármelyik elem egyezik.
  • A bal oldali opciók és a jobb oldali eredmények tilde (~) jellel kapcsolódnak össze = helyett.
  • Alapértelmezett érték minden esetben megadható.
library(dplyr)

x <- c("a", "b", "a", "d", "b", NA, "c", "e", "z")
recode_values(
  x,
  "a" ~ 1,
  "b" ~ 2,
  "c" ~ 3,
  c("d", "e") ~ 4, # either "d' or "e" will match
  NA ~ 0,          # matches missing values
  default = 100   # note the different syntax for the default
)
#> [1]   1   2   1   4   2   0   3   4 100

A case_when függvény

A case_when továbbfejleszti a case_match szintaxist: bármilyen logikai kifejezés állhat a ~ bal oldalán.

A bemeneti vektort (a lenti példában x-et) nem argumentumként kell megadni, csak már definiálva kell lennie.

x <- 1:10
case_when(
  x < 3 ~ "low",
  between(x, 3, 5) ~ "mid",
  between(x, 6, 8) ~ "high",
  .default = "what?"
)
#>  [1] "low"   "low"   "mid"   "mid"   "mid"   "high"  "high"  "high"  "what?" "what?"

A between() függvény szintén a dplyr része.

Utasítások

Ebben a feladatban egy Blackjack-játék első körét szimuláljuk.

Két lapot kapsz, és látni fogod az osztó képpel felfelé álló lapját. Minden lapot egy-egy string jelöl, például „ace”, „king”, „three”, „two” és így tovább. Az egyes lapok értékei a következők:

lap érték lap érték
ace 11 eight 8
two 2 nine 9
three 3 ten 10
four 4 jack 10
five 5 queen 10
six 6 king 10
seven 7 other 0

Megjegyzés: Az ászok általában 1 vagy 11 értéket is felvehetnek, de az egyszerűség kedvéért feltesszük, hogy csak a 11-es értéket vehetik fel.

Attól függően, hogy milyen két lapod van, és mi van az osztónál, a játék első körére létezik egy stratégia, amelyben a következő lehetőségeid vannak:

  • Megállás (S)
  • Lapkérés (H)
  • Szétválasztás (P)
  • Automatikus győzelem (W)

Bár még nem optimális, te azt a stratégiát követed, amelyet a barátod, Alex fejlesztett ki, és amely a következő:

  • Ha két ász van a kezedben, azokat mindig szét kell választanod.
  • Ha Blackjacked van (két lap, amelyek összege 21), és az osztónál nincs ász, figura vagy tízes, akkor automatikusan nyersz. Ha az osztónál van ilyen lap, akkor meg kell állnod, és meg kell várnod, amíg a másik lapja is felfordul.
  • Ha a lapjaid összege a [17, 20] tartományba esik, mindig meg kell állnod.
  • Ha a lapjaid összege a [12, 16] tartományba esik, mindig meg kell állnod, kivéve, ha az osztónál 7 vagy annál nagyobb lap van, mert akkor mindig lapot kell kérned.
  • Ha a lapjaid összege 11 vagy annál kevesebb, mindig lapot kell kérned.

1. Számítsd ki bármely adott lap értékét.

Valósíts meg egy parse_card függvényt, amely kiszámítja egy lap számértékét:

parse_card("ace")
# => 11

2. Valósítsd meg az első kör döntési logikáját.

Írj egy first_turn függvényt, amely a fent leírt döntési logikát valósítja meg:

first_turn(card1, card2, dealer_card)

Íme néhány példa a várható eredményekre:

first_turn("ace", "ace", "jack") == "P"
first_turn("ace", "king", "ace") == "S"
first_turn("five", "queen", "ace") == "H"
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
R Exercism

Készen állsz elkezdeni a(z) Blackjack feladatot?

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