Вопрос

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

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

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

Это было полезно?

Решение

Нет необходимости "обрабатывать ноль", потому что добавление нуля не изменит ответ, поэтому вы можете просто использовать 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 1 говорит передать левый аргумент в | по одному элементу за раз при одновременной подаче правильных аргументов по одной строке за раз.Поскольку правый аргумент состоит только из одной строки, он повторно передается каждому из элементов левого аргумента.

Теперь мы можем сделать следующее 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

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

  +./ 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
)

Или, как только вы освоитесь с tacit J, вы могли бы определить:

   euler1=: +/@I.@(+./)@(0 = 3 5 |"0 1 i.)

Другие советы

  • Рефакторинг 0= (увеличит размер программы)

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

  • Рефакторинг 1+i.1000-1

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

  • Рефакторинг 1+i.1000-1 снова

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

Единственное, что мне пока не удалось выполнить рефакторинг, это | оператор

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top