追加还是追加?要看


23

明天将迎来一岁高龄!为了纪念它的生日,我们举办了一个PPCG风格的生日聚会,几个用户在其中发布与大脑flak相关的问题!帮助我们庆祝!:)


Brain-flak是我写的一种深奥的语言,其中所有命令都是方括号,并且所有方括号必须完全匹配。借用我自己的定义

  • 出于此挑战的目的,“括号”是以下任意字符:()[]{}<>

  • 如果左括号和右括号的顺序正确且其中没有字符,则将一对括号视为“匹配”

    ()
    []{}
    

    或者,如果其中的每个子元素也都匹配。

    [()()()()]
    {<[]>}
    (()())
    

    子元素也可以嵌套在几层深处。

    [(){<><>[()]}<>()]
    <[{((()))}]>
    
  • 仅在以下情况下,字符串才被视为“完全匹配”:

    1. 每个字符都是一个括号,

    2. 每对支架都有正确的打开和关闭支架,并且顺序正确

为了庆祝flask的第一个生日,今天的挑战是要采取一组不平衡的括号,并确定要使其成为有效flask所需的操作类型。

  • 例如,((不是有效的脑筋代码,但是如果我们附加))它,它将变为(()),它是完全平衡的,因此是有效的脑筋。这使得此输入可追加

  • 同样,>}无效,但是我们可以{<在make之前添加{<>},这是有效的。这使该输入成为可前置的

  • 一些输入稍微复杂一些。例如,)][({不能仅通过追加或前置来使之有效。但是可以通过在前面[(和后面添加来使它有效})]。因此,这种投入既是prependable追加

  • 最后,通过附加或前置的任何组合都不能使某些输入成为有效的大脑标志。例如,(>永远不能使之有效。(正在<创建<(>,并且正在)创建(>),这两个都无效)因此,此输入既不可添加也不可添加。

对于当今的挑战,您必须编写一个程序或函数,该程序或函数带有方括号,并确定该字符串是否为

appendable
prependable
both
neither

您可以选择用于每种情况的值。例如,输出1, 2, 3, 4,或'a', 'p', 'b', 'n',或1, 'foo', 3.1415, -17,等等。只要每个输出都是不同一致的,就可以了。你必须但是,明确指定哪种输出对应于哪种情况。

您可以以最方便的格式返回此值(例如,从函数返回,打印到STDOUT,修改参数,写入文件等)。

您可以假设输入永远不会是有效的大脑或空的。

例子

以下所有输入都是可添加的

))
(((()()())))}
)>}]
()[]{}<>)

这些都是可附加的

