Questions tagged «stack»

对于涉及类堆栈数据结构的挑战(有关详细信息,请参见标签Wiki),包括基于栈的编程语言的解释器以及专门针对调用栈的挑战。

30
产生堆栈溢出的最奇怪的方法
作为程序员,您当然知道由于明显的递归而导致的堆栈溢出错误。但是,当然有很多怪异和不寻常的方法可以使您喜欢的语言吐出该错误。 目标: 必须引起堆栈溢出,该堆栈溢出在错误输出中清晰可见。 不允许使用明显的递归。 无效程序的示例: // Invalid, direct obvious recursion. methodA(){ methodA(); } // Invalid, indirect, but obvious recursion. methodA(){ methodB(); } methodB(){ methodA(); } 最有创意的方式是最好的,因为这是一场人气比赛。也就是说,避免无聊的答案是这样的: throw new StackOverflowError(); // Valid, but very boring and downvote-deserving. 即使我现在接受了答案,也可以添加更多答案:)

30
实现堆栈
我不敢相信我们还没有这个。.它是编程中最重要的数据结构之一,但仍然足够简单,可以在代码高尔夫球中实现: 挑战 您的任务是实现允许压入和弹出数字的堆栈,以测试实现并保持I / O简单,我们将使用以下设置: 输入将是非负整数列表 每个正整数表示一个,每个表示一个 -丢弃顶部元素。push( n ) 0 pop()ñnn推( n)push(n)\texttt{push(}n\texttt{)}000pop()pop()\texttt{pop()} 输出将是结果堆栈 例 例如,如果我们得到:[ 12 ,3 ,0 ,101 ,11 ,1 ,0 ,0 ,14 ,0 ,28 ][12,3,0,101,11,1,0,0,14,0,28][12,3,0,101,11,1,0,0,14,0,28] 1230101111个0014028[ 12 ][ 3 ,12 ][ 12 ][ 101 ,12 ][11,101,12][1,11,101,12][11,101,12][101,12][14,101,12][101,12][28,101,12]12[12]3[3,12]0[12]101[101,12]11[11,101,12]1[1,11,101,12]0[11,101,12]0[101,12]14[14,101,12]0[101,12]28[28,101,12] \begin{aligned} & 12 & [12] \\ & 3 & [3,12] \\ …

30
这个数字是-2的整数次幂吗?
有很多聪明的方法来确定数字是否为2的幂。这不再是一个有趣的问题,因此让我们确定给定的整数是否为-2的整数次幂。例如: -2 => yes: (-2)¹ -1 => no 0 => no 1 => yes: (-2)⁰ 2 => no 3 => no 4 => yes: (-2)² 规则 您可以编写程序或函数,并使用接收输入和提供输出的任何标准方法。 您的输入是一个整数,如果该整数是-2的整数次幂,则输出必须是一个真实值,否则,则必须是一个虚假值。不允许其他输出(例如警告消息)。 通常的整数溢出规则适用:您的解决方案必须能够在语言的假设(或实际)版本中使用任意大整数,默认情况下,所有整数都是无界的,但是如果您的程序由于实现而在实践中失败不支持大整数,这不会使解决方案无效。 您可以使用任何编程语言,但是请注意,默认情况下,这些漏洞是禁止的。 获奖条件 这是一场代码高尔夫球比赛:字节数最少(在您选择的编码中)的答案是获胜者。

