게으른 괄호 마무리


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!'); })()

사양:

  • 각 입력 줄에 대해

    • 줄에서 괄호의 균형을 맞추는 데 필요한만큼 열린 괄호를 시작 부분에 추가하고 닫는 괄호를 줄 끝에 추가하십시오

      • "balance"의 정의는 다음과 같습니다.

        • 의 동일한 금액 () 라인에

        • 문자열의 시작 부분부터 시작하는 모든 하위 문자열에 대해이 하위 문자열에는 여는 괄호보다 더 많은 닫는 괄호가 없어야합니다

          • 예를 들어 여는 괄호보다 닫는 괄호가 더 많으 (foo))(bar므로 균형이 맞지 않습니다.(foo))
    • 원하는 경우 코드를 더 짧게 만드는 경우 불필요한 괄호를 추가 할 수 있습니다

    • 문자열 리터럴이나 그와 비슷한 것에 대해 걱정할 필요가 없습니다. 모든 괄호는 균형이 필요하다고 가정합니다.

  • 괄호가 균형을 이루고 각 줄을 출력하십시오.

이것은 이므로 바이트 단위의 가장 짧은 코드가 이길 것입니다!


당신은 단지에 관심을 ()다른 괄호는 괄호, 또는 할 {}, [], <>, 등의 필요가 아니라 간주?
Digital Trauma

@DigitalTrauma 아니, 단지 ().
Doorknob

테스트 사례가 있습니까?
피터 테일러

1
@ 피터 그래, 그들은 게시물에 바로 거기에 있습니다 ...
Doorknob

답변:


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에서 프로그래밍 할 때를 생각 나게한다. 괄호 안에 몇 비트의 코드가 없어졌다.
Taconut

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 첫 번째 버전에 어떤 펄을 사용하고 있습니까? '('x/\)/g항상 '('... 로 인해 18.1에서 작동하지 않는 것 같습니다 .
Mouq

@ Moq : 감사 합니다. 괄호를 계산하는 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

아, 그럼 괜찮아 작동합니다!
Doorknob

2 개의 문자 저장 :while 1:s=raw_input();c=s.count;print'('*c(')')+s+')'*c('(')
Justin Justin

@qui 아, 와우. 나는 그것을 알아내는 데 너무 가까이 왔지만 당신이 할 수 있다는 것을 몰랐습니다 c=s.count. 나는 당신이 할 줄 알았는데 c=s, s.c(). 감사!
undergroundmonorail

1

순수한 배쉬, 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!'); })()))
$ 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.