Termina le parentesi pigre


17

Le parentesi sulla mia tastiera sono tutte logore e voglio evitare di usarle il più possibile. La tua sfida è quella di bilanciare una linea contenente parentesi aggiungendole prima e dopo ogni riga.

Questo è simile alle parentesi automatiche di TI-Basic e alla chiusura della stringa (es Output(1, 1, "Hello, World!.). Inoltre salva byte preziosi da un programma!

Esempio di input:

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

Esempio (possibile) output:

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

Specifica:

  • Per ogni riga di input,

    • Aggiungi quante parentesi aperte all'inizio e chiudi parentesi alla fine della riga quante sono necessarie per bilanciare le parentesi nella riga

      • La definizione di "equilibrio" è:

        • Stessa quantità di (e )nella linea

        • Per ogni sottostringa a partire dall'inizio della stringa, questa sottostringa non deve avere più parentesi di chiusura che parentesi di apertura

          • Ad esempio, (foo))(barnon è bilanciato perché (foo))ha più parentesi di chiusura che parentesi di apertura
    • Se lo si desidera, è possibile aggiungere parentesi non necessarie aggiuntive se si riduce il codice

    • Non devi preoccuparti dei letterali di stringa o cose del genere, supponi che tutte le parentesi debbano essere bilanciate

  • Stampa ogni riga con le parentesi bilanciate

Questo è , quindi vincerà il codice più breve in byte!


Sei solo interessati con ()parentesi, o fare altre staffe {}, [], <>, ecc devono essere considerati come bene?
Trauma digitale,

@DigitalTrauma No, solo (e ).
Maniglia della porta

Hai dei casi di test?
Peter Taylor,

1
@Peter Sì, sono proprio lì nel post ...
Maniglia della porta

Risposte:


21

GolfScript, 23 byte

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

La scappatoia che sto sfruttando è la sentenza che:

Se lo si desidera, è possibile aggiungere parentesi non necessarie aggiuntive se si riduce il codice

Fondamentalmente, per ogni riga, questo codice conta il numero di caratteri sulla riga che non aprono le parentesi, e fa precedere quel numero di parentesi aperte aggiuntive alla riga, quindi fa lo stesso per chiudere le parentesi. Questo è incredibilmente inefficiente, ma assicura che tutte le parentesi sulla linea di output siano bilanciate.

Ad esempio, dato l'input:

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

questo programma produrrà:

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

Ps. Puoi anche testare questo codice online .


4
Questo mi ricorda quando programmavo in Lisp ... Alcuni frammenti di codice persi in un mare di parentesi.
Taconut,

7

Perl, 32 = 31 + 1 o 73 = 72 + 1 (parentesi minimizzate)

32 = 31 + 1: con parentesi extra non necessarie

modifiche:

  • Correzione, le parentesi ora contate y///.
  • Variabile non necessaria $arimossa.
$_="("x y/)//.s|$|")"x y/(//|er

Viene utilizzato con l'interruttore di runtime -p(+1 byte).

File di prova input.txt:

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

Riga di comando:

perl -p script.pl <input.txt

o

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

Risultato:

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

Ungolfed:

L'algoritmo è semplice, basta aggiungere la controparte per ciascuna parentesi trovata.

$_ =                     # $_ 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: aggiunta del numero minimo di parentesi

Questo script aggiunge solo il numero minimo di parentesi per ottenere un risultato bilanciato.

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

Viene utilizzato con l'interruttore di runtime -p(+1 byte).

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

Risultato:

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: aggiunta del numero minimo di parentesi

Questo è un metodo precedente per aggiungere il numero minimo di parentesi per un risultato bilanciato.

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

Utilizza Perl 5.14 (a causa del modificatore di sostituzione non distruttiva) e l'interruttore di runtime -p(+1 byte).

perl -p script.pl <input.txt

Risultato:

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
Wow, sembra quasi un golfscript ;-)
Digital Trauma,

@HeikoOberdiek Che perl stai usando per la prima versione? Non sembra funzionare su 18.1 a causa del '('x/\)/gsempre uguale '(' ...
Mouq

@Mouq: grazie, risolto ora usando y///invece di m//gcontare le parentesi.
Heiko Oberdiek,

4

Python 2.7 3: 62 60 58 byte

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

Non super golf, ma lo sai. Potrei essere in grado di spremere qualche byte in più se ci provassi davvero.

Per ogni riga, genera (* il numero di )nella riga, quindi la riga, quindi )* il numero di (nella riga. Se comprendo correttamente le regole, ciò fornirà sempre un output valido.

Esce lanciando un'eccezione, a seguito del modo in cui ho inserito. (L'input è sempre una parte difficile di questi problemi.) Se questo non è accettabile, mi costerà qualche byte da risolvere, anche se non sono ancora sicuro di quanti.

Esempio di output:

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

Ciò non sembra accettare input multilinea, ovvero le stampe sono intervallate da linee di input. Ma bella idea di algoritmo, non ci avevo pensato;)
Maniglia della porta

python2 balanced_parenthesis.py < input.txt 2>/dev/nullottiene l'output che ho scritto ma se vuoi input multilinea mentre lo fai in modo interattivo mi costerà qualche byte. Dammi un secondo, scoprirò qualcosa ...
undergroundmonorail

Ah, va bene, non importa allora. Funzionerà!
Maniglia della porta

salva 2 caratteri:while 1:s=raw_input();c=s.count;print'('*c(')')+s+')'*c('(')
Giustino il

@qui Oh, wow. Mi sono avvicinato così tanto a capirlo, ma non mi rendevo conto che potevi farlo c=s.count. Ho pensato che dovevi fare c=s, s.c(). Grazie!
undergroundmonorail

1

Pure Bash, 72 byte

Utilizza lo stesso algoritmo della risposta di @ undergroundmonorail:

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

Produzione:

$ ./lazyparens.sh < input.txt
This line has no parentheses
alert(Math.max(1, 2))
(((1+1)*2).toString())
(((function() { alert('Hello, World!'); })()))
$ 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.