Kết thúc dấu ngoặc đơn lười biếng


17

Các dấu ngoặc trên bàn phím của tôi đều bị mòn và tôi muốn tránh sử dụng chúng càng nhiều càng tốt. Thách thức của bạn là cân bằng một dòng chứa dấu ngoặc đơn bằng cách thêm chúng vào trước và sau mỗi dòng.

Điều này tương tự như dấu ngoặc đơn tự động và đóng chuỗi của TI-Basic (nghĩa là Output(1, 1, "Hello, World!). Nó cũng lưu các byte quý từ một chương trình!

Ví dụ đầu vào:

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

Ví dụ (có thể) đầu ra:

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

Sự chỉ rõ:

  • Đối với mỗi dòng đầu vào,

    • Thêm càng nhiều dấu ngoặc đơn vào đầu và đóng dấu ngoặc đơn vào cuối dòng khi cần để cân bằng các dấu ngoặc trong dòng

      • Định nghĩa của "số dư" là:

        • Cùng một lượng ()trong dòng

        • Đối với mọi chuỗi con bắt đầu từ đầu chuỗi, chuỗi con này không được có nhiều dấu ngoặc đơn đóng hơn dấu ngoặc đơn mở

          • Ví dụ: (foo))(barkhông cân bằng vì (foo))có nhiều dấu ngoặc đơn đóng hơn là mở dấu ngoặc đơn
    • Bạn có thể thêm các dấu ngoặc đơn không cần thiết nếu bạn muốn, nếu nó làm cho mã của bạn ngắn hơn

    • Bạn không cần phải lo lắng về chuỗi ký tự hoặc bất cứ điều gì tương tự, giả sử rằng tất cả các dấu ngoặc đơn cần cân bằng

  • Đầu ra mỗi dòng có dấu ngoặc đơn cân bằng

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ giành chiến thắng!


Bạn chỉ cần quan tâm đến việc ()Parens, hoặc làm dấu ngoặc khác {}, [], <>, vv cần phải được coi là tốt?
Chấn thương kỹ thuật số

@DigitalTrauma Không, chỉ ().
Doorknob

Bạn có bất kỳ trường hợp thử nghiệm?
Peter Taylor

1
@Peter Vâng, họ ở ngay trong bài viết ...
Doorknob

Câu trả lời:


21

GolfScript, 23 byte

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

Lỗ hổng mà tôi khai thác là phán quyết rằng:

Bạn có thể thêm các dấu ngoặc đơn không cần thiết nếu bạn muốn, nếu nó làm cho mã của bạn ngắn hơn

Về cơ bản, đối với mỗi dòng, mã này sẽ đếm số lượng ký tự trên dòng không mở dấu ngoặc đơn và thêm vào đó là nhiều dấu ngoặc đơn mở thêm cho dòng và sau đó thực hiện tương tự để đóng dấu ngoặc đơn. Điều này cực kỳ không hiệu quả, nhưng đảm bảo rằng tất cả các dấu ngoặc trên dòng đầu ra được cân bằng.

Ví dụ, đưa ra đầu vào:

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

chương trình này sẽ xuất ra:

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

Thi thiên Bạn cũng có thể kiểm tra mã này trực tuyến .


4
Điều này nhắc nhở tôi khi tôi từng lập trình ở Lisp ... Một vài đoạn mã bị mất trong biển dấu ngoặc đơn.
Tacovy

7

Perl, 32 = 31 + 1 hoặc 73 = 72 + 1 (dấu ngoặc đơn được thu nhỏ)

32 = 31 + 1: có thêm dấu ngoặc đơn không cần thiết

Chỉnh sửa:

  • Sửa chữa, dấu ngoặc đơn bây giờ được tính với y///.
  • Biến không cần thiết $abị loại bỏ.
$_="("x y/)//.s|$|")"x y/(//|er

Nó được sử dụng với công tắc thời gian chạy -p(+1 byte).

