Bracksを埋める


18

通常のブラケット(()[]<>とは{})しかし、誰かがそれを括弧のような非括弧文字を使用することをお勧めだろうと思った、素晴らしく、明確なです。これらの文字|"があいまいです。たとえば

""""

対応する

(())

または

()()

言うことは不可能です。

曖昧な括弧の種類を混ぜると、物事が面白くなり始めます。たとえば、

"|""||""|"

次のいずれかです

([(([]))]),([()[]()]),([()][()])

仕事

あなたの仕事は、あいまいな文字で作られた文字列を取得し、作成者が意図した可能性のあるすべてのバランスの取れた文字列を出力することです。

交換行うことができ、より具体的にあなたの出力のすべてのバランスの文字列|のいずれかと[]"どちらかと()。バランスの取れた文字列を2回出力しないでください。

IO

入力として、|とで構成される文字列を使用する必要があります"。あなたは以外に二つの異なる文字を選択したい場合|"、あなたがそうすることができる代替品として機能します。バランスの取れた文字列のコンテナを出力する必要があります。あなたは置き換えることを選択すること[]と、()(他の2ブラケットのペアを使用して出力して()[]<>または{}あなたが望みます)。出力形式は実行間で一貫している必要があります。

得点

これはため、回答はバイト単位でスコアリングされ、バイト数は少ない方が良いでしょう。

テストケース

"" -> ["()"]
"|"| -> []
||| -> []
"""" -> ["(())","()()"]
""|| -> ["()[]"]
"|"||"|" -> ["([([])])"]    
"|""||""|" -> ["([(([]))])","([()[]()])","([()][()])"]    

4
BrainFlakの回答を待つ
共産

文字列の代わりに整数を使用できますか?数字または整数のリストはどうですか?
ズガルブ

@Zgarb確かにそれはいいです
ウィートウィザード

回答:


7

Python 2、135バイト

s=input()
for k in range(2**len(s)):
 try:c=''.join("[]() , ,"[int(c)|k>>i&1::4]for i,c in enumerate(s));eval(c);print c[::2]
 except:0

オンラインでお試しください!

2002代わりに入力を期待し"||"、引用符で囲みます。

文字列への「開く」と「閉じる」の2 Nの可能な割り当てすべてを繰り返し、次のcような文字列を作成します。

"( [ ( ),],[ ( ),],),( ),"

evalこの文字列が-ingで例外がスローされた場合、一致しません。そうでない場合は、印刷します c[::2]

([()][()])()

6

網膜59 56 55バイト

