2013-04-09 5 views
1

Я в настоящее время обучение CoffeeScript, так как это более «выразительный», чем 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}" 

I «В основном ищут способ оптимизации гнезда, но любые другие советы также будут оценены.

Заранее спасибо.

EDIT:
я был глуп и забыл, как математика работа, спасибо Zeta. Кроме того, благодаря эпидемии для дальнейшей оптимизации.

+0

Это похоже на работу для HTTP : //codereview.stackexchange.com, так как ваш скрипт уже работает. Кроме того, поскольку все ваши номера относительно простые (3, 4, 5), вы можете просто взять продукт и решить свою проблему одним выражением вместо использования цикла. – Zeta

+0

Вы думаете, что можете показать мне пример этого? – VegBerg

+2

'следующийDay = 3 * 4 * 5'. 60 - это первое число, которое делится на три, четыре и пять. Это не свойство CoffeeScript, это простая математика;). – Zeta

ответ

0

Эти оптимизаций имеют очень мало общего с CoffeeScript:

Во-первых, вложенные 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 

Но спрашивать, если число «х» делится на 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] 
0

Вы можете сократить цикл до (несмотря на то, что вы могли бы сделать nextday = 60 ;-):

for x in [1..9001] when x % 60 is 0 
    nextDay = x 
    break 
Смежные вопросы