有没有一种惯用的方法可以在 J 中对角打印一个向量(列表)或一个字符串?
Is there an idiomatic way to print a vector(list) or a character string diagonally in J?
如果我有一个列表 a=:i.5,它可以这样打印吗(对角线):
0
1
2
3
4
或者在像 'enigmatic' 这样的字符串的情况下,可以生成 'x' 模式吗?
e e
n n
i i
g g
m
a a
t t
i i
c c
(此处贴出C代码,仅供参考。)
#include<stdio.h>
#include<string.h>
main()
{
int len, i, j;
char str[100];
printf("Enter a string with odd no. of characters to get X Pattern\n");
gets(str);
len = strlen(str);
for(i = 0;i < len; i++)
{
for (j = 0; j<len; j++)
if (i == j || i+j == len-1) /* this is the condition for getting the 'x' shape */
{
printf("%c",str[i]); /* print character at current string position */
}
else
{
printf(" ");
}
printf("\n");
}
}
我猜#(长度)。您可以像这样垂直打印(在 J 中):
>/. 'hello'
h
e
l
l
o
提前致谢!
一个相当惯用的观点是用空格填充,
每个数字,形成一个矩阵,然后适当地shape $
矩阵:
y =: '012345'
z =: #y
c =: '_' NB. fill character
(z,z)$,(c#~z),~"_ 0 y
0_____
_1____
__2___
___3__
____4_
_____5
要得到另一条对角线,你可以简单地使用 reflect |.
:
m
0_____
_1____
__2___
___3__
____4_
_____5
|."1 m
_____0
____1_
___2__
__3___
_4____
5_____
同样,您可以创建索引矩阵:
]ii =: 6 6 $ ,(6#0),~"_ 0]>:i.6
1 0 0 0 0 0
0 2 0 0 0 0
0 0 3 0 0 0
0 0 0 4 0 0
0 0 0 0 5 0
0 0 0 0 0 6
]|."1 ii
0 0 0 0 0 1
0 0 0 0 2 0
0 0 0 3 0 0
0 0 4 0 0 0
0 5 0 0 0 0
6 0 0 0 0 0
然后将每个元素放到位:
6 6 $ ,(ii + |."1 ii) { '_enigma'
e____e
_n__n_
__ii__
__gg__
_m__m_
a____a
也许不那么惯用,但另一种更通用的方法是使用 monad }
,因为您可以轻松修改它以允许其他模式。
有两个矩阵可供选择:
] a=: ('_',: # #"0 1 ,.) 'enigma'
______
______
______
______
______
______
eeeeee
nnnnnn
iiiiii
gggggg
mmmmmm
aaaaaa
您可以使用像这样的位图:
]b=: (+|.) = i. # 'enigma'
1 0 0 0 0 1
0 1 0 0 1 0
0 0 1 1 0 0
0 0 1 1 0 0
0 1 0 0 1 0
1 0 0 0 0 1
b}a
e____e
_n__n_
__ii__
__gg__
_m__m_
a____a
}
允许动名词形式,所以 v1`v2} y
是 (v1 y)}(v2 y)
。作为默认定义:
f=: ((+|.)@=@i.@#)`('_',: # #"0 1 ,.)}
f 'enigma'
如果我有一个列表 a=:i.5,它可以这样打印吗(对角线):
0
1
2
3
4
或者在像 'enigmatic' 这样的字符串的情况下,可以生成 'x' 模式吗?
e e
n n
i i
g g
m
a a
t t
i i
c c
(此处贴出C代码,仅供参考。)
#include<stdio.h>
#include<string.h>
main()
{
int len, i, j;
char str[100];
printf("Enter a string with odd no. of characters to get X Pattern\n");
gets(str);
len = strlen(str);
for(i = 0;i < len; i++)
{
for (j = 0; j<len; j++)
if (i == j || i+j == len-1) /* this is the condition for getting the 'x' shape */
{
printf("%c",str[i]); /* print character at current string position */
}
else
{
printf(" ");
}
printf("\n");
}
}
我猜#(长度)。您可以像这样垂直打印(在 J 中):
>/. 'hello'
h
e
l
l
o
提前致谢!
一个相当惯用的观点是用空格填充,
每个数字,形成一个矩阵,然后适当地shape $
矩阵:
y =: '012345'
z =: #y
c =: '_' NB. fill character
(z,z)$,(c#~z),~"_ 0 y
0_____
_1____
__2___
___3__
____4_
_____5
要得到另一条对角线,你可以简单地使用 reflect |.
:
m
0_____
_1____
__2___
___3__
____4_
_____5
|."1 m
_____0
____1_
___2__
__3___
_4____
5_____
同样,您可以创建索引矩阵:
]ii =: 6 6 $ ,(6#0),~"_ 0]>:i.6
1 0 0 0 0 0
0 2 0 0 0 0
0 0 3 0 0 0
0 0 0 4 0 0
0 0 0 0 5 0
0 0 0 0 0 6
]|."1 ii
0 0 0 0 0 1
0 0 0 0 2 0
0 0 0 3 0 0
0 0 4 0 0 0
0 5 0 0 0 0
6 0 0 0 0 0
然后将每个元素放到位:
6 6 $ ,(ii + |."1 ii) { '_enigma'
e____e
_n__n_
__ii__
__gg__
_m__m_
a____a
也许不那么惯用,但另一种更通用的方法是使用 monad }
,因为您可以轻松修改它以允许其他模式。
有两个矩阵可供选择:
] a=: ('_',: # #"0 1 ,.) 'enigma'
______
______
______
______
______
______
eeeeee
nnnnnn
iiiiii
gggggg
mmmmmm
aaaaaa
您可以使用像这样的位图:
]b=: (+|.) = i. # 'enigma'
1 0 0 0 0 1
0 1 0 0 1 0
0 0 1 1 0 0
0 0 1 1 0 0
0 1 0 0 1 0
1 0 0 0 0 1
b}a
e____e
_n__n_
__ii__
__gg__
_m__m_
a____a
}
允许动名词形式,所以 v1`v2} y
是 (v1 y)}(v2 y)
。作为默认定义:
f=: ((+|.)@=@i.@#)`('_',: # #"0 1 ,.)}
f 'enigma'