2010-06-07 4 views
2

Imagine Я определил следующее имя в J:Как я могу определить глагол в J, который применяет другой глагол попеременно каждому атому в списке?

m =: >: i. 2 4 5

Это выглядит следующим образом:

 1 2 3 4 5 
6 7 8 9 10 
11 12 13 14 15 
16 17 18 19 20 

21 22 23 24 25 
26 27 28 29 30 
31 32 33 34 35 
36 37 38 39 40

Я хочу создать монадический глагол ранга 1, который применяется к каждому списку в этом список списков. Он удвоится (+:) или добавит 1 (>:) к каждому альтернативному элементу в списке. Если бы мы применили этот глагол к первой строке, мы получили бы 2 3 6 5 10.

Довольно легко получить список булевых элементов, которые чередуются с каждым элементом, например, 0 1 $~{:$ m дает нам 0 1 0 1 0. Я думал, ага! Я буду использовать что-то вроде +: ` >: @., за которым следует какое-то выражение, но я никогда не мог заставить его работать.

Любые предложения?

UPDATE

Следующая, кажется, работает, но, возможно, это может быть переработана в нечто более элегантное ПРОФЕССИОНАЛЬНЫЙ J.

poop =: monad define 
    (($ y) $ 0 1 $~{:$ y) ((]+:)`(]>:) @. [)"0 y 
)
+1

Спасибо Давиду, последний ответ кажется, @ (+: '>: /.)" 1 –

ответ

2

Я хотел бы использовать наклонный глагол, с 1-го ранга (/."1) - так оно применяется к последовательным элементам каждого списка, в своей очереди.

Вы можете передать герунду в /., и он применяет их в порядке, распространяющемся циклически.

+:`>: /."1 m 
2 
3 
6 
5 
10 

12 
8 
16 
10 
20 

22 
13 
26 
15 
30 

32 
18 
36 
20 
40 


42 
23 
46 
25 
50 

52 
28 
56 
30 
60 

62 
33 
66 
35 
70 

72 
38 
76 
40 
80 
+0

Это почти то, что мне нужно! Единственная проблема в том, что мне нужна оригинальная форма (2 4 5) назад. Не знаете, как это сделать. –

+0

Я понял: ($ m) $, ^: _ +: '>: /."1 m –

+0

На самом деле, мне даже не нужна мощность, поэтому я могу просто сказать: ($ m) $, +: '>: /." 1 m –

1

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

Форма аргументов в выраженной в скобках фразе является формой аргумента, переданной ей справа, даже если ранг изменен конъюгатом " (ну, это то, что называется трассировкой, я думал, что это наречие). Если , были монадическими, это было бы ravel, и результат был бы вектором или, по крайней мере, более низкого ранга, чем вход, основанный на наречиях для ravel. Это то, что происходит, если вы берете соединение - вы получаете вектор.

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

Теперь я, вероятно, ошибаюсь. Но $,"[email protected](+:>: /.) «1>: i. 2 4 5 -> 2 4 5 1 1`, который я считал своим доказательством.

1

(, @ (+:`>: /.) " 1 а) работает, но обратите внимание, что ((* 2 1 $ ~ $) @ (+ 0 1 $ ~ $) "1 a) также работал бы (и примерно в 20 раз быстрее, на больших массивах, в моих кратких тестах)