จบวงเล็บที่ขี้เกียจ


17

วงเล็บบนคีย์บอร์ดของฉันหมดและฉันต้องการหลีกเลี่ยงการใช้มากที่สุด ความท้าทายของคุณคือการรักษาสมดุลของเส้นที่มีวงเล็บด้วยการเพิ่มลงในก่อนและหลังแต่ละบรรทัด

สิ่งนี้คล้ายกับวงเล็บอัตโนมัติและการปิดสตริง (เช่นOutput(1, 1, "Hello, World!) ของ TI-Basic นอกจากนี้ยังช่วยประหยัดไบต์อันมีค่าจากโปรแกรม!

อินพุตตัวอย่าง:

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))มีวงเล็บปิดมากกว่าการเปิดวงเล็บ
    • คุณอาจเพิ่มวงเล็บที่ไม่จำเป็นเป็นพิเศษหากคุณต้องการหากมันทำให้รหัสของคุณสั้นลง

    • คุณไม่จำเป็นต้องกังวลเกี่ยวกับตัวอักษรสตริงหรืออะไรอย่างนั้นสมมติว่าวงเล็บทั้งหมดต้องมีความสมดุล

  • เอาต์พุตแต่ละบรรทัดด้วยวงเล็บที่สมดุล

นี่คือดังนั้นโค้ดที่สั้นที่สุดเป็นไบต์จะเป็นผู้ชนะ!


คุณเพียงแค่กังวลกับ()parens หรือทำวงเล็บอื่น ๆ{}, [], <>ฯลฯ จำเป็นที่จะต้องได้รับการพิจารณาเช่นกัน?
Digital Trauma

@DigitalTrauma Nope เพียงและ( )
Doorknob

คุณมีกรณีทดสอบหรือไม่?
Peter Taylor

1
@Peter Yeah พวกเขาอยู่ที่นั่นในโพสต์ ...
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!'); })()))))))))))))))))))))))))))))))))))))

ps คุณสามารถทดสอบรหัสนี้ทางออนไลน์ได้


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))
((()))((()))
(())
(())

Ungolfed:

อัลกอริทึมนั้นง่ายเพียงแค่เพิ่มคู่สำหรับวงเล็บที่พบ

$_ =                     # $_ 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)
((()))((()))
(())
(())

Ungolfed:

$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)
((()))((()))
(())
(())

Ungolfed:

# 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 รุ่นแรกเป็นยังไง? ดูเหมือนจะไม่ทำงานในวันที่ 18.1 เนื่องจากมีค่า'('x/\)/gเสมอ '(' ...
Mouq

@Mouq: ขอบคุณคงตอนนี้ใช้y///แทนm//gการนับวงเล็บ
Heiko Oberdiek

4

Python 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

@qui โอ้ว้าว ฉันมาให้ใกล้เคียงกับการหาที่ c=s.countแต่ฉันไม่ได้ตระหนักถึงคุณจะทำ ฉันคิดว่าคุณต้องทำ,c=s s.c()ขอบคุณ!
undergroundmonorail

1

Pure 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!'); })()))
$ 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.