Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- fileprivate func gcd(_ a: Int, _ b: Int) -> Int {
- return b == 0 ? a : gcd(b, a % b)
- }
- fileprivate func abs(_ n: Int) -> Int {
- return n > 0 ? n : -n
- }
- struct Ratio {
- let numerator: Int
- let denominator: Int
- init(_ numerator: Int, _ denominator: Int = 1) {
- var (numerator, denominator) = (numerator, denominator)
- let divisor = gcd(numerator, denominator)
- numerator /= divisor
- denominator /= divisor
- if denominator < 0 {
- (numerator, denominator) = (-numerator, -denominator)
- }
- self.numerator = numerator
- self.denominator = denominator
- }
- var asDouble: Double { return Double(numerator) / Double(denominator) }
- var asFloat: Float { return Float(numerator) / Float(denominator) }
- var abs: Ratio { return self.numerator < 0 ? -self : self }
- }
- extension Ratio: CustomDebugStringConvertible {
- var debugDescription: String {
- let denom = denominator == 1 ? "" : "/\(String(describing: denominator))"
- return "\(numerator)\(denom)"
- }
- }
- extension Ratio: ExpressibleByIntegerLiteral {
- init(integerLiteral value: IntegerLiteralType) {
- self.init(value)
- }
- }
- extension Ratio: Equatable {}
- func ==(lhs: Ratio, rhs: Ratio) -> Bool {
- return lhs.numerator == rhs.numerator && lhs.denominator == rhs.denominator
- }
- extension Ratio: Comparable {}
- func <(lhs: Ratio, rhs: Ratio) -> Bool {
- return (rhs.abs - lhs.abs).numerator > 0
- }
- func +(lhs: Ratio, rhs: Ratio) -> Ratio {
- return Ratio(
- lhs.numerator * rhs.denominator + rhs.numerator * lhs.denominator,
- lhs.denominator * rhs.denominator
- )
- }
- func +=(lhs: inout Ratio, rhs: Ratio) {
- lhs = lhs + rhs
- }
- prefix func -(r: Ratio) -> Ratio {
- return Ratio(-r.numerator, r.denominator)
- }
- func -(lhs: Ratio, rhs: Ratio) -> Ratio {
- return lhs + (-rhs)
- }
- func -=(lhs: inout Ratio, rhs: Ratio) {
- lhs = lhs - rhs
- }
- func *(lhs: Ratio, rhs: Ratio) -> Ratio {
- return Ratio(lhs.numerator * rhs.numerator,lhs.denominator * rhs.denominator)
- }
- func *=(lhs: inout Ratio, rhs: Ratio) {
- lhs = lhs * rhs
- }
- func /(lhs: Ratio, rhs: Ratio) -> Ratio {
- return lhs * Ratio(rhs.denominator, rhs.numerator)
- }
- func /=(lhs: inout Ratio, rhs: Ratio) {
- lhs = lhs / rhs
- }
Add Comment
Please, Sign In to add comment