Консолидация этого кода J - PullRequest
0 голосов
/ 17 октября 2011

Я изучаю J и начинаю с чего-то простого; добавив кратные 3 и 5 ниже 100. Я получил это с этим кодом:

(+/((((i.100)|~ 3) = 0) # (i.100)),((((i.100)|~ 5) = 0) # (i.100)))-(((i.100|~15)=0) # (i.100))

но похоже, что должен быть более простой способ. Есть ли способ сделать этот код чище? Спасибо.

1 Ответ

1 голос
/ 17 октября 2011

Обратите внимание, что ваш текущий код выдает ошибку длины, но я предложил изменить ваш вопрос, чтобы он работал. Сейчас я также включу рабочий код ниже.

(+/((((i.100)|~ 3) = 0) # (i.100)),((((i.100)|~ 5) = 0) # (i.100))) - (+/(((i.100)|~15)=0) # (i.100))

Тот же алгоритм можно написать более просто (в любом случае меньше скобок), просто изменив порядок операций (J оценивает «предложения» справа налево).

   (+/ ((0 = 3|i.100) # i.100) , ((0 = 5|i.100) # i.100)) - +/(0 = 15|i.100)#i.100
2318

Вместо того, чтобы вычитать сумму, кратную 15, из первоначальной суммы, чтобы избежать двойного счетного числа, кратного как 3, так и 5, вы можете использовать ~. (Nub), чтобы удалить любые дубликаты из вашего списка, кратного 3 и кратно 5, прежде чем их суммировать.

   +/ ~. ((0 = 3|i.100) # i.100) , (0 = 5|i.100) # i.100
2318

Более подробный подход Jish к этой проблеме см. В ответе на этот вопрос о переполнении стека .

...