完成懒惰的括号


17

键盘上的括号已全部用完,我想尽可能避免使用它们。您的挑战是通过在每行之前和之后添加括号来平衡包含括号的行。

这类似于TI-Basic的自动括号和字符串闭包(即Output(1, 1, "Hello, World!)。它还可以保存程序中的宝贵字节!

输入示例:

This line has no parentheses
alert(Math.max(1, 2
1+1)*2).toString()
function() { alert('Hello, World!'); })(

示例(可能)输出:

This line has no parentheses
alert(Math.max(1, 2))
((1+1)*2).toString()
(function() { alert('Hello, World!'); })()

规格:

  • 对于每一行输入,

    • 根据需要在行的开头添加尽可能多的开放括号,并在行的末尾添加封闭括号以平衡行中的括号

      • “余额”的定义是:

        • ()行中的金额相同

        • 对于从字符串开头开始的每个子字符串,此子字符串的结束括号不得多于开头括号

          • 例如,(foo))(bar不平衡是因为(foo))闭括号比开括号多
    • 如果需要,可以添加多余的括号,如果这样会使代码更短

    • 您无需担心字符串文字或类似的东西,假设所有括号都需要平衡

  • 输出每行且括号括起来

这是,所以最短的代码(以字节为单位)将获胜!


你只是关心()括号,或者做其他括号{}[]<>,等需要考虑呢?
Digital Trauma 2014年

@DigitalTrauma Nope,只有()
门把手

你有测试用例吗?
彼得·泰勒

1
@Peter Yeah,他们就在岗位...
Doorknob

Answers:


21

GolfScript,23个字节

n/{"()"1/{.2$\-,*}%*n}/

我正在利用的漏洞是该裁决:

如果需要,可以添加多余的括号,如果这样会使代码更短

基本上,对于每一行,此代码都会计算该行上没有开头括号的字符数,并在该行之前添加许多额外的开头括号,然后对结尾括号进行相同的处理。这效率极低,但是可以确保输出线上的所有括号都平衡。

例如,给定输入:

This line has no parentheses
alert(Math.max(1, 2
1+1)*2).toString()
function() { alert('Hello, World!'); })(

该程序将输出:

((((((((((((((((((((((((((((This line has no parentheses))))))))))))))))))))))))))))
(((((((((((((((((alert(Math.max(1, 2)))))))))))))))))))
(((((((((((((((((1+1)*2).toString())))))))))))))))
(((((((((((((((((((((((((((((((((((((function() { alert('Hello, World!'); })()))))))))))))))))))))))))))))))))))))

附言 您也可以在线测试此代码


4
这让我想起了我以前用Lisp编程的时间。
塔科努特2014年

7

Perl,32 = 31 +1或73 = 72 +1(最小括号)

32 = 31 + 1:带有多余的括号

编辑:

  • 修复,括号现在用 y///
  • $a删除不必要的变量。
$_="("x y/)//.s|$|")"x y/(//|er

它与运行时开关-p(+1字节)一起使用。

测试文件input.txt

