在不冒复制风险的情况下安全地层压 J 中的字符串
Safely laminate strings in J without risking replication
如果你层压 (,:
) 个具有多个字符的字符串,你会得到一个很好的填充数组:
x =: 'x'
y =: 'yolo'
z =: 'zebra'
y ,: z
yolo
zebra
如果层压单个字符,则复制标量:
y ,: x
yolo
xxxx
您可以通过使用 $
:
将标量转换为向量来避免这种情况
y ,: 1$ x
yolo
x
但如果你是瞎子,那就不太好了:
y ,: 1$ z
yolo
z
是否有一种简单直接的方法来层压字符串 x 和 y,而无需提前知道其中一个是否只有一个字符长?
添加一个轴,
,层压前:
y,:,x
yolo
x
y,:,z
yolo
zebra
f=: ,: & ,当只有 2 个字符串时工作正常,但是当有多个字符串时,ravel 感觉不太对。
f=: ,: & ,
'yellow' f 'x'
yellow
x
'yellow' f 'x' f 'blue'
yellow
x blue
出于这个原因,我更喜欢引入一个动词来强制两个参数都排在第 2 位。然后你可以使用 append 而不是 laminate。
d2=: 13 : '(_2{. 1 1,$y)$,y'
g=: ,&d2
'yellow' g 'x'
yellow
x
'yellow' g 'x' g 'blue'
yellow
x
blue
如果你层压 (,:
) 个具有多个字符的字符串,你会得到一个很好的填充数组:
x =: 'x'
y =: 'yolo'
z =: 'zebra'
y ,: z
yolo
zebra
如果层压单个字符,则复制标量:
y ,: x
yolo
xxxx
您可以通过使用 $
:
y ,: 1$ x
yolo
x
但如果你是瞎子,那就不太好了:
y ,: 1$ z
yolo
z
是否有一种简单直接的方法来层压字符串 x 和 y,而无需提前知道其中一个是否只有一个字符长?
添加一个轴,
,层压前:
y,:,x
yolo
x
y,:,z
yolo
zebra
f=: ,: & ,当只有 2 个字符串时工作正常,但是当有多个字符串时,ravel 感觉不太对。
f=: ,: & ,
'yellow' f 'x'
yellow
x
'yellow' f 'x' f 'blue'
yellow
x blue
出于这个原因,我更喜欢引入一个动词来强制两个参数都排在第 2 位。然后你可以使用 append 而不是 laminate。
d2=: 13 : '(_2{. 1 1,$y)$,y'
g=: ,&d2
'yellow' g 'x'
yellow
x
'yellow' g 'x' g 'blue'
yellow
x
blue