轨道
/
C#
C#
/
练习
/
太空圈地
太空圈地

太空圈地

学习练习

简介

结构体

C# 的struct和class关系密切。它们有状态和行为。它们有接收实参的构造函数,实例可以被赋值、进行相等性测试,也可以存储在集合中。

enum Unit
{
    Kg,
    Lb
}
struct Weight
{
    private double count;
    private Unit unit;

    public Weight(double count, Unit unit)
    {
        this.count = count;
        this.unit = unit;
    }

    public override string ToString()
    {
        return count.ToString() + unit.ToString();
    }
}

new Weight(77.5, Unit.Kg).ToString();
// => "77.6Kg"

说明

伊萨克斯小行星勘探公司(Isaacs Asteroid Exploration Co.)的权属部门委托你改进他们土地认领系统的性能。

每当一颗新的小行星可以开采时,投机者们就会被邀请前来认领一块土地。小行星上的土地被划分为四边形地块。投机者通过指定地块的尺寸来认领土地。

你的目标是开发一个高性能系统,来处理过去曾导致网站崩溃的抢地潮。

度量单位是 100 米,但在这些任务中可以忽略。

1. 定义 Plot

完成 Plot 结构体的实现,它由 4 个坐标结构体组成(在构造函数中传入)。

2. 投机者可以指定一个由尺寸确定的地块来认领土地

实现ClaimsHandler.StakeClaim()方法,以允许注册一次认领。

实现ClaimsHandler.IsClaimStaked()方法,以判断某个地块是否已被认领。

var ch = new ClaimsHandler();
ch.StakeClaim(new Plot(new Coord(1,1), new Coord(2,1), new Coord(1,2), new Coord(2,2)));
ch.IsClaimStaked(new Plot(new Coord(1,1), new Coord(2,1), new Coord(1,2), new Coord(2,2)));
// => true

3. 检查当前认领是否与上一次相同

实现ClaimsHandler.IsLastClaim()方法,将当前认领与上一次认领进行比较。

var ch = new ClaimsHandler();
ch.StakeClaim(new Plot(new Coord(1,1), new Coord(2,1), new Coord(1,2), new Coord(2,2)));
ch.IsLastClaim(new Plot(new Coord(1,1), new Coord(2,1), new Coord(1,2), new Coord(2,2)));
// => true

4. 出于研究目的,找出已认领的地块中边长最长的那一个

实现ClaimsHandler.GetClaimWithLongestSide()方法,检查所有已注册的认领,并返回边长最长的地块。地块中的坐标数据保证构成一个连续的矩形形状。

var ch = new ClaimsHandler();
ch.StakeClaim(new Plot(new Coord(1,1), new Coord(2,1), new Coord(1,2), new Coord(2,2)));
ch.StakeClaim(new Plot(new Coord(10,1), new Coord(20,1), new Coord(10,2), new Coord(20,2)));
ch.GetClaimWithLongestSide();
// => new Plot(new Coord(1,1), new Coord(20,1), new Coord(1,2), new Coord(2,2))
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
C# Exercism

准备好开始 太空圈地 了吗?

注册 Exercism,借助 62 个概念178 个练习 和真人导师指导,学习并掌握 C#,全部免费。