J Checker Board

时间:2015-12-04 00:42:34

标签: functional-programming j

我需要使用J来打印棋盘格,我的函数给出一个奇数需要创建一个NxN矩阵并放置一个' X'在其他每一个盒子里。我制作了矩阵,但我无法弄清楚其他每一个盒子。

到目前为止我有什么

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

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

1 个答案:

答案 0 :(得分:5)

最简单的方法是使用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'
  5. 打包成可重复使用的动词:

    1. 明确:cb =: verb def ' (a:,<'X') {~ 2 | i. ,~ y'
    2. 默契:cb =: (a:,<'X') {~ 2 | i.@,~
    3. 这种创建所有可能结果的数组并将所有输出同时索引到它们中的模式是数组编程的基本机制之一,并广泛用于许多不同的习语。