0`"
<$%">
}0`'
{$%"}
.+
$&_$&
+m`^_|(<>|{})(?=.*_)

A`_

オンラインでお試しください!残念ながら、一致するブラケットの2つのセットのテストは、単一の.NET正規表現のゴルフィネスを超えるため、手動でチェックするために15バイトを節約します。編集:保存3 @ H.PWizのおかげで 4バイトれました。説明:

0`"
<$%">

を見つけて"、行の2つのコピーを作成します。1つはaで<、もう1つはa >です。これを一度に1つずつ実行"して、それぞれが"が行数を2倍にする。

}0`'
{$%"}

同様に'{}。次に、すべて"'すべてのコピーの。

.+
$&_$&

で区切られたブラケットの複製を作成します _

+m`^_|(<>|{})(?=.*_)

複製で、一致するブラケットを繰り返し削除し、残りがなくなるまで繰り返します。その場合、削除します _も同様にします。

A`_

まだあるすべての行を削除します _

網膜74 71 70バイト

0`"
<$%">
}0`'
{$%"}
Lm`^(.(?<=(?=\3)(<.*>|{.*}))(?<-3>)|(.))+(?(3)_)$

オンラインでお試しください!説明:最初の2つの段階は上記のとおりです。3番目の段階では、一致するブラケットの2つのセットの一致結果を直接印刷します。これは、.NETのバランスグループを使用します。一致の各段階で、正規表現は文字の一致を試み、一致する括弧のペアを探して、スタックの上部が開いている括弧と一致することを確認します。これが可能であれば、ブラケットのバランスが取れ、開いているブラケットがスタックからポップされることを意味します。それ以外の場合、スタックにプッシュする必要があるオープンブラケットにいることを前提としています。これらの仮定が成り立たない場合、スタックは最後に空にならず、マッチは失敗します。

代替アプローチ、74 71バイト:

Lm`^((?=(<.*>|{.*})(?<=(.))).|\3(?<-3>))+(?(3)_)$

ここで、<... >または{...のいずれかを先読みし、}後ろを見て、閉じ括弧をスタックにプッシュします。それ以外の場合は、前にキャプチャした閉じかっこを照合してポップする必要があります。このバージョンでは、正規表現は文字列の最後まで到達しませんが<<<>、空のスタックをチェックしなかった場合、ネットをすり抜けるような文字列もあります。


1
異なる文字を使用することにより、エスケープ時にいくつかのバイトを保存できます
-H.PWiz

@ H.PWizああ、私は別のブラケットペアの使用についてそのビットを見過ごしていたに違いない、ありがとう!
ニール

|入力を変更することもできます
-H.PWiz

2

、19バイト

fo¬ω`ḞoΣx½¨÷₂¨ΠmSe→

オンラインでお試しください! 文字を使用しdsた入力に、対応するブラケットのペアdest出力します。

説明

考えは、入力のすべての可能なブラケットを生成し、隣接するブラケットを繰り返し削除するときに、それらを空の文字列に減らすことです。¨÷₂¨膨張にその圧縮された文字列であり"dest"、それは短い圧縮形式を有し、隣接するコードポイントの文字ペアで構成されているため選択しました。したがって、プログラムは次のものと同等です。

fo¬ω`ḞoΣx½"dest"ΠmSe→  Implicit input, say "ddssdd".
                 m     Map over the string:
                  Se    pair character with
                    →   its successor.
                       Result: ["de","de","st","st","de","de"]
                Π      Cartesian product: ["ddssdd","ddssde",..,"eettee"]
f                      Keep those strings that satisfy this:
                        Consider argument x = "ddsted".
   ω                    Iterate on x until fixed:
         ½"dest"         Split "dest" into two: ["de","st"]
    `Ḟ                   Thread through this list (call the element y):
        x                 Split x on occurrences of y,
      oΣ                  then concatenate.
                          This is done for both "de" and "st" in order.
                        Result is "dd".
 o¬                    Is it empty? No, so "ddsted" is not kept.
                      Result is ["destde","ddstee"], print implicitly on separate lines.

2

Perl、56 55 53バイト

に含ま+1れるものn

用途[[]{のために{}

perl -nE 's%.%"#1$&,+\\$&}"^Xm.v6%eg;eval&&y/+//d+say for< $_>' <<< "[{[[{{[[{["

すべての2 ^ Nの可能性を生成し、perl evalを使用して'+ [+ {}]'などの文字列が有効なコードであるかどうかを確認し、有効なコードである場合は削除し+て結果を出力します




1

Perl、56バイト

含む +れるものn

入力を使用 [出力にを、[または]

{出力に入力を使用する、{または}

perl -nE '/^((.)(?{$^R.$2})(?1)*\2(?{$^R.=$2^v6}))*$(?{say$^R})^/' <<< "[{[[{{[[{["

バックトラッキング中に行われた選択を追跡しながら、perl拡張正規表現を使用してブレースを照合します。これは、入力文字列の途中ですでに多くの不可能な割り当てを拒否しているため、すべての2 ^ N候補を生成するよりもはるかに効率的です。


0

Kotlin240の 236 234バイト

fold(listOf("")){r,c->r.flatMap{i->when(c){'"'->"()".map{i+it}
else->"[]".map{i+it}}}}.filter{val d=ArrayList<Char>()
it.all{fun f(c:Any)=d.size>1&&d.removeAt(0)==c
when(it){')'->f('(')
']'->f('[')
else->{d.add(0,it);1>0}}}&&d.size<1}

美化

    fold(listOf("")) {r,c ->
        r.flatMap {i-> when(c) {
            '"'-> "()".map {i+it}
            else -> "[]".map {i+it}
        }}
    }.filter {
        val d = ArrayList<Char>()
        it.all {
            fun f(c:Any)=d.size>1&&d.removeAt(0)==c
            when(it) {
                ')' -> f('(')
                ']' -> f('[')
                else -> {d.add(0,it);1>0}
            }
        } && d.size<1
    }

テスト

private fun String.f(): List<String> =
fold(listOf("")){r,c->r.flatMap{i->when(c){'"'->"()".map{i+it}
else->"[]".map{i+it}}}}.filter{val d=ArrayList<Char>()
it.all{fun f(c:Any)=d.size>1&&d.removeAt(0)==c
when(it){')'->f('(')
']'->f('[')
else->{d.add(0,it);1>0}}}&&d.size<1}

data class Test(val input: String, val outputs: List<String>)

val tests = listOf(
    Test("""""""", listOf("()")),
    Test(""""|"|""", listOf()),
    Test("""|||""", listOf()),
    Test("""""""""", listOf("(())","()()")),
    Test("""""||""", listOf("()[]")),
    Test(""""|"||"|"""", listOf("([([])])")),
    Test(""""|""||""|"""", listOf("([(([]))])","([()[]()])","([()][()])"))
)

fun main(args: Array<String>) {
    for ((input, output) in tests) {
        val actual = input.f().sorted()
        val expected = output.sorted()
        if (actual != expected) {
            throw AssertionError("Wrong answer: $input -> $actual | $expected")
        }
    }

編集

  • -4 jrtapsell-述語のチェックを修正しました
  • -2 jrtapsell -- true> 1>0および== 0->< 1

0

C(gcc)、315バイト

j,b;B(char*S){char*s=calloc(strlen(S)+2,b=1)+1;for(j=0;S[j];b*=(S[j]<62||*--s==60)*(S[j++]-41||*--s==40))S[j]==60?*s++=60:0,S[j]<41?*s++=40:0;return*s>0&*--s<1&b;}f(S,n,k)char*S;{if(n<strlen(S))for(k=2;k--;)S[n]==46-k-k?S[n]=40+k*20,f(S,n+1),S[n]=41+k*21,f(S,-~n),S[n]=46-k-k:0;else B(S)&&puts(S);}F(int*S){f(S,0);}

オンラインでお試しください!


C(gcc)、334バイト(旧バージョン)

j,b;B(char*S){char*s=calloc(strlen(S)+2,1)+1;for(b=1,j=0;S[j];j++){if(S[j]==60)*s++=60;if(S[j]<41)*s++=40;b*=!(S[j]>61&&*--s!=60)*!(S[j]==41&&*--s!=40);}return*s>0&*--s<1&b;}f(S,n,k)char*S;{if(n>=strlen(S))return B(S)&&puts(S);for(k=0;k<2;k++)S[n]==46-k-k&&(S[n]=40+k*20,f(S,n+1),S[n]=41+k*21,f(S,-~n),S[n]=46-k-k);}F(char*S){f(S,0);}

オンラインでお試しください!


説明(旧バージョン)

j,b;B(char*S){                   // determine if string is balanced
 char*s=calloc(strlen(S)+2,1)+1; // array to store matching brackets
 for(b=1,j=0;S[j];j++){          // loop through string (character array)
  if(S[j]==60)*s++=60;           // 60 == '<', opening bracket
  if(S[j]<41)*s++=40;            // 40 == '(', opening bracket
  b*=!(S[j]>61&&*--s!=60)*       // 62 == '>', closing bracket
   !(S[j]==41&&*--s!=40);}       // 41 == ')', closing bracket
 return*s>0&*--s<1&b;}           // no unmatched brackets and no brackets left to match
f(S,n,k)char*S;{                 // helper function, recursively guesses brackets
 if(n>=strlen(S))                // string replaced by possible bracket layout
  return B(S)&&puts(S);          // print if balanced, return in all cases
 for(k=0;k<2;k++)                // 46 == '.', guess 40 == '(',
  S[n]==46-k-k&&(S[n]=40+k*20,   //  guess 41 == '(', restore
   f(S,n+1),S[n]=41+k*21,        // 44 == ',', guess 60 == '<',
   f(S,-~n),S[n]=46-k-k);}       //  guess 62 == '>', restore
F(char*S){f(S,0);}               // main function, call helper function

オンラインでお試しください!


GCC可変長配列を使用してcallocを取り除くことはできませんか?
トンホスペル

しかし、@ TonHospelでは、配列をポインターに変換するか、別のインデックス変数を導入する必要があり*s++ます。いくつかの場所で使用しているため、それが価値があるかどうかはわかりません。
ジョナサンフレッチ

char S[n],*s=Sまだ短いchars*s=calloc(n,1)
トンホスペル

@TonHospelうまくいかないように思えますが、私は本当に理由を知りません
ジョナサンフレッチ

@ceilingcatありがとうございます。
ジョナサンフレッチ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.