我需要使用J来打印棋盘,给定一个奇数,我的函数需要创建一个NxN矩阵,并在每个其他框中放置一个“ X”。我已经制作了矩阵,但无法弄清其他每个方框。
到目前为止我有什么
N =: 3 checker =: (2$N)$ <'X'
如果有人可以提供帮助,我将不胜感激!
最简单的方法是使用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 | i.@,~
创建所有可能结果的数组并同时将所有输出索引到其中的这种模式是数组编程的基本原理之一,并广泛用于许多不同的习语中。