// Exponentiation operator. (2.00)
import Foundation
precedencegroup ExponentiationPrecedence {
associativity: right
higherThan: MultiplicationPrecedence
}
infix operator ** : ExponentiationPrecedence
func ** <T: BinaryFloatingPoint>(_ x: T, _ y: T) -> Double {
return pow(Double
(x
), Double
(y
)) }
func ** <T: BinaryInteger>(_ x: T, _ y: T) -> Int {
let base = Int(x)
let expt = Int(y)
if base == 0 || base == 1 {
return base
}
if base == -1 {
return expt % 2 == 0 ? 1 : -1
}
if expt < 0 {
return 0
}
func detail(_ base: Int, _ expt: Int) -> Int {
switch expt {
case 0:
return 1
case 1:
return base
case _ where expt % 2 == 0:
return detail(base * base, expt / 2)
default:
return base * detail(base, expt - 1)
}
}
return detail(base, expt)
}
// Test.
func check<T: Equatable>(_ f: () -> Any, expect: T) {
let result = f()
print(result, terminator: "\t")
if let x = result as? T {
print(x == expect ? "Pass." : "Fail: \(expect)")
} else {
print("Fail: \(type(of: result)) not \(T.self)")
}
}
#if DEBUG
check({2 ** 0}, expect: 2)
check({2 ** Int8(1)}, expect: 2.0)
check({2.0 ** 2}, expect: 4)
#endif
check({0 ** 0}, expect: 0)
check({0 ** 1}, expect: 0)
check({1 ** 0}, expect: 1)
check({1 ** 1}, expect: 1)
check({1 ** -1}, expect: 1)
check({1 ** -2}, expect: 1)
check({-1 ** 0}, expect: 1)
check({-1 ** 1}, expect: -1)
check({-1 ** 2}, expect: 1)
check({-1 ** -1}, expect: -1)
check({-1 ** -2}, expect: 1)
check({-2 ** 0}, expect: 1)
check({-2 ** 1}, expect: -2)
check({-2 ** 2}, expect: 4)
check({-2 ** -1}, expect: 0)
check({-2 ** -2}, expect: 0)
check({2 ** 0}, expect: 1)
check({2 ** Int8(1)}, expect: 2)
check({2.0 ** 2}, expect: 4.0)
check({2.0 ** Float(3)}, expect: 8.0)
check({2 ** 4.0}, expect: 16.0)
check({2.0 ** 5.0}, expect: 32.0)
check({2 * 2 ** 4 * 2}, expect: 64)
Ly8gRXhwb25lbnRpYXRpb24gb3BlcmF0b3IuICgyLjAwKQoKaW1wb3J0IEZvdW5kYXRpb24KCnByZWNlZGVuY2Vncm91cCBFeHBvbmVudGlhdGlvblByZWNlZGVuY2UgewogICAgYXNzb2NpYXRpdml0eTogcmlnaHQKICAgIGhpZ2hlclRoYW46IE11bHRpcGxpY2F0aW9uUHJlY2VkZW5jZQp9CgppbmZpeCBvcGVyYXRvciAqKiA6IEV4cG9uZW50aWF0aW9uUHJlY2VkZW5jZQoKZnVuYyAqKiA8VDogQmluYXJ5RmxvYXRpbmdQb2ludD4oXyB4OiBULCBfIHk6IFQpIC0+IERvdWJsZSB7CiAgICByZXR1cm4gcG93KERvdWJsZSh4KSwgRG91YmxlKHkpKQp9CgpmdW5jICoqIDxUOiBCaW5hcnlJbnRlZ2VyPihfIHg6IFQsIF8geTogVCkgLT4gSW50IHsKICAgIGxldCBiYXNlID0gSW50KHgpCiAgICBsZXQgZXhwdCA9IEludCh5KQoKICAgIGlmIGJhc2UgPT0gMCB8fCBiYXNlID09IDEgewogICAgICAgIHJldHVybiBiYXNlCiAgICB9CiAgICBpZiBiYXNlID09IC0xIHsKICAgICAgICByZXR1cm4gZXhwdCAlIDIgPT0gMCA/IDEgOiAtMQogICAgfQogICAgaWYgZXhwdCA8IDAgewogICAgICAgIHJldHVybiAwCiAgICB9CgogICAgZnVuYyBkZXRhaWwoXyBiYXNlOiBJbnQsIF8gZXhwdDogSW50KSAtPiBJbnQgewogICAgICAgIHN3aXRjaCBleHB0IHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgY2FzZSAxOgogICAgICAgICAgICByZXR1cm4gYmFzZQogICAgICAgIGNhc2UgXyB3aGVyZSBleHB0ICUgMiA9PSAwOgogICAgICAgICAgICByZXR1cm4gZGV0YWlsKGJhc2UgKiBiYXNlLCBleHB0IC8gMikKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gYmFzZSAqIGRldGFpbChiYXNlLCBleHB0IC0gMSkKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGRldGFpbChiYXNlLCBleHB0KQp9CgovLyBUZXN0LgoKZnVuYyBjaGVjazxUOiBFcXVhdGFibGU+KF8gZjogKCkgLT4gQW55LCBleHBlY3Q6IFQpIHsKICAgIGxldCByZXN1bHQgPSBmKCkKICAgIHByaW50KHJlc3VsdCwgdGVybWluYXRvcjogIlx0IikKICAgIGlmIGxldCB4ID0gcmVzdWx0IGFzPyBUIHsKICAgICAgICBwcmludCh4ID09IGV4cGVjdCA/ICJQYXNzLiIgOiAiRmFpbDogXChleHBlY3QpIikKICAgIH0gZWxzZSB7CiAgICAgICAgcHJpbnQoIkZhaWw6IFwodHlwZShvZjogcmVzdWx0KSkgbm90IFwoVC5zZWxmKSIpCiAgICB9Cn0KCiNpZiBERUJVRwpjaGVjayh7MiAqKiAwfSwgICAgICAgICAgZXhwZWN0OiAyKQpjaGVjayh7MiAqKiBJbnQ4KDEpfSwgICAgZXhwZWN0OiAyLjApCmNoZWNrKHsyLjAgKiogMn0sICAgICAgICBleHBlY3Q6IDQpCiNlbmRpZgoKY2hlY2soezAgKiogMH0sICAgICAgICAgIGV4cGVjdDogMCkKY2hlY2soezAgKiogMX0sICAgICAgICAgIGV4cGVjdDogMCkKY2hlY2soezEgKiogMH0sICAgICAgICAgIGV4cGVjdDogMSkKY2hlY2soezEgKiogMX0sICAgICAgICAgIGV4cGVjdDogMSkKY2hlY2soezEgKiogLTF9LCAgICAgICAgIGV4cGVjdDogMSkKY2hlY2soezEgKiogLTJ9LCAgICAgICAgIGV4cGVjdDogMSkKCmNoZWNrKHstMSAqKiAwfSwgICAgICAgICBleHBlY3Q6IDEpCmNoZWNrKHstMSAqKiAxfSwgICAgICAgICBleHBlY3Q6IC0xKQpjaGVjayh7LTEgKiogMn0sICAgICAgICAgZXhwZWN0OiAxKQpjaGVjayh7LTEgKiogLTF9LCAgICAgICAgZXhwZWN0OiAtMSkKY2hlY2soey0xICoqIC0yfSwgICAgICAgIGV4cGVjdDogMSkKCmNoZWNrKHstMiAqKiAwfSwgICAgICAgICBleHBlY3Q6IDEpCmNoZWNrKHstMiAqKiAxfSwgICAgICAgICBleHBlY3Q6IC0yKQpjaGVjayh7LTIgKiogMn0sICAgICAgICAgZXhwZWN0OiA0KQpjaGVjayh7LTIgKiogLTF9LCAgICAgICAgZXhwZWN0OiAwKQpjaGVjayh7LTIgKiogLTJ9LCAgICAgICAgZXhwZWN0OiAwKQoKY2hlY2soezIgKiogMH0sICAgICAgICAgIGV4cGVjdDogMSkKY2hlY2soezIgKiogSW50OCgxKX0sICAgIGV4cGVjdDogMikKY2hlY2soezIuMCAqKiAyfSwgICAgICAgIGV4cGVjdDogNC4wKQpjaGVjayh7Mi4wICoqIEZsb2F0KDMpfSwgZXhwZWN0OiA4LjApCmNoZWNrKHsyICoqIDQuMH0sICAgICAgICBleHBlY3Q6IDE2LjApCmNoZWNrKHsyLjAgKiogNS4wfSwgICAgICBleHBlY3Q6IDMyLjApCmNoZWNrKHsyICogMiAqKiA0ICogMn0sICBleHBlY3Q6IDY0KQ==