1

私は現在、JavaScript よりも「表現力豊か」な CoffeeScript を学習しています。そのため、以下のコードを最適化する方法を知りたいと考えています。

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 ネストを最適化する方法を探していますが、他のヒントもいただければ幸いです。

前もって感謝します。

編集:
私は愚かで、数学がどのように機能するかを忘れていました。ゼータに感謝します。また、さらなる最適化のためにエピデミアンに感謝します。

4

2 に答える 2

0

ループを次のように短くすることもできます (ただし、実行することもできますnextday = 60;-):

for x in [1..9001] when x % 60 is 0
  nextDay = x
  break
于 2013-04-13T17:14:28.197 に答える
0

これらの最適化は、CoffeeScript とはほとんど関係ありません。

まず、ネストされたs は、次のようifにチェーンされた s に変換できます。and

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 で割り切れるかどうかを尋ねることは、それらの 3 つの数の最小公倍数である 60 で割り切れるかどうかを尋ねることと同じです。したがって、ループは次のようになります。

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

ただし、そのループは常に同じことを行います: nextDay60 に割り当てます。したがって、単一の割り当てに最適化できます。

nextDay = 60

5、4、および 3 の除数が一定ではなく、アルゴリズムで異なる除数を使用できる場合は、これらの数値の最小公倍数に設定nextDayできます

次に、(totalDays -= 7 while totalDays > 7)ループは配列を作成して、その最後の要素のみを使用します。ロジックはモジュロ演算子に置き換えることができます:

totalDays = lastDay + nextDay - 1
weekday = weekdays[totalDays % 7]
于 2013-04-09T18:55:16.670 に答える