8
涂每个薄煎饼
您的盘子上有一叠煎饼,上面有一团糖浆,厚得不能从侧面流下来。在每个薄煎饼的两面都至少接触到糖浆之前,您不会高兴地进食,但目前只有顶部薄煎饼的一面可以食用。 您知道糖浆甚至不会浸透一个煎饼,但可以通过两个煎饼之间的面对面接触来无限期地转移糖浆。薄煎饼的表面接触糖浆后,将被视为永远涂有糖浆,并且任何未接触糖浆的表面也将被制成糖浆涂层。也可以将糖浆转移到板的顶侧或从板的顶侧转移。 通过将锅铲插入一个或多个煎饼下面,然后将它们全部翻转,您可以像在煎饼分选过程中一样,用糖浆在煎饼的每个表面上涂抹糖浆。(不幸的是,这把锅铲是抗糖浆的,并且不能通过触摸煎饼表面来帮助分配糖浆。)可悲的是,您无法知道哪些煎饼表面已经接触了糖浆,但是您确实记得已经进行了翻转。 考虑到您过去的情况,您可以确定煎饼是否已经全部涂上糖浆了吗? 挑战 编写一个程序,该程序将薄煎饼的数量取为正整数N,并为迄今为止进行的翻转提供一个正整数列表(所有<= N)。列表中的每个数字代表被翻转的煎饼的数量。如果薄煎饼已经涂好,则输出真值,否则输出假值。(真实/虚假定义) 输入应来自stdin或命令行,输出应进入stdout(或最接近的替代品)。如果您的输入需要一些额外的格式,那就很好了:例如,[1, 1, 2, 2]而不是1 1 2 2列表。 例子 假设N = 2,那么我们在盘子上有一叠两个薄煎饼,从顶部的糖浆开始。 如果列表为1 1 2 2,则表示我们... 翻转顶部煎饼-覆盖底部煎饼的上表面 再次翻转顶部-在顶部煎饼的原始底面上涂上一层 同时翻转-涂板 再次翻转两者-在底部薄煎饼的原始底面上涂上一层 由于所有四个面都被覆盖,因此输出将类似于True或1。 如果列表为1 2 2 1,则表示我们... 翻转顶部煎饼-覆盖底部煎饼的上表面 翻转两个-不涂任何东西 再次翻转两者-无涂层 再次翻转顶部-在顶部煎饼的原始底面上涂上一层 由于接触板的表面仍然不含糖浆,因此输出将类似于False或0。 笔记 翻转列表可以任意大,可以为空,在这种情况下,输出是虚假的。 该板充当糖浆载体,但是是否被包被都无关紧要。(实际上,任何翻转溶液都会覆盖该盘子,因为必须覆盖它碰到的煎饼面,但无论如何。) 该板不能翻转。 您可以假设这些煎饼是单位圆盘,没有面可言,只有两个相对的面。 计分 这是代码高尔夫球。以字节为单位的最短解决方案获胜。
35 code-golf  stack 

8
验证河内塔解决方案
如果你不知道 河内塔是,我将简要解释一下:三根杆和一些圆盘的尺寸各不相同。最初,所有光盘都按顺序排列在第一塔上:最大的光盘在底部,最小的光盘在顶部。目的是将所有圆盘移至第三杆。听起来容易吗?要注意的是:您不能将光盘放置在比另一张光盘小的光盘上。您一次只能拿一个光盘将它们移动到另一根棒上,并且您只能将光盘放在棒上,而不是放在桌子上,这是一个卑鄙的混蛋。 ascii示例解决方案: A B C | | | _|_ | | __|__ | | A B C | | | | | | __|__ _|_ | A B C | | | | | | | _|_ __|__ A B C | | | | | _|_ | | …
29 code-golf  stack 

5
接受还是保留:计算机游戏展
内容: 一位隐居的亿万富翁创建了一个游戏节目来吸引世界上最优秀,最聪明的程序员。在星期一的午夜时分,他从一组申请人中选择一个人作为本周的竞赛者,并为他们提供游戏。您是本周的幸运选手! 本周比赛: 主机为您提供对10,000个数字信封堆栈的API访问。这些信封是随机排序的,并在其中包含1美元到10,000美元之间的美元价值(没有两个信封包含相同的美元价值)。 您可以使用3个命令: Read():读取堆栈顶部信封中的美元图形。 Take():将信封中的美元数字添加到游戏节目钱包中,然后将信封弹出堆栈。 Pass():弹出堆栈顶部的信封。 规则: 如果在信封上使用Pass(),则其中的钱将永远丢失。 从那时起,如果在包含$ X的信封上使用Take(),则永远不要在包含<$ X的信封上使用Take()。这些信封之一上的Take()将为您的钱包增加$ 0。 编写算法,以最大的金额完成游戏。 如果您正在使用Python编写解决方案,请随意使用此控制器来测试算法,这由@Maltysen提供:https://gist.github.com/Maltysen/5a4a33691cd603e9aeca 如果使用控制器,则无法访问全局变量,只能使用3个提供的API命令和局部作用域变量。(@Beta衰变) 注意:在这种情况下,“最大值”表示N> 50运行后您钱包中的中间值。我希望,尽管我很乐意被证明是错误的,但是当N增加到无穷大时,给定算法的中值将收敛。可以随意尝试最大化均值,但我有一种感觉,即平均数比中位数更容易被小N抛弃。 编辑:将信封数更改为10k,以便于处理,并使Take()更明确。 编辑2:鉴于有关meta的帖子,奖赏条件已被删除。 当前高分: PhiNotPi-$ 805,479 Reto Koradi-$ 803,960 丹尼斯-$ 770,272(修订版) Alex L.-$ 714,962(修订本)

8
打高尔夫球的Flak整型
整数很难用Brain-Flak表示。有8个运算子: () Evaluates to 1, but does not push anything on any stack [] Evaluates to an indeterminate value for the purposes of this question {} Removes the top of the stack and evaluates to it <> Switches to or back from the alternate stack and evaluates to zero (foo) …

12
翻转煎饼
在煎饼分类中,唯一允许的操作是反转序列中某些前缀的元素。或者,考虑一下一叠煎饼:我们将锅铲插入堆栈中的某个位置,然后将所有煎饼翻转到锅铲上方。 例如,6 5 4 1 2 3可以通过首先翻转第一个6元素(整个序列),产生中间结果3 2 1 4 5 6,然后翻转第一个3元素,得出来对序列进行排序1 2 3 4 5 6。 由于只有一个操作,因此整个排序过程可以由一系列整数描述,其中每个整数都是要包含pr flip的元素/煎饼的数量。对于上面的示例,排序顺序为6 3。 另一个例子:4 2 3 1可以用排序4 2 3 2。这是中间结果: 4 2 3 1 flip 4: 1 3 2 4 flip 2: 3 1 2 4 flip 3: 2 1 3 4 flip …

3
满天星斗的星际高尔夫
Starry是一种有趣的深奥编程语言,其中的代码仅+*.,`'由每个字符所代表的实际命令由其前面的空格数确定。即使对于高尔夫球的固定输出挑战,这也使它变得棘手,因为不同的命令可以占用非常不同的字节数。特别是,数字文字具有一元表示形式,因此有必要通过对较小的数字进行运算来建立较大的数字。 因此,这个挑战是关于编写可以打高尔夫球这样的Starry程序的程序。 星空如何运作? (在esolangs上未指定一些细节,因此我将继续使用Ruby解释器的行为。) Starry是一种基于堆栈的语言,具有一堆任意精度的整数值(最初为空)。 唯一有意义的字符是: +*.,`' 和空格。所有其他字符将被忽略。每个空格序列后跟那些非空格字符之一代表一条指令。类型指令的依赖于非空格字符和数字的空格。 这些说明是: Spaces Symbol Meaning 0 + Invalid opcode. 1 + Duplicate top of stack. 2 + Swap top 2 stack elements. 3 + Rotate top 3 stack elements. That is, send the top stack element two positions down. [... 1 2 3] …
25 metagolf  stack  starry 

