Programming/iOS

swift] fp - fizz buzz 리펙토링

고양이의시간 2020. 3. 3. 18:27

FizzBuzz 프로그램?

1 ~ 100 까지의 숫자를 출력하되, 3으로 나누어 떨어진다면 fizz, 5로 나누어 떨어진다면 buzz,

3과 5 둘 다 나누어 떨어지면 fizzbuzz를 출력하는 프로그램.

 

리펙토링 전 

var i = 1
while i <= 100 {
    if i % 3 == 0 && i % 5 == 0 {
        print("fizzbuzz")
    }
    else if i % 3 == 0 {
        print("fizz")
    }
    else if i % 5 == 0 {
        print("buzz")
    }
    else {
        print(i)
    }

    i += 1
}

 

리펙토링1

func fizz(_ i : Int) -> String{
    if(i % 3 == 0){
        return "fizz"
    }
    return ""
}

func buzz(_ i : Int) -> String{
    if(i % 5 == 0){
        return "buzz"
    }
    return ""
}

func fizzbuzz(_ i: Int) -> String {
	let result = fizz(i) + buzz(i)
    return result.isEmpty ? "\(i)" : result
}

func loop(min: Int, max: Int, do f: (Int)-> Void) {
    var i = min
    while i <= max {
        f(i)
        i+=1
    }
}

loop(min: 0, max: 100) { print(fizzbuzz($0)) }

 

리펙토링2

let fizz = { i in i % 3 == 0 ? "fizz" : "" }
let buzz = { i in i % 5 == 0 ? "buzz" : "" }
let fizzbuzz: (Int) -> String = { i in { a,b in b.isEmpty ? a: b }("\(i)", fizz(i) + buzz(i)) }

func loop(min: Int, max: Int, do f: (Int)-> Void) {
    // min ~ max 까지 배열형태로 만듬
    Array(min...max).forEach(f)
}

loop(min: 0, max: 100) { print(fizzbuzz($0)) }