J 棋盘

J Checker Board

我需要使用 J 打印棋盘,我的函数给定一个奇数需要创建一个 NxN 矩阵并在每个其他框中放置一个 'X'。我制作了矩阵,但我无法弄清楚其他方框部分。

到目前为止我有什么

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

如果有人能提供帮助,我将不胜感激!

最简单的方法是使用 a:,<'X' 代替 <'X':

(2$N)$ a:,<'X'

之所以有效,是因为 x $ y (reshape) 如果 */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 | i.@,~

这种创建包含所有可能结果的数组并将所有输出同时索引到其中的模式是数组编程的基本机制之一,并广泛用于许多不同的习语中。