Kurzusok
/
Elm
Elm
/
Feladatok
/
Gólkirályok
Gólkirályok

Gólkirályok

Tanulófeladat

Bevezetés

Dict

A Dict az Elmben egy változtathatatlan szótár, amely nulla vagy több kulcs-érték párt tartalmaz.

A szótárakat a Dict modulban definiált függvényekkel és operátorokkal kezelheted.

A szótárak típusjelölése így néz ki:

Dict String (List Int) --> a dict with String keys and List Int values
Dict Int String --> a dict with Int keys and String values

A szótárakat így hozhatod létre:

empty : Dict Int String
empty = Dict.empty

singleValue = Dict.singleton 5 "Value for key 5" --> Dict Int String

twoValues = Dict.fromList [ ( "Alice", 0 ), ( "Bob", 1 ) ] --> Dict String Int

Az elemeket a get segítségével kérheted le. Mivel egy kulcs lehet, hogy benne van a szótárban, és az is lehet, hogy nincs, az eredményt egy Maybe típusba csomagolja a függvény.

alice = Dict.fromList [ ( 0, "Alice" ) ]
keyExists = Dict.get 0 alice --> Just "Alice"
keyNotPresent = Dict.get 1 alice --> Nothing

Az elemeket az insert segítségével adhatod hozzá. A már a szótárban lévő kulcsokhoz tartozó elemek lecserélődnek.

alice = Dict.fromList [ ( "Alice", 0 ) ]
aliceAndBob = Dict.insert "Bob" 1 alice  --> Dict.fromList [ ( "Alice", 0 ), ( "Bob", 1 ) ]
aliceAndAlice = Dict.insert "Alice" 1 alice  --> Dict.fromList [ ( "Alice", 1 ) ]

Az elemeket az update segítségével frissítheted. Ha a kulcs nem létezik, az update függvény Nothing értékkel lesz meghívva.

alice = Dict.fromList [ ( 0, "Alice" ) ]
aliceUpperCase = Dict.update 0 (Maybe.map String.toUpper) alice --> Dict.fromList [ ( 0, "ALICE" ) ]
aliceNoCase = Dict.update 0 (\_ -> Nothing) alice --> Dict.empty
bobUpperCase = Dict.update 1 (\_ -> Just "BOB") alice --> Dict.fromList [ ( 0, "Alice" ), ( 1, "BOB" ) ]
bobNoCase = Dict.update 1 (\_ -> Nothing) alice --> Dict.fromList [ ( 0, "Alice" ) ]

Az elemeket a remove segítségével távolíthatod el. Ha a kulcs nem létezik, nem történik változás.

alice = Dict.fromList [ ( 0, "Alice" ) ]
stillAlice = Dict.remove 1 --> ( 0, "Alice" )
empty = Dict.remove 0 alice --> Dict.empty

A kulcs-érték párok listáját a fromList segítségével szótárrá alakíthatod.

alice = Dict.fromList [ ( 0, "Bob" ), ( 0, "Alice" ) ]
--> True Dict.fromList [ ( 0, "Alice" ) ]

Az elemeket a toList segítségével listává alakíthatod. A lista a kulcsok szerint rendezett.

aliceAndBob = Dict.fromList [ ( 1, "Alice" ), ( 0, "Bob" ) ]
bobAndAlice = Dict.toList aliceAndBob
--> [ ( 0, "Bob" ), ( 1, "Alice" ) ]

Több elemet a filter segítségével távolíthatsz el.

aliceAndBob = Dict.fromList [ ( "Alice", 1 ), ( "Bob", 0 ) ]
bob = Dict.filter (\name count -> name == "Bob") aliceAndBob --> Dict.fromList [ ( "Bob", 0 ) ]

Az elemeket a map segítségével alakíthatod át.

alice = Dict.fromList [ ( "Alice", 0 ) ]
empty = Dict.map (\player count -> count + 1) alice --> Dict.fromList [ ( "Alice", 1 ) ]

A szótárak a merge segítségével összevonhatók / átalakíthatók.