19
评估Dotty字符串
编写一个程序,接收仅包含字符.和的奇数长度的字符串:。借助最初为空的堆栈,从该字符串生成一个数字,如下所示: 对于字符串中的每个字符c(从左到右)... 如果c是.并且堆栈中的元素少于2个,则将1推入堆栈。 如果c是.并且堆栈中有2个或更多元素,请从堆栈中弹出两个顶部值,并将它们的和推入堆栈中。 如果c是:并且堆栈中的元素少于2个,则将2推入堆栈。 如果c为:且堆栈具有2个或多个元素,请从堆栈中弹出两个顶部值,然后将其乘积推入堆栈。 结果数字是堆栈顶部的值。您的程序应将此编号打印到标准输出(带有可选的尾随换行符)。 (少量分析表明,除非字符串的长度为偶数,否则将仅剩一个数字,这就是我们忽略这些数字的原因。实际上,堆栈中最多不会包含2个元素。) 例如,数字为::...:.:.9: 2 1 2 2 /______ stack just after the character below is handled 2 2 4 4 5 5 7 7 9 \ : : . . . : . : . <-- string, one character at a time 为了进行完整性检查,以下是所有长度为1、3和5的字符串的数字: . …

3
烧饼问题
这项挑战与翻转薄煎饼有关。 您可能听说过煎饼分类,将一叠煎饼按大小分类,方法是将锅铲插入堆栈中,然后将所有煎饼翻转到锅铲上方,直到煎饼在盘上从最小到最大被分类。煎饼烧焦的问题略有不同。现在,所有薄煎饼的一面都被烧过,一旦分类完成,每个薄煎饼的烧过的一面必须面对盘子。 例如,给定以下堆栈(左侧的煎饼大小。右侧0为糊状,右侧1为糊状): 1 0 3 1 2 1 您可以翻转整个堆栈以获取20 30 11,翻转前两个31 21 11堆栈以获取10 20 30,然后再次翻转整个堆栈以获取,是一叠烧焦的煎饼。翻转3,翻转2,翻转3的移动顺序可以表示为3 2 3。 挑战 给定一组煎饼的大小(不一定是唯一的)和它们的方向,输出任何有效的烧饼分类顺序,即一系列翻转,导致从薄饼到烧饼的面朝下从最小到最大的顺序排列。 输入和输出可以是任何带有分隔符的理智的格式,但是请指定要使用的格式,并指出输入格式的哪一端是堆栈的顶部(TOS)。 允许翻转零煎饼。 允许在输入/输出中混合分隔符。 测试用例 对于以下所有测试用例,输入是一个列表,输出是一个用空格分隔的字符串,TOS在左侧。 [[1, 0], [3, 1], [2, 1]] "3 2 3" [[5, 1], [3, 0], [4, 1], [2, 1], [1, 0]] "5 3 4 1 3 2 …

5
StickStack编号
StickStack是一种非常简单的基于堆栈的编程语言,只有两条指令: | 将堆栈长度推到堆栈上 -从堆栈中弹出前两个元素,然后将它们的差值推回(second topmost - topmost) 语言细节 程序开始时堆栈为空。 所有指令从左到右依次执行。 如果堆栈中的数字少于2,则该-指令是非法的。 在执行结束时,堆栈应恰好包含一个数字。 StickStack程序可以生成任何整数。例如: |||--||-- generates the number 2 through the following stack states: [] [0] [0, 1] [0, 1, 2] [0, -1] [1] [1, 1] [1, 1, 2] [1, -1] [2] 要评估您的StickStack代码,您可以使用此在线(CJam)评估程序。(感谢@Martin提供的代码。) 任务 您应该编写一个给定整数值作为输入输出的程序或函数,或者返回一个代表输出给定数字的StickStack程序的字符串。 计分 您的主要得分是以下给定测试用例的StickStack程序的总长度。分数越低越好。 仅当您在所有测试用例上运行了程序并计算了分数时,您的提交才有效。 您的次要(抢七)得分是生成程序或函数的长度。 输入测试用例 (每个数字都是不同的测试用例。) …

