Skip to content

Instantly share code, notes, and snippets.

@brennanMKE
Last active March 9, 2025 03:44
Show Gist options
  • Save brennanMKE/87a28c0d484bac8e713473eba3bde849 to your computer and use it in GitHub Desktop.
Save brennanMKE/87a28c0d484bac8e713473eba3bde849 to your computer and use it in GitHub Desktop.
FizzBuzz with Swift

FizzBuzz with Swift

Given an integer n, return a string array answer (1-indexed) where:

  • answer[i] == "FizzBuzz" if i is divisible by 3 and 5.
  • answer[i] == "Fizz" if i is divisible by 3.
  • answer[i] == "Buzz" if i is divisible by 5.
  • answer[i] == i (as a string) if none of the above conditions are true.

Input: n = 15

Output: ["1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz", "11", "Fizz", "13", "14", "FizzBuzz"]

import Foundation
let fizzValue = "Fizz"
let buzzValue = "Buzz"
let fizzBuzzValue = "FizzBuzz"
let emptyValue = ""
enum FizzBuzz: String {
case fizz = "Fizz"
case buzz = "Buzz"
case empty = ""
var isEmpty: Bool {
self == .empty
}
}
enum Solution1 {
static func fizzBuzz(_ n: Int) -> [String] {
guard n > 0 else {
return []
}
return (1...n).map { i in
let fizz = i.isMultiple(of: 3) ? 1 : 0
let buzz = i.isMultiple(of: 5) ? 1 : 0
return fizz == 0 && buzz == 0 ? "\(i)" :
fizz == 1 && buzz == 1 ? fizzBuzzValue :
fizz == 1 ? fizzValue :
buzz == 1 ? buzzValue : ""
}
}
}
enum Solution2 {
static func fizzBuzz(_ n: Int) -> [String] {
guard n > 0 else {
return []
}
return (1...n).map { i in
let fizz = i.isMultiple(of: 3) ? fizzValue : emptyValue
let buzz = i.isMultiple(of: 5) ? buzzValue : emptyValue
return fizz.isEmpty && buzz.isEmpty ? "\(i)" : fizz + buzz
}
}
}
enum Solution3 {
static func fizzBuzz(_ n: Int) -> [String] {
guard n > 0 else {
return []
}
return (1...n).map { i in
let fizz: FizzBuzz = i.isMultiple(of: 3) ? .fizz : .empty
let buzz: FizzBuzz = i.isMultiple(of: 5) ? .buzz : .empty
return fizz == .empty && buzz == .empty ? "\(i)" : fizz.rawValue + buzz.rawValue
}
}
}
enum Solution4 {
static func fizzBuzz(_ n: Int) -> [String] {
guard n > 0 else {
return []
}
return (1...n).map { i in
let fizz: FizzBuzz = i.isMultiple(of: 3) ? .fizz : .empty
let buzz: FizzBuzz = i.isMultiple(of: 5) ? .buzz : .empty
return fizz.isEmpty && buzz.isEmpty ? "\(i)" : fizz.rawValue + buzz.rawValue
}
}
}
enum Solution5 {
static func fizzBuzz(_ n: Int) -> [String] {
guard n > 0 else {
return []
}
return (1...n).lazy.map { i in
let fizz: FizzBuzz = i.isMultiple(of: 3) ? .fizz : .empty
let buzz: FizzBuzz = i.isMultiple(of: 5) ? .buzz : .empty
return fizz.isEmpty && buzz.isEmpty ? "\(i)" : fizz.rawValue + buzz.rawValue
}
}
}
import Testing
@testable import FizzBuzz
struct FizzBuzzTests {
let iterations = 100_000
let expected = ["1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz", "11", "Fizz", "13", "14", "FizzBuzz"]
@Test func testSolution1() async throws {
measure(iterations: iterations) {
let output = Solution1.fizzBuzz(15)
#expect(output == expected)
}
}
@Test func testSolution2() async throws {
measure(iterations: iterations) {
let output = Solution2.fizzBuzz(15)
#expect(output == expected)
}
}
@Test func testSolution3() async throws {
measure(iterations: iterations) {
let output = Solution3.fizzBuzz(15)
#expect(output == expected)
}
}
@Test func testSolution4() async throws {
measure(iterations: iterations) {
let output = Solution3.fizzBuzz(15)
#expect(output == expected)
}
}
@Test func testSolution5() async throws {
measure(iterations: iterations) {
let output = Solution3.fizzBuzz(15)
#expect(output == expected)
}
}
private func measure(caller: String = #function, iterations: Int = 100, block: @Sendable () -> Void) {
let start = Date()
for _ in 0..<iterations {
block()
}
let duration = Date().timeIntervalSince(start)
let ms = String(format: "Duration: %.6f ms", duration)
print("\(caller): Duration: \(ms) ms")
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment