使用第三叠
如果您阅读过标题,可能会有些困惑。当然,Brain-Flak中只有两叠吗?但是,我向您保证,它的存在并且是Brain-Flak写作和打高尔夫球中最强大的工具之一,即使不是最强大的工具。
什么是“第三叠”?
每个Brain-Flak程序都以一种或另一种方式使用第三个堆栈,但是大多数使用都是在后台进行的,通常只需忽略它存在的事实,通常会很有用。程序中的每个括号都可以从堆栈中添加或删除一项。三个开括号([<
都将一个项目添加到堆栈中,而三个共轭词)]>
都将一个项目从堆栈中删除。堆栈中项目的值是程序当前作用域的值,使用nilads将以某些方式修改此值。紧密括号)
具有将元素从“第三堆栈”移动到当前堆栈的独特功能。一推。
希望对您来说这已经很清楚了。第三堆栈是某种类型的堆栈,可以记住已经执行的代码的返回值。让我们来看一个简单的程序示例,该程序跟踪两个普通堆栈和第三个堆栈。
例
我们将逐步完成以下程序。该程序压-3, 1, -2
入堆栈。
(([()()()])(()))
我们从三个开括号开始,它们都将零推到第三堆栈。
现在我们的堆栈看起来像这样,第三个堆栈在右侧,活动堆栈下面有一个^
:
0
0
0 0 0
^
(([()()()])(()))
^
现在我们有三个()
尼拉德。它们对正常的两个堆栈没有任何作用,但是它们每个都会在“第三堆栈”的顶部添加一个,从而使我们的堆栈看起来像:
3
0
0 0 0
^
(([()()()])(()))
^
现在,我们遇到了一个]
如前所述的大括号,它从第三个堆栈中删除了一个项目,但]
具有从堆栈顶部减去它删除的元素的功能。因此,我们的新堆栈将如下所示:
-3
0 0 0
^
(([()()()])(()))
^
这很有道理;[...]
取反,因此]
应向下减去。
现在我们必须执行一个)
。您可能还记得)
程序中将内容压入堆栈的位置,因此我们会将“第三堆栈”的顶部移至当前堆栈,此外,还将“添加” -3
到第三堆栈中的下一个元素。
-3 0 -3
^
(([()()()])(()))
^
再次遇到三个开放括号之一,因此我们将另一个元素添加到“第三堆栈”中。
0
-3 0 -3
^
(([()()()])(()))
^
就像我们之前说的那样()
,第三栈的顶部将增加一。
1
-3 0 -3
^
(([()()()])(()))
^
并将)
第三堆栈的顶部移至活动堆栈并向下添加
1
-3 0 -2
^
(([()()()])(()))
^
最后一个)
将第三堆栈移动到活动堆栈上,并且由于在第三堆栈上没有剩余要添加的元素,因此不执行其他任何操作。
-2
1
-3 0
^
(([()()()])(()))
^
程序结束了,所以我们终止并输出。
该示例旨在使您了解“第三堆栈”的作用和作用。它不包括所有操作,但希望您能弄清楚每个操作各自的作用。如果您仍在挣扎中,我会在此答案的底部添加一个“备忘单”以帮助您。
好吧那又怎样
好的,现在您了解了第三堆栈,但是“那又如何”?即使您没有将其称为“第三叠”,您也已经在使用它,关于第三叠的思考如何帮助您打高尔夫?
让我们看一个问题。您想取一个数字的三角形。这是小于n的所有数字的总和。
一种方法可能是在堆外创建一个累加器,并在递减计数时将其添加到累加器中。这将创建如下代码:
(<>)<>{(({}[()])()<>{})<>}{}<>({}<>)
在线尝试!
这段代码非常紧凑,可能有人认为它不可能变得更小。但是,如果我们从第三个堆栈的角度进行处理,则很明显这是非常低效的。不用将累加器放在堆外,我们可以使用a将其放在第三个堆栈上,(
并在我们使用的末尾检索它)
。我们将再次遍历所有数字,但是这一次我们不需要做任何事情来增加我们的Third Stack,程序会为我们完成。看起来像:
({()({}[()])}{})
在线尝试
此代码小于我们之前制作的高尔夫球版本的一半。实际上,计算机搜索已证明该程序是可以执行此任务的最短程序。可以使用“所有运行的总和”方法来解释该程序,但是当使用“第三堆栈”方法进行解释时,我认为它会更加直观和清晰。
什么时候使用第三叠?
理想情况下,每当您开始研究Brain-Flak的新问题时,您都应该考虑一下我该如何考虑“第三堆”。但是,作为一般经验法则,每当您必须跟踪某种类型的累加器或拥有总计运行时,最好将其放在第三个堆栈上而不是两个实际堆栈上。
另外一次考虑使用第三个堆栈可能是一个好主意,那就是您没有足够的空间在其他两个堆栈上存储某些值。当您在两个现有堆栈上进行操作并且想要保存一个值以供以后使用而不必跟踪其位置时,这特别有用。
第三叠的局限性
第三堆栈在许多方面都非常强大,但它也有其自身的局限性和缺点。
首先,在编译时确定任何给定点的第三堆栈的最大堆栈高度。这意味着,如果要在堆栈上使用一定数量的空间,则在编写程序时必须分配该空间。
其次,第三个堆栈不是随机访问。这意味着您不能对除最高值之外的任何值执行任何操作。另外,您不能在堆栈上移动值(例如交换前两个元素)。
结论
第三堆栈是一个功能强大的工具,我认为它对于每个Brain-Flak用户都是必不可少的。这需要一些时间来适应,并且需要改变您对Brain-Flak编程的思考方式,但是如果使用得当,则在打高尔夫球时,一切都将变得体面而出众。
备忘单
以下是操作及其对第三堆栈的影响的列表
Operation | Action
====================================================
(,[,< | Put a zero on top of the Third Stack
----------------------------------------------------
) | Add the top of the Third Stack to the
| second element and move it to the
| active stack
----------------------------------------------------
] | Subtract the top of the Third Stack
| from the second element and pop it
----------------------------------------------------
> | Pop the top of the Third Stack
----------------------------------------------------
() | Add one to the top of the Third Stack
----------------------------------------------------
{} | Pop the top of the active stack and
| add it to the top of the Third Stack
----------------------------------------------------
[] | Add the stack height to the Third
| Stack
----------------------------------------------------
<>,{,} | Nothing