(({}{})
((((
([]()())(
{<<{

这些都是两个

))((
>()[(()){
>{

这些都不是

)(}
{(((()()()))>
[}
((((((((((>
((((((((((<>()]

像往常一样,这是,因此存在标准漏洞,并且以字节为单位的最短答案为胜!


这种挑战在脑筋急转弯中尤其困难,因此最大的布朗尼指向脑筋急转弯中的任何答案。:)


1
maximum brownie points我认为,提供最高的布朗尼积分和cookie不仅比布朗尼积分更能激发Brain-Flaking这一挑战,因为我认为在任何语言中这都不是琐碎的事情,更不用说Brain-Flak了。:P
暴民埃里克(Erik the Outgolfer)'17

仅供参考:所有两个测试都以方括号结尾,所有两个测试均以方括号结尾。
乔纳森·艾伦

2
我认为“两个”都是错误的术语。像绳子][不是追加了,一样没事可以追加可以使它有效。同样,它也不是先决条件。是...“不可插入”!您可以将其插入字符串以使整个有效Brainbrak有效。
orlp

是否已经平衡了琴弦?
小麦巫师

@wheatwizard平衡的字符串不会作为输入。You can assume that the input will never be valid brain-flak or empty.
DJMcMayhem

Answers:


6

果冻33 32 37 35 34 字节

发现的错误,可怕的修复+5个字节,更好的修复-2个字节,使用了Adnan的技巧,我在这里看到了-1个。

“({[<“)}]>”Z;@WœṣF¥/µÐLO‘&2µIṀ>0ȯQ

返回值:

prepends [2]
 appends [0]
    both [2,0]
 neither 1

(无效的输入会返回虚假结果,尽管有效的Brain-flack会返回[]。)

在线尝试!-一个测试套件(打印虚构的表示形式,因此20用于[2,0],并忽略包含any的行-)。


5

视网膜41 40 41字节

@MartinEnder节省了1个字节

+`\(\)|\[]|{}|<>

[]})>]+
1
\W+
0
...+
01

在线尝试!

  • 前置为 1
  • 附加为 0
  • 两者都是 10
  • 没有是 01

编辑

  • 获得1个字节来修复@Neil注意到的错误

[]})>]保存一个字节。
Martin Ender

@MartinEnder啊,因为字符集不能为空,谢谢!
Kritixi Lithos

例如,这不适用于所有非附加输入(][)。我认为更改101为可以将其固定为一个字节...+
尼尔

@Neil感谢注意到这个错误,我不知道是否有类似案件,Both以及
Kritixi LITHOS

不,我认为10是的唯一有效组合Both
尼尔,

3

批处理,337字节

@echo off
set/ps=
:g
set "t=%s:<>=%
set "t=%t:()=%
set "t=%t:[]=%
set "t=%t:{}=%
if not "%t%"=="%s%" set "s=%t%"&goto g
set "s=%s:<=[%
set s=%s:>=]%
set s=%s:(=[%
set s=%s:)=]%
set s=%s:{=[%
set s=%s:}=]%
:l
if %s:~,2%==]] set s=%s:~1%&goto l
:r
if %s:~-2%==[[ set s=%s:~,-1%&goto l
if not _%s:~2%==_ set s=[]
echo %s%

]前置输出,追加输出[][两者都输出[]


3

哈斯克尔115字节

编辑:

  • -7个字节:使用更多的防护措施。
(""#)
s#""=[s>"",1>0]
s#(c:d)|Just a<-lookup c$zip"([{<"")]}>"=(a:s)#d|(a:b)<-s=[1|a==c]>>b#d|0<1=take 1$s#d

在线尝试!

使用(""#) "))"。结果为:

[False,True]: needs nothing
[False]: prependable
[True,True]: appendable
[True]: both
[]: neither

怎么运行的

  • 选择输出编码,以便通过删除结果的第二个元素(如果有的话)来表示需要添加前缀,而通过删除所有元素来表示完全不匹配。
  • s#dd给定一个s预期的括号括起来的字符串/堆栈,解析剩余的字符串。
    • s#""行检查是否在字符串末尾找到了所有右括号,否则需要附加。
    • 的第一个分支 s#(c:d)检查下一个字符c是否为左括号,如果是,则将相应的右括号留在堆栈上以进行递归。
    • 否则,如果堆栈中包含右括号,则第二个分支将检查前一个是否匹配下一个字符,如果不匹配,则返回一个空列表而不是递归。
    • 最后,在最后一个分支中,堆栈为空,在递归之前,我们有一个不匹配的右括号,可以通过在前面加上前缀来固定。

2

Japt,44个字节

=Ue"%(%)|%[]|\{}|<>" ®c -1&2|1})f31 |UfD |Ug

产出 1两者的前置,3附加1331为两者都不是。

在线测试!一次验证所有测试用例。

怎么运行的

 =Ue"%(%)|%[]|\{}|<>" ®   c -1&2|1})f31 |UfD |Ug
U=Ue"%(%)|%[]|\{}|<>" mZ{Zc -1&2|1})f31 |UfD |Ug

                    // "(((()()())))}"  "([({}{})"    ">()[(()){"  "((((<>()]"
Ue"%(%)|%[]|\{}|<>" // Recursively remove all instances of "()", "[]", "{}", and "<>" from U.
                    // "}"              "(["          ">[{"        "((((]"
mZ{Zc -1&2|1}       // Replace each char Z with (Z.charCodeAt() - 1) & 2 | 1.
                    // "1"              "33"          "133"        "33331"
U=                  // Save the result in U.
f31 |UfD |Ug        // Match all instances of "31" and "13" (D = 13) and bitwise-OR the results with the first char.
                    // null|null|1      null|null|3   null|13|1    31|null|3
                    // 1                3             13           31
                    // Implicit: output result of last expression

2

PHP,137字节

for($c=1;$c;)$a=preg_replace("#<>|\(\)|\[\]|\{\}#","",$a=&$argn,-1,$c);echo($a=preg_replace(["#[]})>]+#","#[[{(<]+#"],[1,2],$a))<13?$a:0;

1 =>可附加,

2 =>前置,

12 =>两者,

0 =>都不

测试用例


“只要每个输出都是不同且一致的,就可以了”。两者似乎都没有一致的值。
Cyoce

@Cyoce现在是固定的
约尔格Hülsermann
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.