অলস বন্ধনী শেষ করুন


17

আমার কীবোর্ডের প্রথম বন্ধনীগুলি জরাজীর্ণ এবং আমি যতটা সম্ভব এগুলি ব্যবহার করা এড়াতে চাই। আপনার চ্যালেঞ্জটি হ'ল প্রতিটি লাইনটির আগে এবং পরে লেনদেনগুলি যুক্ত লাইনটিকে ভারসাম্যপূর্ণ করা।

এটি টিআই-বেসিকের স্বয়ংক্রিয় বন্ধনী এবং স্ট্রিং ক্লোজার (যেমন 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))বন্ধনীর খোলার চেয়ে বেশি বন্ধ বন্ধনী রয়েছে
    • আপনি চাইলে অতিরিক্ত অপ্রয়োজনীয় বন্ধনী যুক্ত করতে পারেন, যদি এটি আপনার কোডকে আরও ছোট করে তোলে

    • স্ট্রিং লিটারেলস বা এর মতো কিছু সম্পর্কে আপনার চিন্তা করার দরকার নেই, ধরে নিন যে সমস্ত বন্ধনীকে ভারসাম্য বজায় রাখা দরকার

  • প্রতিটি লাইন বন্ধনী সুষম সঙ্গে আউটপুট

এটি , তাই বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জিতবে!


আপনি শুধু উদ্বিগ্ন ()ডান বন্ধনী, বা কি অন্যান্য বন্ধনী {}, [], <>, ইত্যাদি প্রয়োজন ভাল হিসাবে বিবেচনা করা হবে?
ডিজিটাল ট্রমা

@ ডিজিটাল ট্রুমা নাপ, কেবলমাত্র (এবং )
ডুরকনব

আপনার কি কোনও পরীক্ষার মামলা আছে?
পিটার টেলর

1
@Peter হ্যাঁ, তারা অধিকার আছে পোস্টে করছি ...
Doorknob

উত্তর:


21

গল্ফস্ক্রিপ্ট, 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
এটি আমাকে স্মরণ করিয়ে দেয় যে আমি যখন লিস্পে প্রোগ্রাম করতাম ... কয়েকটি বন্ধুত্বের সমুদ্রে কোডের কিছু বিট হারিয়েছিল।
টাকোনট

7

পার্ল, 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

এটি পার্ল 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
বাহ, এটি প্রায় গল্ফস্ক্রিপ্টের মতো দেখাচ্ছে ;-)
ডিজিটাল ট্রমা

@ হাইকো ওবারডিক আপনি প্রথম সংস্করণটির জন্য কী পার্ল ব্যবহার করছেন? '('x/\)/gসর্বদা '(' ... '
মউক

@ মোউক: ধন্যবাদ, প্রথম বন্ধনী গণনার y///পরিবর্তে এখন ব্যবহার করে স্থির করা m//gহয়েছে।
হাইকো ওবারডিক

4

পাইথন 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('(')
জাস্টিন

@ কুই ওহ, বাহ! আমি এটি বুঝতে পেরে এত কাছাকাছি এসেছি, তবে বুঝতে পারিনি যে আপনি এটি করতে পারবেন c=s.count। আমি ভেবেছিলাম তুমি কি ছিল c=s, s.c()। ধন্যবাদ!
আন্ডারগ্রাউন্ডোমোনাইল

1

খাঁটি বাশ, 72 বাইট

@ আন্ডারগ্রাউন্ডমোনোরাইলের উত্তর হিসাবে একই অ্যালগরিদম ব্যবহার করে:

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.