J语言斜向打印向量(列表)与字符串X形排列的实现方法
J语言斜向打印与字符串X形排列实现
斜向打印数值向量
对给定列表a=:i.5(元素为0 1 2 3 4),逐行打印时为第n行(索引从0开始)的元素补充n个前导空格,形成向右下倾斜的输出效果,可直接用以下惯用写法实现:
a=: i.5 NB. 生成每行对应的前导空格长度序列 indent=: i. #a NB. 拼接空白串与对应元素的字符串形式,组装逐行内容 lines=: (indent # ' ') ,. each ":@&.> a NB. 展开为可打印文本块 > lines
输出结果:
0 1 2 3 4
实现逻辑和你已掌握的垂直逐行打印(如>/. 'hello'输出逐行字符)同源,只是额外补充了和索引值匹配的前导空格长度,全程依托J的数组操作完成,无需写显式循环。
字符串X形排列效果
对输入字符串(如'enigmatic',长度9),实现参考C代码的打印规则:第i行仅在两个对角线位置(列号=行号i、列号= len-1 -i)打印对应字符s[i],其余位置填充空格,可通过位置掩码的方式批量实现:
s=: 'enigmatic' len=: #s NB. 生成主对角线掩码:矩阵中位置(i,j)满足i=j为真 main_diag=: (=/@i.)"1 i.len NB. 生成反对角线掩码:矩阵中位置(i,j)满足i+j=len-1为真 anti_diag=: ((len-1)=+/])"1 i.len 2 NB. 合并两个掩码得到有效位置集合 mask=: main_diag +/. anti_diag NB. 为每行生成全空格基础模板,通过择位替换在有效位置写入对应字符 rows=: (len #"1 ' ') mask}"0_ s > rows
输出结果:
e e n n i i g g m a a t t i i c c
该实现的位置判断逻辑和参考C代码中i == j || i+j == len-1的判断完全等价,只是将两层循环的逐点遍历替换为矩阵级批量运算,是J语言处理这类结构化文本打印的典型写法。
内容的提问来源于stack exchange,提问作者user3234709
相关产品推荐
相关产品推荐