aliceAndBob = Dict.fromList [ ( "Alice", 1 ), ( "Bob", 1 ) ]
bobAndCedd = Dict.fromList [ ( "Bob", 1 ), ( "Cedd", 1 ) ]
firstDictCountsDouble = Dict.merge
        -- when only in aliceAndBob
        (\name count mergedCounts -> Dict.insert name (2 * count) mergedCounts)
        -- when in aliceAndBob and bobAndCedd
        (\name aliceAndBobCount bobAndCeddCount mergedCounts -> Dict.insert name (2 * aliceAndBobCount + bobAndCeddCount) mergedCounts)
        -- when only in bobAndCedd
        (\name count mergedCounts -> Dict.insert name count mergedCounts)
        -- the two dicts to merge
        aliceAndBob
        bobAndCedd
        -- the initial state of the merge
        Dict.empty
--> Dict.fromList [ ( "Alice", 2 ), ( "Bob", 3 ), ( "Cedd", 1 ) ]

Bármely függvény vagy operátor, amely úgy tűnik, hogy módosít egy szótárat (például hozzáad egy elemet), valójában egy új szótárat ad vissza. A teljesítmény általában nem jelent problémát, mert a megvalósítás megakadályozza a felesleges allokációkat/másolatokat.

Elmben általában jobb magasabb szintű absztrakciókat használni, például a Dict.map, Dict.filter és Dict.merge függvényeket, az alacsonyabb szintű absztrakciók, például a Dict.get és Dict.remove helyett, bár ez természetesen a kontextustól függ.

Utasítások

A feladatod, hogy fogj egy játék gólszerzőinek listáját, és számold meg, hány gólt szerzett az egyes játékosok.

A PlayerName a String típusaliasa, amely megkönnyíti a kód olvasását, és megkülönbözteti a String ezen használatát a String más használataitól.

1. A gólszerzők összesítése

Először implementáld az updateGoalCountForPlayer függvényt, amely inicializálja vagy növeli egy játékos gólszámát. Ezután implementáld az aggregateScorers függvényt, amely az updateGoalCountForPlayer használatával megszámolja, hány gólt szerzett az egyes játékosok. Ez a függvény egy List PlayerName értéket kap (a gólt szerző játékosok neveit, amely ismétlődő játékosneveket tartalmazhat), és egy Dict PlayerName Int értéket ad vissza, amely a listában szereplő összes játékost tartalmazza, és azt is, hogy hány gólt szereztek.

aggregateScorers [ "Betty", "Cedd", "Betty" ]
--> Dict.fromList [ ( "Betty", 2 ), ( "Cedd", 1 ) ]

2. A jelentéktelen játékosok eltávolítása

Implementáld a removeInsignificantPlayers függvényt, amely kiszűri azokat a játékosokat, akik kevesebb gólt szereztek, mint a küszöbérték.

removeInsignificantPlayers 2 (Dict.fromList [ ( "Betty", 2 ), ( "Cedd", 1 ) ] )
--> Dict.fromList [ ( "Betty", 2 ) ]

3. A játékos gólszámának nullázása

Implementáld a resetPlayerGoalCount függvényt, amely egy játékos megszerzett góljait nullára állítja.

resetPlayerGoalCount "Cedd" (Dict.fromList [ ( "Betty", 2 ), ( "Cedd", 1 ) ] )
--> Dict.fromList [ ( "Betty", 2 ), ( "Cedd", 0 ) ]

4. Egy játékos gólszámának formázása

Implementáld a formatPlayer függvényt, amely egy játékos gólszámát szövegként formázza. Ha a játékos nem szerepel a szótárban, feltételezd, hogy a gólszáma nulla.

formatPlayer "Betty" (Dict.fromList [ ( "Betty", 2 ), ( "Cedd", 1 ) ] )
--> "Betty: 2"

5. Az összes játékos gólszámának formázása

Implementáld a formatPlayers függvényt, amely az összes játékos gólszámát szövegként formázza. A játékosokat a nevük szerint kell sorba rendezni.

formatPlayers (Dict.fromList [ ( "Betty", 2 ), ( "Cedd", 1 ) ] )
--> "Betty: 2, Cedd: 1"

6. Játékok összevonása

Implementáld a combineGames függvényt, amely megszámolja, hogy az egyes játékosok összesen hány gólt szereztek a két játékban.

combine Games
  (Dict.fromList [ ( "Betty", 2 ), ( "Cedd", 1 ) ] )
  (Dict.fromList [ ( "Betty", 2 ), ( "Mario", 3 ) ] )
--> Dict.fromList [ ( "Betty", 4 ), ( "Cedd", 1 ), ( "Mario", 3 ) ]
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Elm Exercism

Készen állsz elkezdeni a(z) Gólkirályok feladatot?

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