This line has no parentheses
alert(Math.max(1, 2
1+1)*2).toString()
function() { alert('Hello, World!'); })(
(foo))(bar
)))(((
((
))

命令行:

perl -p script.pl <input.txt

要么

perl -pe '$_="("x y/)//.s|$|")"x y/(//|er' <input.txt

结果:

This line has no parentheses
alert(Math.max(1, 2))
(((1+1)*2).toString())
(((function() { alert('Hello, World!'); })()))
(((foo))(bar))
((()))((()))
(())
(())

取消高尔夫:

该算法很简单,只需为每个找到的括号添加对应的括号。

$_ =                     # $_ is provided as input by switch `-p` and
                         # it is printed afterwards as output.
                         # y/X// is used to count the character 'X' in $_
    '(' x y/)//          # add opening parentheses for each closing parentheses
    . s|$|')' x y/(//|er # go right before the end of line and insert
                         # closing parentheses for each opening parentheses
                         # in the original string

73 = 72 + 1:添加最小值括号

该脚本仅添加最小括号即可获得平衡的输出。

$a=y/()//cdr;1while$a=~s/\(\)//g;$_=$a=~y/)(/(/dr.$_;s|$|$a=~y/()/)/dr|e

它与运行时开关-p(+1字节)一起使用。

perl -pe "$a=y/()//cdr;1while$a=~s/\(\)//g;$_=$a=~y/)(/(/dr.$_;s|$|$a=~y/()/)/dr|e" <input.txt

结果:

This line has no parentheses
alert(Math.max(1, 2))
((1+1)*2).toString()
(function() { alert('Hello, World!'); })()
((foo))(bar)
((()))((()))
(())
(())

取消高尔夫:

$a = y/()//cdr;            # filter parentheses and store in $a
1 while $a =~ s/\(\)//g;   # remove matching parentheses
$_ = $a =~ y/)(/(/dr . $_; # add missing opening parentheses at start of string
s|$|$a=~y/()/)/dr|e        # insert missing closing parentheses at end of string

81 = 80 + 1:添加最小括号

这是为平衡的输出添加最小括号数的较旧方法。

my($l,$r);s/[()]/($&eq")"&&($r&&$r--||++$l))||$r++/ger;$_="("x$l.$_;s/$/")"x$r/e

它使用Perl 5.14(由于使用了非破坏性替换修饰符)和运行时开关-p(+1字节)。

perl -p script.pl <input.txt

结果:

This line has no parentheses
alert(Math.max(1, 2))
((1+1)*2).toString()
(function() { alert('Hello, World!'); })()
((foo))(bar)
((()))((()))
(())
(())

取消高尔夫:

# The while loop is added by option "-p".
LINE:
while (<>) {

    # $_ contains the current line
    my ($l, $r); # initializes $l and $r (to undef/kind of indirect 0)
    # Modifiers for the following substitution of $_:
    # /g: process all parentheses
    # /e: evaluate code
    # /r: does not change the original input string $_ (Perl 5.14)
    s/[()]/
        # $& contains the matched parentheses
        # $r is a balance level counter; at the end $r contains
        #    the number of needed closing parentheses
        # $l is the number of needed opening parentheses;
        #    if $r would go negative, then an opening parentheses
        #    is missing and $l is increases and $r remains zero.
        (  
            $& eq ")" &&   # case ")"
            ($r && $r--    # close a parentheses group and update balance counter
                || ++$l)   # or update $l if an opening parentheses is needed
        )
        || $r++            # case "(": increase balance counter
    /ger;
    $_ = "(" x $l . $_;    # add opening parentheses at the begin of line
    s/$/")" x $r/e         # add closing parentheses before the line end

# the remainder is added by run-time switch "-p"
} continue {
    print or die "-p destination: $!\n";
}

2
哇,这几乎像是golfscript ;-)
Digital Trauma

@HeikoOberdiek您使用的第一个版本的perl是什么?由于'('x/\)/g总是等于'('... ,所以似乎在18.1上不起作用
Mouq 2014年

@Mouq:谢谢,现在固定使用y///而不是m//g计算括号。
Heiko Oberdiek

4

2.7 3:62个 60 58字节

while 1:s=input();c=s.count;print('('*c(')')+s+')'*c('('))

不是超级高尔夫,但你知道。如果我真的尝试过,我也许可以挤出更多的字节。

对于每一行,输出(*行中的数字),然后是行,然后是)*的数字(。如果我正确理解规则,则将始终提供有效的输出。

由于我的输入方式而导致抛出异常而退出。(输入始终是这些问题中的一个硬部分。)如果这是不可接受的,则将花费我几个字节来修复,尽管我不确定是多少个字节。

输出示例:

This line has no parentheses
alert(Math.max(1, 2))
(((1+1)*2).toString())
(((function() { alert('Hello, World!'); })()))

这似乎不接受多行输入,即,打印点缀在输入行中。但是很好的算法思想,我没想到;)
Doorknob

python2 balanced_parenthesis.py < input.txt 2>/dev/null获取我编写的输出,但是如果您要以交互方式进行多行输入,则将花费我几个字节。给我一秒钟,我会想办法的......
undergroundmonorail

啊,好的,那没关系。那可行!
门把手

节省2个字符:while 1:s=raw_input();c=s.count;print'('*c(')')+s+')'*c('(')
贾斯汀

@qui哦,哇。我非常想知道这一点,但是我没有意识到你可以做到c=s.count。我想你不得不这样做c=ss.c()。谢谢!
地下单轨铁路

1

纯Bash,72个字节

使用与@undergroundmonorail的答案相同的算法:

while read a;do
o=${a//[!(]}
c=${a//[!)]}
echo ${c//)/(}$a${o//(/)}
done

输出:

$ ./lazyparens.sh < input.txt
This line has no parentheses
alert(Math.max(1, 2))
(((1+1)*2).toString())
(((function() { alert('Hello, World!'); })()))
$ 
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.