2013-05-21 2 views
1

Я поясню свою проблему на простом английском языке, а затем показываю мои попытки в J.Нахождение них в массиве с J

просуммировать индексы 1-й лет списка 1 и 0, и посмотреть, если они равны другие номер. , например. при заданных 1 0 1 1 0 индексы равны 0,2 и 3, а их сумма равна 5. Поэтому я могу проверить, имеет ли он количество другого числа (очевидно, это верно только для 5 в этом случае).

Вот мой J:

indexsumtest =: =+/I. 
v =: 1 0 1 1 0 
    5 indexsumtest v 
0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 

Что? Здесь я предположил, что indexsumtest был диадическим глаголом, может быть, мне нужно явно ввести x и y?

indexsumtest =: x =+/I. y 
    5 indexsumtest v 
|value error: x 
| 5  indexsumtest v 

Nope. Это усугубило ситуацию.

Так что начнем с самого начала:

I. v 
0 2 3 

Правильно!

+/I. v 
5 

Исправить еще раз.

5 =+/I. v 
1 

1 означает true. Я сделал что-то правильно.

Почему я не могу сжать эти три операции в один глагол?

ответ

1

Рассмотрим классическую среднюю функцию:

mean =: +/%# 
mean i.6 

3 части заявления, как, которые работают таким образом:

  • # выполняется против y
  • +/ выполняется против y
  • % является выполненное двоично ULTS из +/ и # в соответствующих местах

Принцип такой же, с диадического функции:

  • I. выполняется против x и y
  • = выполняется против x и y
  • +/ выполняется по результатам = ив соответствующих местах

Таким образом, делая

indexsumtest =: =+/I. 
5 indexsumtest 1 0 1 1 0 

эквивалентно

(5 = 1 0 1 1 0) +/ (5 I. 1 0 1 1 0) 

Далеко от того, что вы хотите.

Простой фокус в том, чтобы определить двоичную функцию в явном виде:

indexsumtest =: 4 : 'x =+/I. y' 

молчаливое определение J также показывает, что это:

[ = [: +/ [: I. ] 

Который является немного тяжелым, на мой вкус.

+0

Я думаю, что понял. Но в определении диадического глагола, что представляют собой 4:? то есть indexsumtest =: 4: 'x = +/I. y ' –

+0

Он представляет собой ... двоичный! См. Http://www.jsoftware.com/help/dictionary/d310n.htm. Краткая форма определения глагола - '3: '...'' или '4: '...'', длинная форма на нескольких строки начинаются с '3: 0' или' 4: 0' и продолжаются в следующих строках до первой строки с одиночной закрывающейся скобкой ')'. – MPelletier

+1

Недавно я начал изучать J, но считаю, что первый сегмент вашего ответа неверен. '%' выполняется против результата '#' и '+ /', который просто делит результат суммы и количества элементов. –

3

Это один, который кусает все сейчас и потом, и это приводит, потому что

5 =+/I. v 

на самом деле I. действует на V, то результат находится под действием + /, то этот результат сверяется 5, используя = сравнение. Поэтому, когда мы определяем

indexsumtest =: =+/I. 

мы получаем

 5 indexsumtest v 
    0 0 0 0 0 
    0 0 0 0 0 
    0 0 0 0 0 
    0 0 0 0 0 
    0 0 0 0 0 

потому indexsumtest была определена как молчаливое глаголом, который обрабатывает свои аргументы как разветвление, как предложил MPelletier. Другими словами, вы на самом деле не получаете = +/I. вместо indexsumtest вы получаете (= +/I.), который является 3-х глагольным fork, где первый и третий глаголы принимают оба аргумента, а результат каждого отправляется в +/в центре.

MPelletier также предполагает, что молчаливое форма, которая делает то, что вы хотите, это

[ = [: +/ [: I. ] 

, который будет работать и на самом деле создается J, если вы измените свое определение 13

indexsumtest =: 13 : 'x =+/I. y' 
indexsumtest 
[ = [: +/ [: I. ] 

Yep, что правильно, J действительно сделает для вас самые негласные преобразования, если вы используете определение 13: для определения. Довольно круто, а? Единственная проблема заключается в том, что в этом автоматическом поколении он не использует крючки, которые могут упростить код. Крючок представляет собой комбинацию из двух глаголов, которая имеет правильный глагол для правильного аргумента, и результат используется как правый аргумент для левого глагола, который использует левый аргумент в двоичном случае (или исходный правый аргумент в монадическом случае) ,

При х и у левые и правые аргументы и у и v имеют первые и вторые глаголы затем

x (u v) y становится x u (v y)

или в монадических случае

(u v) y становится y u (v y)

Если вы все еще со мной (хорошо для вас!), Это означает, что мы можем использовать крючок, чтобы упростить молчание, если мы установим u в = и v в +/@ I. (@ - это соединение, которое объединяет +/и I. и делает их работающими как один глагол). Таким образом, в конце концов

indexsumtacit =: = +/@I. 
    5 indexsumtacit v 
1 

Как mindbending, как J, когда вы начинаете, это очень аккуратным, когда вы понимаете правила, которые он играет на, а затем начать, чтобы получить их, чтобы сделать ваши ставки. Надеюсь это поможет.

+0

Я бы не сказал «вы на самом деле не получаете = +/I. Вместо indexsumtest», потому что мне кажется, что это именно то, что вы получаете: эта комбинация значений в целом. Но я знаю, что вы имеете в виду. Подстановка - это не серия токенов, которые затем будут рассмотрены в новом контексте. Это их смысл, взятый вместе. Помещение круглых скобок вокруг слов J - это один из способов сказать «взять их вместе». Именование их - другое. – kaleidic

0

Это все о том, как J анализирует выражение. Когда J видит глагол, он неявно добавляет круглые скобки вокруг него. Таким образом, 5 indexsumtest v является 5 (=+/I.) v; в то время как 5 =+/I. v фактически 5 =+/ (I. v). Эти два варианта, как ответы выше.

Я нашел, что очень полезно понять, как J оценивает выражения, читая Appendix 1 of Learning J. Это заслуживает целую главу, а не приложение для любых J учебников.

 Смежные вопросы

  • Нет связанных вопросов^_^