Закінчіть ледачі дужки


17

Дужки на моїй клавіатурі всі зношені, і я хочу уникати їх використання якомога більше. Ваше завдання полягає в збалансуванні рядка, що містить дужки, додаючи їх до і після кожного рядка.

Це схоже на автоматичні дужки TI-Basic і закриття рядків (тобто Output(1, 1, "Hello, World!). Це також економить дорогоцінні байти від програми!

Приклад введення:

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))має більше дужок, що закриваються, ніж відкриває дужки
    • Якщо ви хочете, ви можете додати зайві дужки, якщо ваш код буде коротшим

    • Вам не потрібно турбуватися про рядкові літерали чи щось подібне, припустимо, що всі дужки потребують врівноваження

  • Виведіть кожен рядок з дужками врівноважено

Це , тому найкоротший код у байтах виграє!


Ви просто стурбовані ()круглі дужки, або робити інші кронштейни {}, [], <>і т.д. Необхідно також враховувати?
Цифрова травма

@DigitalTrauma Nope, тільки (і ).
Дверна ручка

Чи є у вас тестові випадки?
Пітер Тейлор

1
@Peter Так, вони прямо там на пошті ...
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!'); })()))))))))))))))))))))))))))))))))))))

Пс. Ви також можете протестувати цей код в Інтернеті .


4
Це мені нагадує, коли я програмував у Ліспі ... Кілька біт коду, загублених у морі дужок.
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))
((()))((()))
(())
(())

Безголовки:

Алгоритм простий, просто додайте аналог для кожної знайденої дужки.

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

Безголовки:

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

Безголовки:

# 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підрахунку дужок.
Хайко Обердік

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отримує результат, про який я писав, але якщо ви хочете робити багаторядковий вклад, роблячи його інтерактивно, це обійдеться мені в кілька байтів. Дайте мені секунду, я щось придумаю ...
підземний

Ага, гаразд, майте на увазі тоді. Це спрацює!
Дверна ручка

збережіть 2 знаки:while 1:s=raw_input();c=s.count;print'('*c(')')+s+')'*c('(')
Джастін

@qui О, ух. Я наблизився до з'ясування цього, але не зрозумів, що ти можеш зробити c=s.count. Я думав , що ти повинен був зробити c=s, s.c(). Спасибі!
підземниймонорельс

1

Чистий Баш, 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!'); })()))
$ 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.