Kurzusok
/
Go
Go
/
Feladatok
/
Sakktábla
Sakktábla

Sakktábla

Tanulófeladat

Bevezetés

Go-ban a for és egy index segítségével is végigmehetsz egy slice elemein, de használhatod a range-et is. A range segítségével egy map elemein is végigmehetsz.

Minden iteráció két értéket ad vissza: az indexet/kulcsot és az adott indexen/kulcson lévő elem egy másolatát.

Iterálás egy slice elemein

Gyerekjáték: a ciklus a slice elemein a várt sorrendben megy végig.

xi := []int{10, 20, 30}
for i, x := range xi {
  fmt.Println(i, x)
}
// outputs:
// 0, 10
// 1, 20
// 2, 30

Iterálás egy map elemein

A map elemein való iterálás új problémát vet fel. A sorrend most véletlenszerű.

hash := map[int]int{9: 10, 99: 20, 999: 30}
for k, v := range hash {
  fmt.Println(k, v)
}
// outputs, for example:
// 99 20
// 999 30
// 9 10
Note

Első ránézésre úgy tűnhet, hogy a fenti kimenet hibás, hiszen az ember arra számítana, hogy a map deklarálásakor elsőként megadott kulcs/érték pár, a 9 10, jelenik meg először a kimenetben, nem pedig utolsóként. A map-ek azonban természetüknél fogva rendezetlenek: nincs sem első, sem utolsó kulcs/érték pár. Emiatt amikor egy map bejegyzésein iterálsz, a bejegyzések bejárási sorrendje véletlenszerű lesz, és nem követ semmilyen meghatározott mintát. Ez azt jelenti, hogy a fenti kimenet lehetséges, de eltérhet attól, amit te kapsz, ha magad is lefuttatod a kódot. Ha többet szeretnél megtudni erről, nézd meg a Go Language Spec: range clause oldalt.

Iterálás a kulcs vagy az érték elhagyásával

Go-ban a fel nem használt változó fordítási időben hibát okoz. Néha csak az értékre van szükséged, ahogy az első példában is:

xi := []int{10, 20, 30}
for i, x := range xi {
  fmt.Println(x)
}
// Go build failed: i declared but not used

Az i helyére _-t írhatsz, ami megmondja a fordítónak, hogy nem használjuk azt az értéket:

xi := []int{10, 20, 30}
for _, x := range xi {
  fmt.Println(x)
}
// outputs:
// 10
// 20
// 30

Ha csak az indexet szeretnéd kiírni, az x helyére _-t tehetsz, vagy egyszerűen elhagyhatod a deklarációt:

xi := []int{10, 20, 30}
// for i, _ := range xi {
for i := range xi {
  fmt.Println(i)
}
// outputs:
// 0
// 1
// 2

Típusok definiálása

A típusdefiníció egy új, nevesített típust hoz létre, amely minden más típustól különbözik, még az ugyanolyan mögöttes típusútól is.

type File []bool

A File itt a sakktábla egyetlen függőleges oszlopára utal, amelyet általában A-tól H-ig jelölnek. Ebben az oszlopban minden mezőt egy Boolean érték képvisel, amely azt jelöli, hogy foglalt-e vagy sem. Most, hogy a File definiálva van, más definíciókban is felhasználhatjuk:

type Chessboard map[string]File

board := Chessboard{
    "A": File{true, false, true},
    "B": File{false, true, false},
}

A Chessboard az oszlopazonosítókat File értékekhez rendeli. Minden File egy Boolean-okból álló slice, amely egy sakk-oszlop mezőit képviseli. Ezen típusdefiníciók nélkül a board egy map[string][]bool lenne, ami megnehezítené annak megértését, hogy mit is képviselünk.

Utasítások

Sakkrajongóként szeretnéd megírni a játék saját változatát. Persze, már rengeteg sakkimplementáció elérhető online, de a tiéd egyedi lesz!

A sakktábla minden mezőjét egy betű-szám pár azonosítja:

  • A mezők vízszintes sorait soroknak nevezzük, és 1-től 8-ig számozzuk őket.
  • A mezők függőleges oszlopait vonalaknak nevezzük, és A-tól H-ig jelöljük őket.
   A B C D E F G H
 8 # _ _ _ # _ _ # 8
 7 _ _ _ _ _ _ _ _ 7
 6 _ _ _ _ # _ _ # 6
 5 _ # _ _ _ _ _ # 5
 4 _ _ _ _ _ _ # # 4
 3 # _ # _ _ _ _ # 3
 2 _ _ _ _ _ _ _ # 2
 1 # _ _ _ _ _ _ # 1
   A B C D E F G H

1. Adott egy sakktábla és egy vonal, számold meg, hány mező foglalt

Valósítsd meg a CountInFile(board Chessboard, file string) int függvényt. A függvény számolja meg a foglalt mezők teljes számát úgy, hogy végigmegy egy mapen. Adjon vissza egy egész számot. Ha a megadott vonal nem található a mapben, adjon vissza nullát (0).

CountInFile(board, "A")
// => 3

2. Adott egy sakktábla és egy sor, számold meg, hány mező foglalt

Valósítsd meg a CountInRank(board Chessboard, rank int) int függvényt. A függvény számolja meg a foglalt mezők teljes számát úgy, hogy végigmegy a megadott soron. Adjon vissza egy egész számot. Ha a megadott sor nem érvényes (nem 1 és 8 között van, a határokat is beleértve), adjon vissza nullát (0).

CountInRank(board, 2)
// => 1

3. Számold meg, hány mező van a megadott sakktáblán

Valósítsd meg a CountAll(board Chessboard) int függvényt. A függvény számolja meg, hány mező van a sakktáblán, és adjon vissza egy egész számot. Mivel nem kell ellenőrizned a mezők tartalmát, érdemes lehet a range utasítást úgy használni, hogy az index-et és a value-t is elhagyod.

CountAll(board)
// => 64

4. Számold meg, hány mező foglalt a megadott sakktáblán

Valósítsd meg a CountOccupied(board Chessboard) int függvényt. A függvény számolja meg, hány mező foglalt a sakktáblán. Adjon vissza egy egész számot.

CountOccupied(board)
// => 15
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Go Exercism

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

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