我几周前接过J,差不多同时向公众开放the CodeGolf.SE beta。
当在那里使用J时,(我的)经常出现的问题是重新格式化输入和输出以适应问题规范。所以我倾向于使用这样的代码:
( ] ` ('_'"0) ) @. (= & '-')
这个因各种原因未经测试(编辑我错了);预期含义是“将-
转换为_
”。还经常出现:将换行符转换为空格(和对话),将数字与j
合并,更改括号。
这会占用很多字符,并且不便于集成到程序的其余部分。
还有其他方法可以继续吗?最好是更短,但如果它有其他优点我很乐意学习其他任何东西。此外,具有隐含功能正面的解决方案可以减轻很多。
答案 0 :(得分:6)
有时候使用库方法违反了代码高尔夫的本质,但在字符串库中,charsub方法非常有用:
'_-' charsub '_123'
-123
('_-', LF, ' ') charsub '_123', LF, '_stuff'
-123 -stuff
答案 1 :(得分:4)
rplc
通常是简单替换的简称:
'Test123' rplc 'e';'3'
T3st123
对于特殊情况,修改m}
非常短:
'*' 0} 'aaaa'
*aaa
'*' 0 2} 'aaaa'
*a*a
'*&' 0 2} 'aaaa'
*a&a
但是当列表必须是动词时会变得混乱:
b =: 'abcbdebf'
'L' (]g) } b
aLcLdeLf
其中g必须类似于g =: ('b' E. ]) # ('b' E. ]) * [: i. #
。
还有很多其他“技巧”可以根据具体情况而定。手册中的示例:
用大写'A'替换小写'a'到'f' 通过'F'在一个只包含'a'到'f'的字符串中:
('abcdef' i. y) { 'ABCDEF'
扩展前面的例子:将小写'a'替换为 'f'用大写'A'到'F'保留其他字符不变:(('abcdef' , a.) i. y) { 'ABCDEF' , a.
答案 2 :(得分:1)
我只处理了换行符和CSV,而不是替换的一般情况,但这就是我处理这些问题的方法。我假设Unix行结尾(或行结尾用toJ修复)和最后一行换行。
".{:('1 2 3',LF)
(尚未使用此内容)(".;._2) ('1 2 3',LF,'4 5 6',LF)
(,;._2)
(<;._2)
(还没有用过它。)".;._1}:',',('1,2,3',LF)
这根本不会取代tr
,但对行结尾和其他垃圾有帮助。
答案 3 :(得分:1)
您可能需要考虑使用the 8!:2 foreign:
8!:2]_1
-1