Hồ sơ kiểm tra input.txt:

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

Dòng lệnh:

perl -p script.pl <input.txt

hoặc là

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

Kết quả:

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

Ung dung:

Thuật toán rất đơn giản, chỉ cần thêm đối tác cho mỗi dấu ngoặc đơn được tìm thấy.

$_ =                     # $_ 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: thêm số dấu ngoặc đơn tối thiểu

Tập lệnh này chỉ thêm số lượng dấu ngoặc đơn tối thiểu để có đầu ra cân bằng.

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

Nó được sử dụng với công tắc thời gian chạy -p(+1 byte).

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

Kết quả:

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

Ung dung:

$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: thêm số dấu ngoặc đơn tối thiểu

Đây là một phương pháp cũ hơn để thêm số lượng dấu ngoặc đơn tối thiểu cho đầu ra cân bằng.

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

Nó sử dụng Perl 5.14 (vì công cụ sửa đổi thay thế không phá hủy) và công tắc thời gian chạy -p(+1 byte).

perl -p script.pl <input.txt

Kết quả:

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

Ung dung:

# 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
Ồ, nó gần giống như bản golf ;-)
Chấn thương kỹ thuật số

@HeikoOberdiek Bạn đang sử dụng perl nào cho phiên bản đầu tiên? Nó dường như không hoạt động vào ngày 18.1 do '('x/\)/gluôn luôn cân bằng '(' ...
Mouq

@Mouq: Cảm ơn, đã sửa lỗi bằng cách sử dụng y///thay vì m//gđếm dấu ngoặc đơn.
Heiko Oberdiek

4

Python 2.7 3: 62 60 58 byte

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

Không phải siêu golf, nhưng bạn biết đấy. Tôi có thể có thể vắt thêm một số byte nếu tôi thực sự cố gắng.

Đối với mỗi dòng, đầu ra ( * số lượng )trong dòng, sau đó là dòng, sau đó )* số lượng (trong dòng. Nếu tôi hiểu đúng các quy tắc, điều này sẽ luôn cung cấp đầu ra hợp lệ.

Thoát bằng cách ném một ngoại lệ, là kết quả của cách tôi đã nhập. (Đầu vào luôn là một phần khó khăn của những vấn đề này.) Nếu điều này không thể chấp nhận được, tôi sẽ phải trả một vài byte để khắc phục, mặc dù tôi chưa chắc có bao nhiêu.

Ví dụ đầu ra:

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

Điều này dường như không có đầu vào đa dòng, tức là các bản in được xen kẽ với các dòng đầu vào. Nhưng ý tưởng thuật toán hay, tôi đã không nghĩ về điều đó;)
Doorknob

python2 balanced_parenthesis.py < input.txt 2>/dev/nullnhận được đầu ra tôi đã viết nhưng nếu bạn muốn đầu vào đa dòng trong khi thực hiện nó một cách tương tác, nó sẽ tiêu tốn của tôi một vài byte. Hãy cho tôi một giây, tôi sẽ tìm một cái gì đó ...
undergroundmonorail

À, được rồi, đừng bận tâm. Điều đó sẽ làm việc!
Doorknob

lưu 2 ký tự:while 1:s=raw_input();c=s.count;print'('*c(')')+s+')'*c('(')
Justin

@qui ơi, wow. Tôi đã đến rất gần để tìm ra điều đó, nhưng tôi không nhận ra bạn có thể làm được c=s.count. Tôi nghĩ bạn phải làm c=s, s.c(). Cảm ơn!
undergroundmonorail

1

Bash thuần túy, 72 byte

Sử dụng thuật toán tương tự như câu trả lời của @ Undergroundmonorail:

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

Đầu ra:

$ ./lazyparens.sh < input.txt
This line has no parentheses
alert(Math.max(1, 2))
(((1+1)*2).toString())
(((function() { alert('Hello, World!'); })()))
$ 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.