轨道
/
Elm
Elm
/
练习
/
蒂斯伯里寻宝
蒂斯伯里寻宝

蒂斯伯里寻宝

学习练习

简介

元组

Elm 中的元组可以容纳两个或三个值,每个值都可以是任意类型。 在 Elm 中,元组主要用于简单的临时类型。 因此,元组最多只能容纳 3 个值;为了进一步鼓励这种做法,只有容纳 2 个值的元组才配有便捷函数。 对于更复杂的数据,最好改用记录。

type alias IntStringTuple = (Int, String)

aTuple : IntStringTuple
aTuple = (123, "elements can be of differing types")

anotherTuple : (String, String)
anotherTuple = Tuple.pair "this time it's" "two strings"
    --> ("this time it's", "two strings")

Tuple.first aTuple
    --> 123

Tuple.second aTuple
    --> "elements can be of differing types"

元组可以通过元组模式匹配在绑定中_解构_。 解构可以在 let 表达式、函数声明和 case 语句中进行。

repeatString : (Int, String) -> Bool
repeatString aTuple =
let
    (aNumber, aString) = aTuple
in
    String.repeat aNumber aString

repeatStringAgain : (Int, String) -> Bool
repeatStringAgain (aNumber, aString) = String.repeat aNumber aString

has123 : (Int, String, Bool) -> Bool
has123 aTuple =
    case aTuple of
        (123, _, _) ->
            True
        (_, "123", _) ->
            True
        (_, _, True) ->
            True
        _ ->
            False

说明

Aazra 和 Rui 正在设计一个以海盗为主题的寻宝游戏。一份是带有地图位置的宝藏清单,另一份是带有地图位置的地点名称清单。

宝藏 位置
Amethyst Octopus (1, F)
Angry Monkey Figurine (5, B)
Antique Glass Fishnet Float (3, D)
Brass Spyglass (4, B)
Carved Wooden Elephant (8, C)
Crystal Crab (6, A)
Glass Starfish (6, D)
Model Ship in Large Bottle (8, A)
Pirate Flag (7, F)
Robot Parrot (1, C)
Scrimshaw Whale's Tooth (1, F)
Silver Seahorse (4, E)
Vintage Pirate Hat (7, E)
地点名称 位置 象限
Seaside Cottages (C, 1) Blue
Aqua Lagoon (Island of Mystery) (F, 1) Yellow
Deserted Docks (A, 2) Blue
Spiky Rocks (D, 3) Yellow
Abandoned Lighthouse (B, 4) Blue
Hidden Spring (Island of Mystery) (E, 4) Yellow
Stormy Breakwater (B, 5) Purple
Old Schooner (A, 6) Purple
Tangled Seaweed Patch (D, 6) Orange
Quiet Inlet (Island of Mystery) (E, 7) Orange
Windswept Hilltop (Island of Mystery) (F, 7) Orange
Harbor Managers Office (A, 8) Purple
Foggy Seacave (C, 8) Purple

玩家会在地图上四处移动,沿途收集宝藏。 宝藏位置和地点位置采用了不同的格式,以此增加额外的挑战。 此外还有一些特殊地点,在那里某些宝藏可以换成另一些宝藏,给游戏增添额外的转折。 你的任务是编写函数,帮助他们完成这个游戏。

1. 转换位置

实现 placeLocationToTreasureLocation 函数,它接收一个地点位置(例如 ('C', 1)),并把它转换成宝藏位置(例如 (1, 'C'))。

placeLocationToTreasureLocation ('C', 1)
--> (1,'C')

2. 比较宝藏位置和地点位置

实现 treasureLocationMatchesPlaceLocation 函数,它接收一个 PlaceLocation(例如 ('C', 1)),如果它与某个 TreasureLocation(例如 (1, 'C'))匹配就返回 true。

treasureLocationMatchesPlaceLocation ('C', 1) (1, 'C')
--> true

treasureLocationMatchesPlaceLocation ('C', 1) (2, 'C')
--> false

3. 统计宝藏位置

实现 countPlaceTreasures 函数,它接收一个地点(例如 ("Aqua Lagoon (Island of Mystery)", ('F', 1)))和宝藏清单,并返回在那里能找到的宝藏数量。

place = ("Aqua Lagoon (Island of Mystery)", ('F', 1))

countPlaceTreasures place treasures =
--> 2

4. 特殊地点

实现 specialCaseSwapPossible 函数,它接收一个宝藏(例如 ("Amethyst Octopus", (1, 'F')))和一个地点(例如 ("Seaside Cottages ", ('C', 1))),并在以下组合中返回 true:

  • 在 Abandoned Lighthouse,Brass Spyglass 可以换成任何其他宝藏
  • 在 Stormy Breakwater,Amethyst Octopus 可以换成 Crystal Crab 或 Glass Starfish
  • 在 Harbor Managers Office,Vintage Pirate Hat 可以换成 Model Ship in Large Bottle 或 Antique Glass Fishnet Float

试着把这个函数写成一个带有临时元组的 case 语句,而不是使用 if 语句(这是 Elm 中常见的惯用法)。

通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Elm Exercism

准备好开始 蒂斯伯里寻宝 了吗?

注册 Exercism,借助 28 个概念110 个练习 和真人导师指导,学习并掌握 Elm,全部免费。