【问题标题】:Optimizing my CoffeeScript code优化我的 CoffeeScript 代码
【发布时间】:2023-03-21 06:34:01
【问题描述】:

我目前正在学习 CoffeeScript,因为它比 JavaScript 更具“表现力”,因此,我想知道如何优化下面的代码

lastDay = 6
weekdays = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
weeksToDivide = 0

for x in [1..9001] 
    if x % 5 == 0
        if x % 4 == 0
            if x % 3 == 0
                nextDay = x
                break               

totalDays = lastDay + nextDay
day = (totalDays -= 7 while totalDays > 7)
weekday = weekdays[day[day.length - 1] - 1]

alert "Days until next meeting: #{nextDay}"
alert "That day is on a #{weekday}"

我主要是在寻找一种优化 if 嵌套的方法,但任何其他提示也将不胜感激。

提前致谢。

编辑:
我很愚蠢,忘记了数学是如何工作的,谢谢 Zeta。 另外,感谢 Epidemia 的进一步优化。

【问题讨论】:

  • 这似乎是codereview.stackexchange.com 的工作,因为您的脚本已经在运行。此外,由于您所有的数字都是相对质数(3、4、5),您可以简单地取乘积并用一个表达式解决您的问题,而不是使用循环。
  • 呃,你觉得你能给我举个例子吗?
  • nextDay = 3 * 4 * 5。 60是第一个能被三、四和五整除的数字。这不是 CoffeeScript 的属性,那是简单的数学;)。
  • 哦,我现在觉得自己很蠢:/

标签: optimization coffeescript


【解决方案1】:

这些优化与 CoffeeScript 关系不大:

首先,嵌套的ifs 可以转换为链接的ands,例如:

for x in [1..9001] 
  if x % 5 is 0 and x % 4 is 0 and x % 3 is 0 
    nextDay = x
    break

但是询问一个数字“x”是否可以被 5 整除 并且 可以被 4 整除 并且 可以被 3 整除与询问它是否可以被最不常见的数字整除是一样的这三个数字的倍数,即 60。所以循环相当于:

for x in [1..9001] 
  if x % 60 is 0 
    nextDay = x
    break

但是,这个循环总是会做同样的事情:将nextDay 分配给 60。所以它可以优化为单个分​​配:

nextDay = 60

如果 5、4 和 3 的除数不是恒定的,并且您的算法应该能够有不同的除数,您可以将它们设置为 nextDay 为这些数字的 least common multiple

然后,(totalDays -= 7 while totalDays > 7) 循环创建一个数组,然后只使用其最后一个元素。逻辑可以用模运算符代替:

totalDays = lastDay + nextDay - 1
weekday = weekdays[totalDays % 7]

【讨论】:

    【解决方案2】:

    您可以将循环缩短为(尽管您也可以这样做 nextday = 60 ;-):

    for x in [1..9001] when x % 60 is 0
      nextDay = x
      break
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-31
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      相关资源
      最近更新 更多