Как рефакторинг это в J? - PullRequest
       22

Как рефакторинг это в J?

2 голосов
/ 12 октября 2009

Мое решение для новичка в Project Euler # 1

+/((0=3|1+i.1000-1) +. (0=5|1+i.1000-1)) * (1+i.1000-1)

Я знаю, что это можно реорганизовать и преобразовать в функцию, я не знаю, как это сделать, и мне пришлось бы прочитать все лаборатории, чтобы изучить это.

Ответы [ 2 ]

7 голосов
/ 01 октября 2011

Нет необходимости «обрабатывать ноль», потому что добавление нуля не изменит ответ, поэтому вы можете просто использовать i., чтобы сгенерировать список чисел ниже 1000, например:

   i. 10
0 1 2 3 4 5 6 7 8 9

J лучше всего работает с массивами, поэтому вы должны иметь возможность запрашивать остаток (|) из 3 и 5 одновременно, вы можете использовать ранг ("), чтобы управлять тем, как аргументы передаются в остаток :

   3 5 |"0 1 i. 10
0 1 2 0 1 2 0 1 2 0
0 1 2 3 4 0 1 2 3 4

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *] * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. Поскольку правый аргумент состоит только из одной строки, он передается повторно каждому элементу левого аргумента.

Теперь мы можем сделать 0= для всего массива:

   0 = 3 5 |"0 1 i. 10
1 0 0 1 0 0 1 0 0 1
1 0 0 0 0 1 0 0 0 0

Вставить условие ИЛИ между двумя элементами (строками) массива:

  +./ 0 = 3 5 |"0 1 i. 10
1 0 0 1 0 1 1 0 0 1

Получить индекс каждого 1 в списке / векторе:

  I. +./ 0 = 3 5 |"0 1 i. 10
0 3 5 6 9

И сумма:

 +/ I. +./ 0 = 3 5 |"0 1 i. 10

23

Вы можете довольно легко сделать это явной функцией / глаголом:

   euler1=: verb define
+/ I. +./ 0 = 3 5 |"0 1 i. y
)

Или, как только вы научитесь молчать J, вы можете определить:

   euler1=: +/@I.@(+./)@(0 = 3 5 |"0 1 i.)
1 голос
/ 12 октября 2009
  • Refactor 0= (увеличивает размер программы)

<code>+/((3|1+i.1000-1)+.&(0=])5|1+i.1000-1)*1+i.1000-1
  • Refactor 1+i.1000-1

<code>+/(((3|])+.&(0=[)5|])1+i.1000-1)*1+i.1000-1
  • Refactor 1+i.1000-1 снова

<code>+/(*(3|])+.&(0=[)5|])1+i.1000-1

Единственное, что я до сих пор не смогла реорганизовать, это оператор |

...