19

在 SuperUser.com 上就无用的答案进行了争论,并发现自己在挑战另一位发帖人,让他用脑筋急转弯来回答这个问题。他没有接受我,但现在我很好奇。

程序所需要做的就是将 CRLF 行尾转换为 LF(dos 样式到 unix)。周围的任何 bf 编码器都可以提供帮助吗?

4

3 回答 3

25

这有点短,只有 41 个字符。

,[[->+>+<<]>-------------[>.<[-]]>[-]<<,]

它将一个值读入 a[0]。它将读取的值复制到 a[1] 和 a[2] 中,并从 a[1] 中减去 13。如果 a[1] 不为零(意味着它不是 CR),它会放置 a[2] 并清除 a[1]。然后它清除 a[2] 并再次读入 a[0] 并重复。

这还有一个额外的优势——因为它在每次读取时都留下 a[0]=0——它应该支持将 EOF 读取为 0 或将 EOF 视为“无变化”的 BF 虚拟机,这两种情况都很常见。

由于这不会用 LF 替换 CRLF 对,而只是去除 CR,因此这不依赖于假设文件以 LF 结尾。我自己对 dos2unix(至少是 Cygwin 的测试)的测试并不表明保留了单独的 CR。

于 2009-10-08T23:42:32.017 回答
24

干得好:

,[[->+>+<<]>>>,[<-------------[+++++++++++++.>>>]<[>>----------[>+++++++++++++.-------------]<++++++++++>]<<<<[-]>>>[-<<<+>>>]]<[-]<[-]<]++++++++++.

假设 EOF 由输入值 0 指示(这是牛肉的默认值,我曾经测试过,这是一个合理的选择;我认为它也可能支持 EOF 保持字符不变,但我没有测试)。还假设文件以 LF 结尾(实际上,它用 LF 替换了最后一个字符)。如果 CR 不是 CRLF 对的一部分(即,它输出单独的 CR),则正确处理 CR。

可能花了一个小时来编写和测试,其中包括从一开始就学习 Brainfuck。

于 2009-10-07T21:28:13.550 回答
4

略短且简单的 CR 剥离器:

,[-------------[+++++++++++++.[-]],]
于 2015-08-01T14:48:56.680 回答