将我的代码转换为更好的Swift,就像FizzBu​​zz响应的答案一样

时间:2016-03-06 02:12:11

标签: swift swift2

昨晚我正在网上搜索一些编程,我注意到有一个有趣的测试,雇主有时会用它来测试程序员,看看他们是否真的可以将代码应用于现实世界的问题。它被称为FizzBu​​zz测试,它的工作原理如下。

  

“编写一个打印数字1到100的程序。但是,对于倍数   3,打印“Fizz”而不是数字和5的倍数,打印   “巴斯”。对于三次和五次打印的倍数的数字   “FizzBu​​zz”。“

现在,我坐下来很快就想出了这段代码,我把它放在了viewDidLoad方法中:

for i in 1...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)
            }
        }

而且,尽管这符合要求,但我觉得使用它作为我的解决方案非常不满意(对我来说这似乎太简单和基本)。

我最近读过Matt Neuburg的书“iOS 9编程基础与Swift”(这本书让我大开眼界,在很多层面上睁开眼睛)。我试图尽可能地使用Swift-y(传递函数等)而着迷。然后,我发现了一种清醒而令人沮丧的认识,我真的不知道如何改进这段代码。

因此,我转向Swift社区,希望您能够更好地了解FiizBuzz测试问题的 最复杂的Swift 答案。< / p>

我正在拼命尝试改进我的Swift编程,并希望了解一种更好的Swift-y编程方法。

2 个答案:

答案 0 :(得分:7)

在Dan的link评论中,我提出了:

for i in 1...100 {
  switch (i%3, i%5) {
  case (0,0): print("FizzBuzz")
  case (0,_): print("Fizz")
  case (_,0): print("Buzz")
  default: print(i)
  }
}
  

1
  2
  费兹
  4
  巴兹
  费兹
  7
  8
  费兹
  巴兹
  11个
  费兹
  13个
  14个
  FizzBu​​zz
  ...

答案 1 :(得分:0)

在操场上试试这个。这是一种功能性方法的尝试。效率不高。

let range = (1...100)
let fizz  = range.map{ ($0 % 3 == 0) ? "Fizz" : "" }
let buzz  = range.map{ ($0 % 5 == 0) ? "Buzz" : "" }
zip(range, zip(fizz, buzz))
  .map {
    let fb = $1.0 + $1.1
    print(fb.isEmpty ? $0 : fb)
  }

enter image description here