Самый простой путь состоит в использовании a:,<'X'
вместо <'X'
:
(2$N)$ a:,<'X'
причина, почему это происходит потому, что x $ y
(Reshape) повторно y
циклически, если */x
больше, чем количество элементов в y
.
Сказав это, было бы более интересно подойти к этому аналитически с использованием фундаментального шаблона в программировании массива, который будет гораздо более широко применяться, чем фиксированное количество повторений или шаблонов.
Попробуйте это:
(a:,<'X') {~ 2 | i. ,~ N
Например:
(a:,<'X') {~ 2|i.,~5
+-+-+-+-+-+
| |X| |X| |
+-+-+-+-+-+
|X| |X| |X|
+-+-+-+-+-+
| |X| |X| |
+-+-+-+-+-+
|X| |X| |X|
+-+-+-+-+-+
| |X| |X| |
+-+-+-+-+-+
Сломался справа налево:
y=. ,~ N NB. Duplicate N; ,~5 becomes 5,5
y=. i.y NB. NxN table of the first N^2 non-negative integers
y=.2|y NB. y mod 2, so an NxN table of 0 1 0 1 0 1 ...
y=.(a:,<'X') {~ y NB. Map 0 to ace (empty) and 1 to <'X'
Упакованные в качестве повторного использования глагола:
- Явных:
cb =: verb def ' (a:,<'X') {~ 2 | i. ,~ y'
- Неявных:
cb =: (a:,<'X') {~ 2 | [email protected],~
Этой модель создания массива всех возможные результаты и индексирование всех выходов в них одновременно, является одним из фундаментальной механики программирования массивов и широко используется в ряде разных идиом.
Отметьте [этот почти дублированный вопрос] (http://stackoverflow.com/questions/31339471/modifying-one-row-of-an-array) – Eelvex