Tembel parantezleri bitirin


17

Klavyemdeki parantezlerin hepsi yıpranmış ve bunları olabildiğince kullanmaktan kaçınmak istiyorum. Zorluklarınız, her satırdan önce ve sonra parantez içeren bir satırı dengelemektir.

Bu, TI-Basic'in otomatik parantezlerine ve dize kapanmasına (yani Output(1, 1, "Hello, World!) benzer. Ayrıca değerli baytları bir programdan kaydeder!

Örnek girdi:

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

Örnek (olası) çıktı:

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

Şartname:

  • Her girdi satırı için,

    • Satırdaki parantezleri dengelemek için gerektiği kadar açık parantez ekleyin ve satır sonuna sonuna kadar parantez ekleyin

      • "Balance" teriminin tanımı:

        • Aynı miktar (ve )çizgi

        • Dizenin başından başlayarak her alt dize için, bu alt dize, parantez açmaktan daha fazla kapanış parantezine sahip olmamalıdır

          • Örneğin, (foo))(bardengeli değil çünkü (foo))açılış parantezlerinden daha fazla kapanış parantezi var
    • İsterseniz, kodunuzu kısaltırsa ekstra gereksiz parantez ekleyebilirsiniz.

    • Dize değişmezleri veya bunun gibi bir şey hakkında endişelenmenize gerek yoktur, tüm parantezlerin dengelenmesi gerektiğini varsayalım

  • Her satırı dengeli parantez ile çıktılayın

Bu , bu yüzden bayt içindeki en kısa kod kazanacak!


Sadece ilgileniyoruz ()diğer parantez Pars veya yapmak {}, [], <>vb ihtiyaç sıra dikkat edilmesi gereken?
Dijital Travma

@DigitalTrauma Hayır, sadece (ve ).
Kapı Tokmağı

Test durumunuz var mı?
Peter Taylor

1
@Peter Evet, hemen hemen oradalar ...
Kapı Tokmağı

Yanıtlar:


21

GolfScript, 23 bayt

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

Sömürdüğüm boşluk, şu karar:

İsterseniz, kodunuzu kısaltırsa ekstra gereksiz parantez ekleyebilirsiniz.

Temel olarak, her satır için, bu kod satırdaki parantezleri açmayan karakter sayısını sayar ve satır için fazladan açılan birçok parantez hazırlar ve ardından parantezleri kapatmak için aynısını yapar. Bu inanılmaz derecede verimsizdir, ancak çıktı hattındaki tüm parantezlerin dengelenmesini sağlar.

Örneğin, girdi verildiğinde:

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

bu program çıktı verecektir:

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

Ps. Bu kodu çevrimiçi olarak da test edebilirsiniz .


4
Bu bana Lisp'te ne zaman program yaptığımı hatırlatıyor ... Parantez denizinde birkaç parça kod kayboldu.
Taconut

7

Perl, 32 = 31 + 1 veya 73 = 72 + 1 (minimize edilmiş parantez)

32 = 31 + 1: ekstra gereksiz parantez ile

Düzenlemeler:

  • Düzeltme, parantez artık sayıldı y///.
  • Gereksiz değişken $akaldırıldı.
$_="("x y/)//.s|$|")"x y/(//|er

Çalışma zamanı anahtarıyla -p(+1 bayt) kullanılır.

Test dosyası input.txt:

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

Komut satırı:

perl -p script.pl <input.txt

veya

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

Sonuç:

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

Ungolfed:

Algoritma basittir, sadece bulunan her parantez için karşılığı ekleyin.

$_ =                     # $_ 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: minimum sayıda parantez ekleme

Bu komut dosyası, dengeli bir çıktı elde etmek için yalnızca minimum parantez sayısını ekler .

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

Çalışma zamanı anahtarıyla -p(+1 bayt) kullanılır.

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

Sonuç:

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: minimum ekleme sayıda parantez

Bu, dengeli bir çıktı için minimum sayıda parantez eklemek için daha eski bir yöntemdir.

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

Perl 5.14'ü (tahribatsız yer değiştirme değiştiricisi nedeniyle) ve çalışma zamanı anahtarını -p(+1 bayt) kullanır.

perl -p script.pl <input.txt

Sonuç:

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
Vay be, neredeyse golfscript gibi görünüyor ;-)
Dijital Travma

@HeikoOberdiek İlk sürüm için hangi perl kullanıyorsunuz? Her '('x/\)/gzaman eşit '(' ...
Mouq

@Mouq: Parantezleri saymak y///yerine şimdi kullanarak düzeltildi m//g.
Heiko Oberdiek

4

Python 2.7 3: 62 60 58 bayt

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

Süper golf değil, ama biliyorsun. Gerçekten denediysem daha fazla bayt sıkıştırabilirim.

Her satır için, satırın (* sayısını ), sonra satırın, ardından )* satırın sayısını verir (. Kuralları doğru anlarsam, bu her zaman geçerli çıktı sağlar.

Giriş yapmamın bir sonucu olarak bir istisna atarak çıkar. (Girdi her zaman bu sorunların zor bir parçasıdır.) Bu kabul edilebilir değilse, düzeltmem için birkaç bayta mal olacak, ancak henüz kaç tane olduğundan emin değilim.

Örnek çıktı:

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

Bu, çok satırlı girdi alıyor gibi görünmüyor, yani baskılar girdi satırlarıyla serpiştirilmiş. Ama güzel bir algoritma fikri, ben bunu düşünmüyordu;)
Kapı tokmağı

python2 balanced_parenthesis.py < input.txt 2>/dev/nullBen yazdım çıktı alır ama interaktif yaparken çok satırlı girdi istiyorsanız bana birkaç bayt mal olacak. Bana bir saniye ver, bir şey bulacağım ...
undergroundmonorail

Ah, tamam, boş ver o zaman. İşe yarayacak!
Kapı tokmağı

2 karakter kaydet:while 1:s=raw_input();c=s.count;print'('*c(')')+s+')'*c('(')
Justin

@qui Oh, vay canına. Bunu anlamaya çok yaklaştım ama yapabileceğinizin farkında değildim c=s.count. Ne yapmak zorunda düşündü c=s, s.c(). Teşekkürler!
undergroundmonorail

1

Saf Bash, 72 bayt

@ Undergroundmonorail'in cevabı ile aynı algoritmayı kullanır:

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

Çıktı:

$ ./lazyparens.sh < input.txt
This line has no parentheses
alert(Math.max(1, 2))
(((1+1)*2).toString())
(((function() { alert('Hello, World!'); })()))
$ 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.