6
河内塔排序
编写一个函数/子例程以对整数列表(河内塔式)进行排序。 您将获得一堆整数。这是主堆栈。 您还将获得另外两个帮助程序堆栈。但是,这些帮助程序堆栈具有一个独特的属性:每个元素必须小于或小于其下面的元素的大小。主堆栈没有这种限制。 您的任务是对主堆栈进行排序,将最大的整数放在下面。您的函数/子例程将返回(或等效)它在对堆栈进行排序时执行的移动次数。 注意:您必须在适当的位置对主堆栈进行排序,而不能在另一个堆栈上进行排序并调用答案。但是,如果由于某种原因而不能这样做,则可以模拟可变堆栈,但是请记住,这是河内塔之类的;只有3个钉子,只有1个钉子可能是无序的。 您的函数/子例程可以随时检查任何堆栈,但是只能通过弹出和推入进行移动。一招是从一个堆栈弹出到另一个堆栈的弹出。 测试前6个自然数的每个排列的函数/子例程。换句话说,测试您的函数/子例程{1},{2},...,{6},{1,1},{1,2},...,{1,6},{2,1},...是否可用(这应该是总数或可能性(由于霍华德纠正了我的数学运算))。移动元素最少次数的函数/子例程获胜。61+62+...+6655986

7
解释> <>(鱼)
虽然&gt; &lt;&gt;不是流行的语言,但它可能对打高尔夫球很有用,并且已在本网站上使用。它受到Befunge的启发,在指令上有一些相似之处。 所需命令: &gt; &lt; ^ v 更改指令指针的方向(右,左,上,下) / \ | _ # 。指针将根据其已有的方向改变方向。 x 随机方向。 + - * , % 加法,减法,乘法,除法和模。将A和B弹出堆栈,然后将B运算符A推入。除以0会引发错误。 0-9 a-f 将相应的值压入堆栈。a = 10,...,f = 15 = 从堆栈中弹出A和B,如果B = A,则按1,否则按0。 ) 比...更棒。将A和B弹出堆栈,如果B &lt;A ( 小于,则按1 。将A和B弹出堆栈,如果B&gt; A ' " 启用字符串解析,则按1 。字符串解析将找到的每个字符推入堆栈,直到找到结束引号为止。 ! 跳过以下说明。 ? 如果堆栈顶部为零或堆栈为空,则跳过以下指令。(注意:这不会从堆栈中弹出任何东西!) : 复制堆栈中的最高值。 …

7
接受或放弃II:计算机游戏展
这是我将在每个星期一PST午夜发布的一系列难题中的第二个。第一个难题位于此处。 内容: 一位隐居的亿万富翁创建了一个游戏节目来吸引世界上最优秀,最聪明的程序员。在星期一的午夜时分,他从一组申请人中选择一个人作为本周的竞赛者,并为他们提供游戏。您是本周的幸运选手! 本周比赛: 主机为您提供对10,000个数字信封堆栈的API访问。这些信封是随机排序的,并在其中包含1美元到10,000美元之间的美元价值(没有两个信封包含相同的美元价值)。 您可以使用4个命令: Read():读取堆栈顶部信封中的美元图形。 Take():将信封中的美元数字添加到游戏节目钱包中,然后将信封弹出堆栈。 Pass():弹出堆栈顶部的信封。 Oracle(M):返回堆栈中接下来的M个信封的平均值,不包括您当前可以读取的信封的平均值。 规则: 如果在信封上使用Pass(),则其中的钱将永远丢失。 从那时起,如果在包含$ X的信封上使用Take(),则永远不要在包含&lt;$ X的信封上使用Take()。这些信封之一上的Take()将为您的钱包增加$ 0。 如果您在回合T上使用Oracle(M),则将返回信封T + 1到T + M的均值。禁用Oracle(),直到T + M。 编写算法,以最大的金额完成游戏。 如果您使用Python编写算法,请随时使用@Maltysen提供的此控制器:https ://gist.github.com/livinginformation/70ae3f2a57ecba4387b5 注1:在这种情况下,“最大值”表示N&gt; = 1000后运行的钱包中的中间值。我希望,尽管我很乐意被证明是错误的,但是当N增加到无穷大时,给定算法的中值将收敛。可以随意尝试最大化均值,但我有一种感觉,即平均数比中位数更容易被小N抛弃。 注意2:由于此难题前一部分的所有解决方案在这里均有效,因此重新发布它们几乎没有价值。第二部分仅考虑对先前难题的算法改进。 编辑:鉴于此帖子在meta上,所以奖金条件已被删除。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.