1

我有一张如下表

0 1  2  3
4 5  6  7
8 9 10 11

我想制作以下结构。

┌──────┬──┐
│0 1  2│ 3│
│4 5  6│ 7│
│8 9 10│11│
└──────┴──┘

有人可以帮我吗?

4

3 回答 3

3

在 J 中总是有另一种方式!

   ]a=. i. 3 4
0 1  2  3
4 5  6  7
8 9 10 11
  ('' ;1 0 0 1) <;.1 a
┌──────┬──┐
│0 1  2│ 3│
│4 5  6│ 7│
│8 9 10│11│
└──────┴──┘

这使用了二元切连词 (;.) 和 xu 的一般形式;。纽约

y 是我们想要分区的参数,x 指定要放置分区的位置,如果我们希望结果中包含音品(分区位置),n 是正数,值 1 表示我们从左侧工作向右,u 是我们要应用于分区的动词。

一个棘手的问题:x 是 ('';1 0 0 1) 因为我们想要数组的整个第一个维度(行),之后的 1 表示分区开始。在这种情况下,我们取所有行并将第一个分区设为前 3 列,最后一个 1 将最后一个分区设为自己的列。

这个解决方案有很多事情要做,并且可以根据程序员的需要以多种不同的方式使用它。

于 2013-07-25T06:24:23.207 回答
2

您的问题的标题(“将表格分成两部分并在之后将其装箱”)表明您绘制的示例可能无法反映您想要学习的内容。

我的印象是,您将生成的名词视为一个包含两个部分的双轴表。这种解释的主要问题是盒子非常彻底地划分了它们的内容。要使第二个框中的数字看起来像是从第一个框中的结构中修剪出来的,需要特别努力。这样的努力很少值得。

如果很自然地需要3 7 11将其作为一个单元从它所在的结构中取出,那么将其作为表格的一行而不是一列是有好处的。2 轴表始终是 1 轴列表的列表。如果您的问题是分离项目的问题,那么原子的这种方向会使操作变得更简单。

将其付诸实践,在这里我们处理行而不是列:

  aa=: |:i.3 4
  aa
0 4  8
1 5  9
2 6 10
3 7 11

  (}: ; {:) aa
+------+------+
|0 4  8|3 7 11|
|1 5  9|      |
|2 6 10|      |
+------+------+

括号中的程序可以从字面上理解为“缩减链接尾部”。这是我从您的问题标题中所期望的那种程序。

有效的 J 编程的一部分是定向数据(名词),以便它们更容易被程序(动词)操作。

于 2013-07-25T17:11:17.340 回答
1

这是一种方法:

   ]a=: i. 3 4
0 1  2  3
4 5  6  7
8 9 10 11
   3 ({."1 ; }."1) a
┌──────┬──┐
│0 1  2│ 3│
│4 5  6│ 7│
│8 9 10│11│
└──────┴──┘

换句话说,“取每行中的前 3 项a并链接 ( ;),结果删除了每行中的前 3 项a

根据具体的用例,其他方法和/或结构可能更合适。

于 2013-07-25T03:40:06.610 回答