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.