# Bronze/Silver Challenge

Enums seem pretty straightforward, interesting how the recursive typing is implemented. I’m just putting the entire `ShapeDimensions` enum because it covers both challenges:

### Bronze & Silver Challenge:

``````enum ShapeDimensions {
case point
case square(side: Double)
case rectangle(width: Double, height: Double)
case rightTriangle(legA: Double, legB: Double)

func area() -> Double {
switch self {
case .point:
return 0
case let .square(side:side):
return side * side
case let .rectangle(width:w, height:h):
return w * h
case let .rightTriangle(legA:a, legB:b):
return (a * b) / 2
}
}

func perimeter() -> Double {
switch self {
case .point:
return 0
case let .square(side:side):
return 4 * side
case let .rectangle(width:w, height:h):
return 2 * w + 2 * h
case let .rightTriangle(legA:a, legB:b):
return a + b + sqrt(a * a + b * b) // computing the hypotenuse automatically, no need to define in case
}
}
}

var rightTriableShape = ShapeDimenstions.rightTriangle(legA: 1, legB: 1)
``````

I decided to compute the hypotenuse automatically in the perimeter function and not have it specified in the enum type simply because it’s easier and less error-prone. `legA` and `legB` are as follows: I used a slightly different method for the square root:

``````>     >      case let .rightTriangle(width: w, height: h):
>     >                 return (w * w + h * h).squareRoot() + w + h``````

Bronze Challenge:

``````enum ShapeDimensions {
// square's associated value is the length of one side
case square(side: Double)

//rectangle's associated value defines its width and height
case rectangle(width: Double, height: Double)

//point.  A point has no dimensions
case point

func area() -> Double {
switch self {
case .point:
return 0
case let .square(side: side):
return side * side

case let .rectangle(width: w, height: h):
return w * h
}
}
func perimeter() -> Double {
switch self {
case .point:
return 0
case let .square(side: side):
return side * 4
case let .rectangle(width: w, height: h):
return (h * 2) + (w * 2)
}
}
}

var aRect = ShapeDimensions.rectangle(width: 50, height: 40)
print ("My rectangle has a perimeter of \(aRect.perimeter()).")

var aSquare = ShapeDimensions.square(side: 101)
print ("My rectangle has a perimeter of \(aSquare.perimeter()).")``````

Silver challenge code:

``````enum ShapeDimensions {
// square's associated value is the length of one side
case square(side: Double)

//rectangle's associated value defines its width and height
case rectangle(width: Double, height: Double)

//point.  A point has no dimensions
case point

//right triangle
case rightTriangle(base: Double, height: Double)

func area() -> Double {
switch self {
case .point:
return 0
case let .square(side: side):
return side * side
case let .rectangle(width: w, height: h):
return w * h
case let .rightTriangle(base: b, height: h):
return (b*h)/2
}
}
func perimeter() -> Double {
switch self {
case .point:
return 0
case let .square(side: side):
return side * 4
case let .rectangle(width: w, height: h):
return (h * 2) + (w * 2)
case let .rightTriangle(base: b, height: h):
return ((b * b) + (h * h)).squareRoot()
}
}
}

var rTriangle = ShapeDimensions.rightTriangle(base: 20, height: 10)
print("My right triangle has a perimeter of \(rTriangle.perimeter()).")
print("My right triangle has an area of \(rTriangle.area()).")``````

this was my solution to the silver and bronze challenge for any given triangle (not just the right angled)

``````enum ShapeDimentions {
//point has no associated values, it is dimentionless
case point
//square's associated value is the length of one side
case square(side: Double)
//rectangle's associated value defines its width and the height
case rectangle(width: Double, height: Double)
//triangle
case triangle(side1: Double, side2: Double, side3: Double)

func area()->Double {
switch self {
case .point:
return 0
case let .square(side: side):
return side * side
case let .rectangle(width: w, height: h):
return w * h
case let .triangle(side1: a, side2: b, side3: c):
let p = self.perimeter() / 2
return sqrt(p * (p - a) * (p - b) * (p - c))
}
}

func perimeter()-> Double {
switch self {
case .point:
return 0
case let .square(side: side):
return 4 * side
case let .rectangle(width: w, height: h):
return 2 * (w + h)
case let .triangle(side1: s1, side2: s2, side3: s3):
return s1 + s2 + s3
}
}
}

var squareShape = ShapeDimentions.square(side: 10.0)
var rectShape = ShapeDimentions.rectangle(width: 5.0, height: 10.0)
var pointShape = ShapeDimentions.point
var triangleShape = ShapeDimentions.triangle(side1: 3, side2: 5, side3: 4)
``````

My answer is still so strange… .
import Cocoa

enum ShapeDimensions{

//正方形的关联值是边长

case square(side: Double)

//长方形的关联值是宽和高

case rectangle(width:Double,height:Double)

//三角形的关联值是底 高 除以2

case triangle(button:Double,height:Double,count:Double);

func area()-> Double{

switch self {

case let .square(side:side):

return side * side;

case let .rectangle(width: w,height: h):

return w * h;

case let .triangle(button: b,height: h, count: c):

return b * h / c

}

}

}

var ShapeSquare = ShapeDimensions.square(side: 10.0);

var ShapeRectangle = ShapeDimensions.rectangle(width: 10.0, height: 5.0);

var ShapeTriangle = ShapeDimensions.triangle(button: 10, height: 5, count: 2)

var count=ShapeSquare.area() + ShapeRectangle.area() + ShapeTriangle.area();

print(count);