Questions tagged «stack»

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

5
少许泡菜
Python的pickle模块用于序列化,允许人们以一种可以以后重建的方式转储对象。为此,pickle使用了一种简单的基于堆栈的语言。 为简单起见,我们将处理这种语言的一小部分: ( Push a mark to the stack S'abc'\n Push a string to the stack (here with contents 'abc') l Pop everything up to the last mark, wrapping all but the mark in a list t Pop everything up to the last mark, wrapping all but the mark in …

1
翻译前奏曲
这是每周挑战2。主题:翻译 编写一个程序或函数,该程序或函数在Prelude中获取程序的源代码,并在Befunge-93中输出等效程序的代码。为了使程序等效,对于任何给定的输入,它都应产生与Prelude程序相同的输出,并且仅当Prelude程序停止时才停止。 输入语言:前奏 Python解释器: 显示代码段 #!/usr/bin/python import sys NUMERIC_OUTPUT = True NUMERIC_INPUT = True try: filename = sys.argv[1] except: print "Usage:", sys.argv[0], "<filename>" raise SystemExit try: inFile = file(filename) except: print "Error when opening", filename raise SystemExit # code is kept as a list of voices, each voice a string …

8
写一个脑力激荡的经典口译员!
Brain-Flak(Brainf ** k和Flak-Overstow之间的交叉)是一种基于堆栈的深奥语言。自发布此挑战以来,该语言已得到发展和更新,但是该语言的第一个修订版被称为“经典大脑”。 您必须编写一个程序或函数,该程序或函数需要一串Brain-Flak经典代码并对其进行评估。它还将使用(可能为空)整数列表。有Brain-Flak经典程序的输入。 语言 Brain-Flak具有两个堆栈,分别称为“左”和“右”。活动堆栈从左侧开始。如果弹出或查看一个空堆栈,它将返回0。没有变量。程序启动时,每个输入将按顺序推入活动堆栈(以便最后一个输入位于堆栈顶部)。 Brain-Flak程序中唯一有效的字符是()[]{}<>,并且必须始终保持平衡。如果有无效字符,或者括号不匹配,则会出现不确定的行为。任何有效的东西。 函数有两种类型:Nilads和Monads。一个nilad是一个函数,0参数。这是所有的尼拉德人: () +1。 [] -1。 {} 弹出活动堆栈。 <> 切换活动堆栈。 在评估它们时将它们串联在一起。因此,如果我们在活动堆栈的顶部有一个“ 3”,则此代码段: ()(){} 将评估到1 + 1 + active.pop()将评估为5。将<>评估为0。 单子组采用一个参数,即一大堆Brain-Flak代码。这是所有单子: (n) 在活动堆栈上按“ n”。 [n] 将'n'打印为int和换行符。 {foo}当active.peek()!= 0时,执行foo。评估为0¹。 <foo> 执行foo,但将其评估为0。 这些函数还将返回它们内部的值,因此 (()()()) 将推3和 [()()()] 将打印3但 [(()()())] 将打印并推送3。 当程序执行完毕后,活动堆栈上剩余的每个值都将打印为整数,并在其之间使用换行符。其他堆栈上的值将被忽略。 规则: 您的程序必须支持(-128,127)范围内的数字,并且堆栈大小至少为255。如果支持更大,则更好。 下溢/上溢未定义。 样本IO: 空程序: 输入:无 输出:无 加成。资源: …

10
这就是我们滚动的方式
出于多种原因,Piet是一种有趣的编程语言。今天,我们将集中讨论一个原因:roll命令。roll命令最初来自PostScript,是一种操作堆栈的有效方法。 roll命令弹出堆栈的顶部两个元素,并将它们用作参数。我们将第一个弹出turns的值称为第二个值depth。转到深度n将占据堆栈的最顶部元素,使其成为堆栈中的第n个元素,并将其上方的每个元素向上移动一个。如果turns 为负,则朝相反方向进行。也就是说,第n个元素移到顶部,而其他元素下移。这是重复的abs(turns)次数。 挑战 编写一个程序或函数,该程序或函数接受堆栈并在执行滚动后返回该堆栈。 规则 输入和输出可以是列表,数组,带定界符的字符串,一次传入一个元素或任何其他合理格式。输出必须与输入具有相同的格式。 depth 永远不会为负,也永远不会大于堆栈的长度。 输入堆栈将始终包含至少两个元素。 这是代码高尔夫球,因此每种语言中最短的答案将获胜。因此,我不会接受答案。 禁止出现标准漏洞。 测试用例 in: out: 2 4 1 3 2 4 3 1 4 2 5 5 6 6 in: out: -2 3 1 2 2 3 3 1 in: out: -42 0 1 1 2 2 3 3 4 …
18 code-golf  stack 

17
构建不存在的语言的解释器
为假的,基于堆栈的语言构建解释器,该解释器获取输入,解释输入并将结果输出为数字数组。它应该遍历每个字节并根据此表执行不同的功能: 0000(0):串联(将堆栈中的前两个数字组合起来,就好像它们是字符串一样。例如:12,5-> 125) 0001(1):递增(在堆栈顶部的数字加1) 0010 (2):递减(从堆栈顶部的数字减去一个) 0011(3):乘以(堆栈的顶部两个数字相乘) 0100(4):除(将第二个到顶部的数字除以在堆栈顶部的数字) 添加(添加顶部的堆栈两个数字上):0101(5) 0110(6):减去(减去栈顶的数目从所述一个在其下方) 0111(7):指数(计算从小数到小数到大数的乘方) 1000(8):模数:(以小数为模,找到从小到大的数) 1001(9):向右旋转(将堆栈向下移动一格。底部的数字现在位于顶部) 1010(A):向左旋转(将堆栈向上移动一格。顶部的数字现在位于底部) 1011(B):复制(复制最上面的数字,以便它出现两次。例如:4,1变成4,1,1) 1100(C):双重复制(复制堆栈上的最上面的两个数字。ex :4, 1,2变成4,1,2,1,2) 1101(D):交换(交换堆栈中的前两个数字。例如:4,1,2变成4,2,1) 1110(E):双交换(交换最上面的两个数字,下面两个交换。例如:1,2,3,4,5变成1,4,5,2,3) 1111(F):删除/弹出(删除上面的数字堆栈) 例如,包含 1 1 BC 5 C 5 B 9 5-输入(十六进制) | | | | | | | | | | 1 2 2 2 4 4 6 6 2 …

15
帮助我的儿子找到他的信
背景 基于我四岁的孩子从他的拉比那里得到的游戏。 “目标”是按给定顺序(例如)“查找”字母aecdb。会给您一堆字母卡片,例如daceb。您只能按给定的顺序搜索堆栈,尽管是循环的。遇到需要的信件时,可以将其取出。 目的 给定一个顺序和一个堆栈(彼此无重复排列),找到在玩游戏时看到的最高堆栈字母的序列(都是可打印的ASCII)。 分步示例 aecdb给定堆栈,我们需要找到订单daceb: 栈顶d:不是我们想要的(a),因此我们将其添加到序列:中d并旋转以获取栈:acebd。 堆栈顶部a:是的!因此我们将其添加到序列中:da并将其从堆栈中删除:cebd。 栈顶c:不是我们想要的(e),因此我们将其添加到序列:中dac并旋转以获取栈:ebdc。 堆栈顶部e:是的!因此我们将其添加到序列中:dace并将其从堆栈中删除:bdc。 栈顶b:不是我们想要的(c),因此我们将其添加到序列:中daceb并旋转以获取栈:dcb。 栈顶d:不是我们想要的(c),因此我们将其添加到序列:中dacebd并旋转以获取栈:cbd。 堆栈顶部c:是的!因此我们将其添加到序列中:dacebdc并将其从堆栈中删除:bd。 栈顶b:不是我们想要的(d),因此我们将其添加到序列:中dacebdcb并旋转以获取栈:db。 堆栈顶部d:是的!因此我们将其添加到序列中:dacebdcbd并将其从堆栈中删除:b。 堆栈顶部b:是的!因此我们将其添加到序列中:dacebdcbdb并将其从堆栈中删除:。 我们完成了。结果是dacebdcbdb。 参考实施 def letters(target, stack): string = '' while stack: string += stack[0] if stack[0] == target[0]: stack.pop(0) target = target[1:] else: stack.append(stack.pop(0)) return string print letters('aecdb', list('daceb')) 在线尝试! 测试用例 try,yrt→yrtyry 1234,4321→4321432434 ABCDEFGHIJKLMNOPQRSTUVWXYZ,RUAHYKCLQZXEMPBWGDIOTVJNSF→RUAHYKCLQZXEMPBWGDIOTVJNSFRUHYKCLQZXEMPWGDIOTVJNSFRUHYKLQZXEMPWGIOTVJNSFRUHYKLQZXMPWGIOTVJNSRUHYKLQZXMPWIOTVJNSRUYKLQZXMPWOTVNSRUYQZXPWOTVSRUYQZXPWTVSRUYQZXWTVSRUYZXWTVSUYZXWTVUYZXWVYZXWYZXYZ …

4
实际上是整数Metagolf
背景 实际上(Seriously的后继者)是我在2015年11月创建的基于堆栈的命令式高尔夫球语言。像许多其他高尔夫球语言一样,它具有一字节的命令,这些命令根据堆栈的内容执行不同的功能。它的特色之一是数学-它具有多种基于数学的命令。但是,为了执行数学运算,您必须将(一个或多个)数字放在堆栈上。因为有许多不同的选项,所以以尽可能少的字节来推送特定值是很棘手的。在此挑战中,您将确切地做到这一点:用尽可能少的字节数表示“数字”(特别是整数)。 挑战 给定一个整数N作为输入,输出有效的“实际”代码,导致N被压入堆栈。 输入将在32位有符号二进制补码整数(即包含在内的整数[-2147483648, 2147483647])范围内。 结果必须是整数(不是浮点数,字符串,列表或函数),并且必须在堆栈的顶部。 您可能不对堆栈的内容做任何假设(例如堆栈是否为空)。堆栈上的任何现有值都不得修改或重新排列。 实际上,在我撰写此挑战时,我使用了最新的提交。如果我进行了错误修复或性能增强(或任何其他不删除或更改允许的命令功能的较小更改),则将更新此版本。 您的解决方案必须至少与平凡的解决方案一样好(:在输入之前加上数字数值)。 您的分数将是平凡解的长度之和减去用于选择1000个32位带符号二进制补码整数(用于评分)的输出长度的总和,可以在下面找到。我保留在必要时随时更改得分整数的权利(例如针对测试用例进行优化或测试用例不够彻底)。 解决方案必须在30秒内为每个输入输出有效答案。定时将在标准的免费Cloud9工作区上完成。 指令 为简单起见,(当前)208个命令中仅可以使用141,并且那些与数字运算无关的141的许多重载已被删除。以下是允许的命令列表(格式为<hex code> (<symbol>): <descriptions of functions based on stack values and types>: 0B (♂): take the next command and map it over the top of the stack (for example, ♂A is equivalent to `A`M) 1F (▼): pop …

3
查找字符串中的模式
在这种挑战下,您的任务是找到具有给定结构的子字符串。 输入项 您的输入应为两个非空的字母数字字符串,一个模式 p和一个text t。这个想法是,的每个字符都p代表一个连续的非空子字符串,t该子字符串彼此相邻出现,并p表示它们的串联。相同的字符对应于相同的子字符串。例如,模式aa代表任何非空正方形(通过将较短的字符串与其自身连接而获得的字符串)。因此,模式aa可以匹配子字符串byebye,并且每次a匹配bye。 输出量 如果文本t包含p匹配的子字符串,则您的输出应为该子字符串,并:在与的字符相对应的字符串之间插入冒号p。例如,如果我们有t = byebyenow和p = aa,那么bye:bye它是可接受的输出。匹配子字符串可能有多个选择,但是您只能输出其中之一。 如果t不包含匹配的子字符串,则您的输出将是悲伤的表情:(。 规则和说明 的不同字符p可以对应相同的子字符串,因此p = aba可以匹配字符串AAA。请注意,这些字符必须对应于非空字符串;特别是,如果p长于t,则输出必须为:(。 您可以编写完整的程序或函数,还可以更改两个输入的顺序。最低字节数获胜,并且不允许出现标准漏洞。 测试用例 以格式给出pattern text -> output。注意,可能存在其他可接受的输出。 a Not -> N aa Not -> :( abcd Not -> :( aaa rerere -> re:re:re xx ABAAAB -> A:A MMM ABABBAABBAABBA -> ABBA:ABBA:ABBA x33x 10100110011001 -> 10:1001:1001:10 …
17 code-golf  string  code-golf  ascii-art  geometry  code-golf  ascii-art  code-golf  sequence  stack  code-challenge  number  sequence  answer-chaining  code-golf  code-challenge  math  combinatorics  binary-matrix  code-golf  number  code-golf  cryptography  bitwise  code-golf  sudoku  code-golf  brainfuck  metagolf  code-golf  probability-theory  number-theory  primes  fewest-operations  factoring  golf-cpu  code-golf  restricted-source  code-golf  graphical-output  sequence  binary  code-golf  tips  c#  code-golf  geometry  code-golf  graphical-output  fractal  code-golf  number  sequence  code-golf  number  array-manipulation  popularity-contest  game  board-game  code-golf  puzzle-solver  grid  code-golf  ascii-art  geometry  grid  tiling  code-golf  ascii-art  whitespace  balanced-string  code-golf  card-games  king-of-the-hill  javascript  code-golf  whitespace  balanced-string  code-golf  code-golf  math  abstract-algebra  code-golf  java  code-golf  interpreter  stack  code-golf  base-conversion  code-golf  tips  code-golf  ascii-art  geometry  brainfuck  metagolf  code-challenge  math  quine  code-generation  code-golf  number  kolmogorov-complexity  arithmetic  expression-building  code-golf  string  code-golf  quine  popularity-contest  code-golf  base-conversion  code-challenge  image-processing  code-golf  conversion  coding-theory 

6
最小的字节码解释器/ VM
页首横幅-已通过JIT编译(越低越好) es1024-81.2分(包括有效的编译器!) 基思·兰德尔-116点 病-121点 页首横幅-解读(越低越好) 马丁·布特纳(MartinBüttner)-706654点(大约2个小时左右)。 ip割-30379点(97秒) 您的任务(如果您选择接受)是编写尽可能小的字节码解释器/ VM。VM /解释器使用以下指定的语言使用小型CISC架构(操作大小可能有所不同)。完成后,必须打印3个CPU寄存器的值,以证明打印了正确的输出(3,126,900,366)。 编译器 如果您想进行自己的测试,请在下面发布编译器。随时发布答案。 显示代码段 window.compile=function(){var e=$("#text").val().toLowerCase().match(/[^\r\n]+/g);var t=[];for(var n=0;n<e.length;n++)compileLine(e[n],t);var r="";for(var n=0;n<t.length;n++)if(typeof t[n]=="string")r+="\n";else r+="0x"+t[n].toString(16)+" ";$("#compiledArray").val(r)};window.compileLine=function(e,t){var n=e.split(" ");if(n[0]=="load"){t.push(0);t.push(getInt(n[1]));t.pushArr(getInt(n[2]))}if(n[0]=="rload"){t.push(1);t.push(getInt(n[1]));t.push(getInt(n[1]))}if(n[0]=="push"){t.push(2);t.push(getInt(n[1]))}if(n[0]=="pop"){t.push(3);t.push(getInt(n[1]))}if(n[0]=="add"){t.push(4);t.push(getInt(n[1]));t.push(getInt(n[2]))}if(n[0]=="sub"){t.push(5);t.push(getInt(n[1]));t.push(getInt(n[2]))}if(n[0]=="mul"){t.push(6);t.push(getInt(n[1]));t.push(getInt(n[2]))}if(n[0]=="div"){t.push(7);t.push(getInt(n[1]));t.push(getInt(n[2]))}if(n[0]=="jmp"){t.push(8);t.pushArr(getInt(n[1]))}if(n[0]=="cmp"){t.push(9);t.push(getInt(n[1]));t.push(getInt(n[2]))}if(n[0]=="branchlt"){t.push(10);t.pushArr(getInt(n[1]))}if(n[0]=="brancheq"){t.push(11);t.pushArr(getInt(n[1]))}if(n[0]=="branchgt"){t.push(12);t.pushArr(getInt(n[1]))}if(n[0]=="branchne"){t.push(13);t.pushArr(getInt(n[1]))}t.push("NEW LINE")};window.getInt=function(e){if(e.trim().startsWith("<--"))return"COMMENT";if(e=="r0")return 0;if(e=="r1")return 1;if(e=="r2")return 2;if(e.startsWith("0x"))return parseInt(e,16);if(isNaN(parseInt(e)))alert(e);return getIntBytes(parseInt(e))};if(typeof String.prototype.startsWith!="function"){String.prototype.startsWith=function(e){return this.slice(0,e.length)==e}}Array.prototype.pushArr=function(e){this.push.apply(this,e)};window.getIntBytes=function(e){var t=[];var n=4;do{t[--n]=e&255;e=e>>8}while(n);return t} <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script> <textarea id="text" cols="40" rows="10"></textarea> <br/> <button onclick="compile()">Compile</button> <br/> <textarea id="compiledArray" cols="40" rows="10" readonly></textarea> …

2
压缩Befunge程序
Befunge是一种二维深奥的编程语言。基本思想是将(一个字符)命令放置在二维网格上。控制流遍历网格,执行传递过来的命令,并在命中箭头(>^<v)时更改方向。命令是基于堆栈的;看到这个清单。另请参见http://esolangs.org/wiki/Befunge。 提供Befunge-98的规格。 问题 编写一个程序,将Befunge程序转换为更紧凑的表示形式。例如,以下程序打印0: > 0 v > @ . ^ < 在这种情况下,可以通过删除空格行来压缩它而无需更改程序的行为,从而得到 >0v >@. ^ < 更复杂的转换可以旋转或镜像命令序列,并消除不必要的控制流命令以压缩程序。例如,使用此程序: >12345v 6 v....7< . . . @ 您可能会将程序的结尾塞进洞里: >12345v >...@ 6 ^....7< 对于第一个示例,最紧凑的程序是 >0.@ 您可以使用任何转换,只要输出程序给出的结果相同即可。 输入程序 输入程序是有效的Befunge-98程序。 您可以假设输入程序是确定性的。也就是说,它不使用读取外部状态的命令:用户输入命令&和~,随机化器?以及自修改代码命令p和g。 您可以假设输入程序终止。 计分 这不是代码高尔夫,而是编写执行代码高尔夫的程序的问题。 输入是一组测试用例(满足上述输入限制的Befunge程序)。总分是测试案例的总分。 每个测试用例的得分 分数是输出程序中非空单元格的凸包的面积,其中每个单元格都视为一个正方形,其四个角为笛卡尔平面中的晶格点。例如, > v @ < 获得9.5分。 如果您的程序在特定输入上没有在合理的时间和内存中终止,则得分为输入程序的得分。(这是因为您可以简单地添加一个限时包装程序,如果您的程序没有及时终止,则该包装程序将不变地输出输入程序。) 如果用您的程序处理后,测试用例程序具有不同的结果(或无法终止),则分数为输入程序的分数加100分的罚款。

5
蒙德里安绘画描述语言
挑战在于为Mondrian绘画描述语言(MPDL)编写解释器。 语言定义 该语言在矩形堆栈上运行。矩形由其左上坐标和右下坐标定义。坐标必须是整数。使用具有属性的单个矩形初始化堆栈(1,1,254,254) 每个命令具有以下格式: <character><integer> 有以下三个命令: v<integer>:在参数中指示的位置(以百分比表示)上对堆栈中的最新矩形执行垂直分割。将源矩形从堆栈中删除,并替换为拆分产生的两个新矩形。左边的矩形被压入堆栈,然后是右边的矩形。由于矩形坐标是整数,因此分数应四舍五入为最大的较小整数。 h<integer>:水平分割。顶部矩形被压入堆栈,然后底部矩形被压入堆栈。 c<integer>:从堆栈中删除最新的矩形,并将其绘制为参数指定的颜色。1 =白色,2 =红色,3 =蓝色,4 =黄色 挑战 编写一个程序,将绘制说明作为参数,并创建绘制矩形的256x256位图表示形式。矩形必须以3像素的黑线分隔。一个或两个像素矩形应使其非黑色像素被边框黑色像素隐藏。 输入可以作为参数或文件读取,由您决定。命令应以空格分隔。您可以假定输入文件的语法正确,并且没有尾部或前导空格,制表符等。输出可以直接显示在屏幕上,也可以保存到文件,由您自己决定。 最短的代码获胜。 测试 以下来源: v25 h71 v93 h50 c4 c1 c1 c2 h71 c3 h44 c1 c1 应产生红色,蓝色和黄色的成分II:

4
使用ASCII艺术图可视化长除法
编写一个程序,以可视化方式用ASCII艺术进行长除法。使用您选择的输入格式,输入由两个整数组成:分子和分母。 例子: 1234÷56: 22 ---- 56|1234 112 --- 114 112 --- 2 1002012÷12: 83501 ------- 12|1002012 96 --- 42 36 -- 60 60 -- 12 12 -- 0÷35 0 - 35|0 规则: 编程语言的除法运算符的用途是允许的。 也允许使用大整数支持。 为了保持一致: 如果商为零,则在跳水板的末端打印一个零。 如果余数为零,请不要打印。 不要在任何数字上打印前导零。 末尾多余的换行符和右边的尾随空格是允许的。 字符最少的解决方案获胜。 限制: 0 <=分子<= 10 72 - 1 1 <=分母<= 9999999 …

2
解决堆栈状态图
堆栈状态图显示了如何将一个堆栈上的值更改为另一个堆栈上的值。例如,这是一个堆栈状态图: 3 0 2 1 0 这意味着有一个堆栈最初包含3个值(3部分)。这些值的索引范围是0到2,顶部是0 2 1 0。下一部分0 2 1 0描述了堆栈的最终状态:最初位于堆栈顶部的值也已复制到背面。 这些转换发生在支持多种数据类型的堆栈上: “值”类型,最初是堆栈上的值。它可以是字符串,整数等,但是不需要知道其值。 “列表”类型,它是包含任何数据类型的值的列表。 为了对此转换建模,允许执行以下操作: S:交换堆栈顶部的两个值:2 1 0→2 0 1 D:将值复制到堆栈顶部:1 0→1 0 0 R:删除堆栈上的最高值。 2 1 0→2 1 L:将最高值变成包含该值的一元列表:2 1 0→2 1 (0) C:串联堆栈中的前两个列表:2 (1) (0)→2 (1 0) U:将列表中的所有值放入堆栈:2 (1 0)→2 1 0 这些等效于欠载命令~ : ! a …

4
解释StackyMath!
是时候实施我新的基于堆栈的语言了!它称为StackyMath。这将是一种基于堆栈的语言,在堆栈上有8种操作以及向堆栈中添加数字的方式。 操作清单: /:司。在堆栈的前2个数字上执行。将结果推回堆栈。 *:乘法。在堆栈的前2个数字上执行。将结果推回堆栈 -:减法。在堆栈的前2个数字上执行。将结果推回堆栈 +:加法。在堆栈的前2个数字上执行。将结果推回堆栈 ^:求幂。在堆栈的前2个数字上执行。将结果推回堆栈 %:模数。在堆栈的前2个数字上执行。将结果推回堆栈 !:阶乘。在堆栈上的最高编号上执行。将结果推回堆栈 D:复制堆栈上的最高编号 用伪代码定义的操作: /: push(pop divided by pop) *: push(pop times pop) -: push(pop minus pop) +: push(pop plus pop) ^: push(pop to the pop) %: push(pop mod pop) !: push(factorial pop) D: t = pop; push(t); push(t) 如何将数字压入堆栈: 将数字添加到堆栈很容易,只需将原始数字放在您需要的程序中即可。如果您需要在堆栈上放置多个数字,可以用逗号(,)分隔它们。您的程序将不需要处理-输入中的数字,如果用户想要一个数字,则应按想要取反的数字,然后按0和-。程序输入中的数字也限制为正整数。 输入: 您的程序应从命令行或从std …

12
所有人都说……
目标给定不包含字符[或的文本输入],请执行以下操作: 对于Amen具有至少一个大写字母的每个实例(因此,所有Amen不包含的实例amen),都输出相同的名称Amen(保留大写)。 对于/all the people said[?: ]/i(这是一个正则表达式)的每个实例,还输出Amen(任何情况都可以)。 在每个输出之后,您可以选择任何常量分隔符,例如换行符,空格或什么都不做。 这是一个代码高尔夫球,因此以字节为单位的最短程序获胜。 IO范例 Input: I said AMEN! AMEN, PEOPLE! Output: AMENAMEN ; any separator is fine, I choose none. Input: amen amen amen amen Output: ; nothing Input: ; empty Output: ; nothing Input: *blah blah blah* And all the people said? Output: …

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.