2015-12-04 7 views
3

Мне нужно использовать J для печати контрольной доски, моя функция с нечетным номером должна создать матрицу NxN и поместить «X» в каждую другую коробку. У меня есть матрица, но я не могу разобраться в каждой другой части коробки.J Checker Board

То, что я до сих пор

N =: 3 
checker =: (2$N)$ <'X' 

Если кто-то может помочь, я был бы признателен!

+0

Отметьте [этот почти дублированный вопрос] (http://stackoverflow.com/questions/31339471/modifying-one-row-of-an-array) – Eelvex

ответ

4

Самый простой путь состоит в использовании 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| | 
+-+-+-+-+-+ 

Сломался справа налево:

  1. y=. ,~ N NB. Duplicate N; ,~5 becomes 5,5
  2. y=. i.y NB. NxN table of the first N^2 non-negative integers
  3. y=.2|y NB. y mod 2, so an NxN table of 0 1 0 1 0 1 ...
  4. y=.(a:,<'X') {~ y NB. Map 0 to ace (empty) and 1 to <'X'

Упакованные в качестве повторного использования глагола:

  1. Явных: cb =: verb def ' (a:,<'X') {~ 2 | i. ,~ y'
  2. Неявных: cb =: (a:,<'X') {~ 2 | [email protected],~

Этой модель создания массива всех возможные результаты и индексирование всех выходов в них одновременно, является одним из фундаментальной механики программирования массивов и широко используется в ряде разных идиом.

+0

, хотя это работает намного продвинуто, чем все, что мы узнали в классе! –

+0

@MichaelMiner Первоначально я чрезмерно задумывался над этим (или над его обобщением); В верхней части моего ответа я добавил более простой и более прямой метод. Скорее всего, это то, что ищет ваш учитель. –

+0

Вы можете объяснить, как (a:, <'X') работает? –