- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有人把这个发给我,并声称这是 Brainfuck 中的一个 Hello World (我希望如此......)
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
我知道它通过移动指针以及递增和递减内容来工作的基础知识......
但我还是想知道,它到底是如何运作的?它首先是如何在屏幕上打印任何内容的?它如何对文本进行编码?完全看不懂……
最佳答案
要理解 Brainfuck,您必须想象由 0
初始化的无限单元格数组。每个。
...[0][0][0][0][0]...
当brainfuck程序启动时,它指向任何单元格。
...[0][0][*0*][0][0]...
如果向右移动指针 >
您正在将指针从单元格 X 移动到单元格 X+1
...[0][0][0][*0*][0]...
如果增加单元格值+
你得到:
...[0][0][0][*1*][0]...
如果再次增加单元格值+
你得到:
...[0][0][0][*2*][0]...
如果减小单元格值-
你得到:
...[0][0][0][*1*][0]...
如果向左移动指针 <
您正在将指针从单元格 X 移动到单元格 X-1
...[0][0][*0*][1][0]...
要读取字符,请使用逗号 ,
。它的作用是:从标准输入读取字符并将其十进制 ASCII 代码写入实际单元格。
看看ASCII table 。例如,十进制代码 !
是 33
,而a
是 97
.
好吧,让我们想象一下您的 BF 程序内存如下所示:
...[0][0][*0*][0][0]...
假设标准输入代表 a
, 如果您使用逗号 ,
运算符(operator),BF所做的就是读取a
十进制 ASCII 代码 97
内存:
...[0][0][*97*][0][0]...
您通常会这样想,但事实要复杂一些。事实上,BF 读取的不是字符而是字节(无论该字节是什么)。让我向您展示示例:
在Linux中
$ printf ł
打印:
ł
这是特定的波兰语字符。该字符不是通过 ASCII 编码进行编码的。在本例中,它是 UTF-8 编码,因此它过去在计算机内存中占用多个字节。我们可以通过制作十六进制转储来证明这一点:
$ printf ł | hd
显示:
00000000 c5 82 |..|
零是偏移的。 82
是第一个并且 c5
是表示 ł
的第二个字节(以便我们阅读它们)。 |..|
是图形表示,在这种情况下是不可能的。
好吧,如果你通过 ł
作为读取单字节的 BF 程序的输入,程序内存将如下所示:
...[0][0][*197*][0][0]...
为什么197
?嗯197
十进制为 c5
十六进制。看起来很熟悉?当然。它是 ł
的第一个字节!
要打印字符,请使用点 .
它的作用是:假设我们将实际单元格值视为十进制 ASCII 代码,将相应的字符打印到标准输出。
好吧,让我们想象一下您的 BF 程序内存如下所示:
...[0][0][*97*][0][0]...
如果你现在使用点(.)运算符,BF所做的是打印:
a
因为a
ASCII 的十进制代码是 97
.
例如 BF 程序是这样的(97 加 2 点):
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++..
将其指向的单元格的值增加到 97 并打印出来 2 次。
aa
BF 循环由循环开始 [
组成和循环结束]
。您可以认为这就像 C/C++ 中的 while ,其中条件是实际单元格值。
看看下面的BF程序:
++[]
++
将实际单元格值增加两倍:
...[0][0][*2*][0][0]...
和[]
就像 while(2) {}
,所以它是无限循环。
假设我们不希望这个循环是无限的。例如我们可以这样做:
++[-]
因此,每次循环都会减少实际单元格值。一旦实际单元格值为 0
循环结束:
...[0][0][*2*][0][0]... loop starts
...[0][0][*1*][0][0]... after first iteration
...[0][0][*0*][0][0]... after second iteration (loop ends)
让我们考虑有限循环的另一个例子:
++[>]
此示例显示,我们不必在循环开始的单元格处完成循环:
...[0][0][*2*][0][0]... loop starts
...[0][0][2][*0*][0]... after first iteration (loop ends)
但是,从开始的地方结束是一个很好的做法。为什么 ?因为如果循环结束它开始的另一个单元格,我们无法假设单元格指针将在哪里。说实话,这种做法让brainfuck变得不那么brainfuck了。
关于brainfuck - Brainfuck Hello World 实际上是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16836860/
是 Brainfuck如果单元是位,并且 + 和 - 操作只是翻转一点,那么图灵完备?是否有一个简单的证据表明无论单元大小如何,类 Brainfuck 的语言都是图灵完备的,还是我需要考虑一个模拟图灵
作为我的 Brainf*ck 实现的调试器/测试程序,我创建了以下计数循环: +[[>+]+] 对于单字节、环绕单元和 30k 单元,这会创建一个无限计数循环。它将每个单元格设置为 1,然后将每个单元
我想知道是否可以只用代码开头的数字 k 来计算 brainfuck 中 1+2+3+...+k 的总和? 例如是否可以像这样做 1+2+3: +++> (这里的代码创建了一个二和三个相加,创建一个并相
我正在研究一个直接解释 brainfuck 的物理面包板 8 位 CPU。 语言规范表明左括号和右括号都有逻辑: [ => Jump to matching ] If Zero ] => Jump t
我正在尝试在 Brainfuck 中制作一个我认为也称为“Brainflake”的程序,它将添加两个用 ASCII 数字字符输入的单位十进制整数,并在输出中以 ASCII 数字字符显示总和。我将如何着
例如,如果数组像 0 0 0 0 ... 0 0[n]s o m e d a t a 4 9 9 9 9 9 9 8 3 7 ...,如何移动指针通过 n,在指针移动后不改变 s o m e d a
有人把这个发给我,并声称这是 Brainfuck 中的一个 Hello World (我希望如此......) ++++++++++[>+++++++>++++++++++>+++>+++.>+.++
我正在尝试使用 BrainFuck 编写一个程序,该程序可以读取最多为 9 的两个数字,计算它们的总和,然后将结果打印出来,例如3 & 5 给出结果 8 。 我只是想了解 BF 语言,但它看起来比我想
有人可以在程序设计语言Brainf * ck中发布一个代码段,以将两个一位数字相乘吗? 最佳答案 ,>, go to cell #2 [ ->+>+> go to cell #4 [ -
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 7年前关闭。 Improve t
你能创建一种像 Brainfuck 这样只有一个符号的编程语言吗? 最佳答案 是的,以前已经做过 - 请参阅 Unary . 基本上这是一种奇怪的 Brainfuck 编码。将每个 BF 命令视为一个
这是我正在使用的代码,它测试“b”的输入,如果有其他输入,应该输出“Y”。 拜托,没有人问我为什么选择使用“Y”作为错误值.. > , ----- ---- ----- ---
我有以下正在通过最小测试套件的 Brainfuck 解释器。除了一个相当大的问题,比如打印斐波那契数列似乎失败了(套件中的最后一个测试)。我解释执行失败的 brainfuck fibonacci 代码
我决定使用 Borland 的 CppBuilder6 用 C++ 编写一个简单的 Brainfuck IDE。我已经为 RichEdit 装上了我的,让它看起来有点像记事本。然后我为输入添加了 TE
我是 C 的新手。目前我正在尝试编写一个 Brainfuck 解释器。到目前为止,我已经尝试过了。 #include #include char *line; int curr_po
我认为我的程序并非在所有情况下都支持嵌套循环。这太荒谬了,但是这个 brainfuck 程序与我的拦截器一起正常工作并打印“Hello World!”到标准输出: ++++++++[>++++[>++
我坐下来尝试实现 BrainFuck。 syntax看起来很简单。我无法让愚蠢的事情发挥作用。我已经有一段时间了;我承认我需要 sleep 。也许这就是问题所在。解释器没有输出任何东西。我很确定问题很
是的,我正在制作 Brainfuck 解释器,但我还需要从其代码创建 AST。可以很容易地在节点中使用原始操作(+ - . , > rightBracketsIds; private rea
我写了一个 brainfuck ide 的 alpha 版本。我写了自己的解释器,虽然我从我的老师那里得到了关于代码循环的大量帮助,因为我很难以“IT 方式”理解它。现在对于我的报告,我需要解释器算法
我正在为该语言编写解释器 Brainfuck 我用的是命令行 java bfinterpreter/BFInterpreter >output.bin bf 程序应该输出 00 到 FF 的十六进制,
我是一名优秀的程序员,十分优秀!