すべてのBrain-Flakスニペットを生成する


14

この質問は、Brain-Flakの最初の誕生日を祝うために設計されたいくつかのBrain-flak Birthdayチャレンジの2番目です!Brain-Flakの誕生日の詳細については、こちらをご覧ください。

チャレンジ

この課題では、括弧のリストから完全に一致するすべての文字列を生成します。完全に一致する文字列のDJMcMayhemの定義を借用するには:

  • この課題のために、「括弧」は次の文字のいずれかです()[]{}<>

  • 次のように、開始ブラケットと終了ブラケットが正しい順序であり、中に文字がない場合、一対のブラケットは「一致」とみなされます。

    ()
    []{}
    

    または、その中のすべてのサブ要素も一致する場合。

    [()()()()]
    {<[]>}
    (()())
    

    サブエレメントは、いくつかのレイヤーの深さにネストすることもできます。

    [(){<><>[()]}<>()]
    <[{((()))}]>
    
  • ブラケットの各ペアに正しい順序で正しい開始ブラケットと終了ブラケットがある場合にのみ、文字列は「完全一致」と見なされます。


入力

プログラムまたは関数は、便利で一貫した形式の4つの非負数のリストを受け取ります。これには、整数のリスト、数字で区切られていない文字列、または個別の引数が含まれます(ただし、これらに限定されません)。これらの4つの数字は、各タイプのブラケットの一致したペアの数を表します。たとえば、次[1,2,3,4]を表します。

  • 1ペア ()

  • 2組の {}

  • 3組[]

  • 4ペア <>

一貫性がある限り、各入力に対応するブラケットのペアを選択できます。

出力

この括弧のリストから重複なく形成できる、完全に一致したすべての文字列を出力する必要があります。出力は、括弧で区切られていない文字列をSTDOUTに出力したり、文字列のリストを関数からの戻り値として出力したりするなど、妥当な形式で出力できます。

アルゴリズムは任意の入力に対して機能する必要がありますが、メモリ、時間、整数サイズの制限について心配する必要はありません(たとえば、答えがCの場合、入力として2 33を取得しません)。

これはであるため、バイト単位の最短回答が優先されます。

入力と出力の例

これらの例では、上記と同じ入力順序を使用します。

各例では、最初の行が入力され、次の行が出力になります

Example 0:
[0,0,0,0]


Example 1:
[1,0,0,0]
()

Example 2:
[0,2,0,0]
{}{}
{{}}

Example 3:
[0,0,1,1]
[]<>
[<>]
<[]>
<>[]

Example 4:
[0,1,2,0]
{}[][]  {}[[]]  {[]}[]  {[][]}  {[[]]} 
[{}][]  [{}[]]  [{[]}]  []{}[]  []{[]} 
[][{}]  [][]{}  [[{}]]  [[]{}]  [[]]{}

Example 5:
[1,0,0,3]
()<><><>  ()<><<>>  ()<<>><>  ()<<><>>  ()<<<>>>  (<>)<><>  (<>)<<>>
(<><>)<>  (<><><>)  (<><<>>)  (<<>>)<>  (<<>><>)  (<<><>>)  (<<<>>>)
<()><><>  <()><<>>  <()<>><>  <()<><>>  <()<<>>>  <(<>)><>  <(<>)<>>
<(<><>)>  <(<<>>)>  <>()<><>  <>()<<>>  <>(<>)<>  <>(<><>)  <>(<<>>)
<><()><>  <><()<>>  <><(<>)>  <><>()<>  <><>(<>)  <><><()>  <><><>()
<><<()>>  <><<>()>  <><<>>()  <<()>><>  <<()><>>  <<()<>>>  <<(<>)>>
<<>()><>  <<>()<>>  <<>(<>)>  <<>>()<>  <<>>(<>)  <<>><()>  <<>><>()
<<><()>>  <<><>()>  <<><>>()  <<<()>>>  <<<>()>>  <<<>>()>  <<<>>>()

Example 6:
[1,1,1,1]

(){}[]<>  (){}[<>]  (){}<[]>  (){}<>[]  (){[]}<>  (){[]<>}  (){[<>]}
(){<[]>}  (){<>}[]  (){<>[]}  ()[{}]<>  ()[{}<>]  ()[{<>}]  ()[]{}<>
()[]{<>}  ()[]<{}>  ()[]<>{}  ()[<{}>]  ()[<>{}]  ()[<>]{}  ()<{}[]>
()<{}>[]  ()<{[]}>  ()<[{}]>  ()<[]{}>  ()<[]>{}  ()<>{}[]  ()<>{[]}
()<>[{}]  ()<>[]{}  ({})[]<>  ({})[<>]  ({})<[]>  ({})<>[]  ({}[])<>
({}[]<>)  ({}[<>])  ({}<[]>)  ({}<>)[]  ({}<>[])  ({[]})<>  ({[]}<>)
({[]<>})  ({[<>]})  ({<[]>})  ({<>})[]  ({<>}[])  ({<>[]})  ([{}])<>
([{}]<>)  ([{}<>])  ([{<>}])  ([]){}<>  ([]){<>}  ([])<{}>  ([])<>{}
([]{})<>  ([]{}<>)  ([]{<>})  ([]<{}>)  ([]<>){}  ([]<>{})  ([<{}>])
([<>{}])  ([<>]){}  ([<>]{})  (<{}[]>)  (<{}>)[]  (<{}>[])  (<{[]}>)
(<[{}]>)  (<[]{}>)  (<[]>){}  (<[]>{})  (<>){}[]  (<>){[]}  (<>)[{}]
(<>)[]{}  (<>{})[]  (<>{}[])  (<>{[]})  (<>[{}])  (<>[]){}  (<>[]{})
{()}[]<>  {()}[<>]  {()}<[]>  {()}<>[]  {()[]}<>  {()[]<>}  {()[<>]}
{()<[]>}  {()<>}[]  {()<>[]}  {([])}<>  {([])<>}  {([]<>)}  {([<>])}
{(<[]>)}  {(<>)}[]  {(<>)[]}  {(<>[])}  {}()[]<>  {}()[<>]  {}()<[]>
{}()<>[]  {}([])<>  {}([]<>)  {}([<>])  {}(<[]>)  {}(<>)[]  {}(<>[])
{}[()]<>  {}[()<>]  {}[(<>)]  {}[]()<>  {}[](<>)  {}[]<()>  {}[]<>()
{}[<()>]  {}[<>()]  {}[<>]()  {}<()[]>  {}<()>[]  {}<([])>  {}<[()]>
{}<[]()>  {}<[]>()  {}<>()[]  {}<>([])  {}<>[()]  {}<>[]()  {[()]}<>
{[()]<>}  {[()<>]}  {[(<>)]}  {[]()}<>  {[]()<>}  {[](<>)}  {[]}()<>
{[]}(<>)  {[]}<()>  {[]}<>()  {[]<()>}  {[]<>()}  {[]<>}()  {[<()>]}
{[<>()]}  {[<>]()}  {[<>]}()  {<()[]>}  {<()>}[]  {<()>[]}  {<([])>}
{<[()]>}  {<[]()>}  {<[]>()}  {<[]>}()  {<>()}[]  {<>()[]}  {<>([])}
{<>}()[]  {<>}([])  {<>}[()]  {<>}[]()  {<>[()]}  {<>[]()}  {<>[]}()
[(){}]<>  [(){}<>]  [(){<>}]  [()]{}<>  [()]{<>}  [()]<{}>  [()]<>{}
[()<{}>]  [()<>{}]  [()<>]{}  [({})]<>  [({})<>]  [({}<>)]  [({<>})]
[(<{}>)]  [(<>){}]  [(<>)]{}  [(<>{})]  [{()}]<>  [{()}<>]  [{()<>}]
[{(<>)}]  [{}()]<>  [{}()<>]  [{}(<>)]  [{}]()<>  [{}](<>)  [{}]<()>
[{}]<>()  [{}<()>]  [{}<>()]  [{}<>]()  [{<()>}]  [{<>()}]  [{<>}()]
[{<>}]()  [](){}<>  [](){<>}  []()<{}>  []()<>{}  []({})<>  []({}<>)
[]({<>})  [](<{}>)  [](<>){}  [](<>{})  []{()}<>  []{()<>}  []{(<>)}
[]{}()<>  []{}(<>)  []{}<()>  []{}<>()  []{<()>}  []{<>()}  []{<>}()
[]<(){}>  []<()>{}  []<({})>  []<{()}>  []<{}()>  []<{}>()  []<>(){}
[]<>({})  []<>{()}  []<>{}()  [<(){}>]  [<()>{}]  [<()>]{}  [<({})>]
[<{()}>]  [<{}()>]  [<{}>()]  [<{}>]()  [<>(){}]  [<>()]{}  [<>({})]
[<>{()}]  [<>{}()]  [<>{}]()  [<>](){}  [<>]({})  [<>]{()}  [<>]{}()
<(){}[]>  <(){}>[]  <(){[]}>  <()[{}]>  <()[]{}>  <()[]>{}  <()>{}[]
<()>{[]}  <()>[{}]  <()>[]{}  <({})[]>  <({})>[]  <({}[])>  <({[]})>
<([{}])>  <([]){}>  <([])>{}  <([]{})>  <{()}[]>  <{()}>[]  <{()[]}>
<{([])}>  <{}()[]>  <{}()>[]  <{}([])>  <{}[()]>  <{}[]()>  <{}[]>()
<{}>()[]  <{}>([])  <{}>[()]  <{}>[]()  <{[()]}>  <{[]()}>  <{[]}()>
<{[]}>()  <[(){}]>  <[()]{}>  <[()]>{}  <[({})]>  <[{()}]>  <[{}()]>
<[{}]()>  <[{}]>()  <[](){}>  <[]()>{}  <[]({})>  <[]{()}>  <[]{}()>
<[]{}>()  <[]>(){}  <[]>({})  <[]>{()}  <[]>{}()  <>(){}[]  <>(){[]}
<>()[{}]  <>()[]{}  <>({})[]  <>({}[])  <>({[]})  <>([{}])  <>([]){}
<>([]{})  <>{()}[]  <>{()[]}  <>{([])}  <>{}()[]  <>{}([])  <>{}[()]
<>{}[]()  <>{[()]}  <>{[]()}  <>{[]}()  <>[(){}]  <>[()]{}  <>[({})]
<>[{()}]  <>[{}()]  <>[{}]()  <>[](){}  <>[]({})  <>[]{()}  <>[]{}()

回答:


6

Haskell、128バイト

fはメイン関数で、Intsのリストを取り、sのリストを返しますString

f=g.($zip"({[<"")}]>").zipWith replicate
g=max[""].(#g)
l#c=[b:s|x@(b,e):r<-l,s<-(r:filter(/=x:r)l)?(map(e:).c)]
l?c=c l++l#(?c)

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

使い方

  • f入力リストをタプルのリストのリストに変換します。各タプルはブラケットのペアを含み、各タイプのブラケットは独自のサブリストにあります。例えばに[1,2,0,0]なり[[('{','}')],[('[',']'),('[',']')]]ます。次にg、変換されたリストを呼び出します。
  • 残りの関数は、リスト操作と混在する部分継続渡しスタイルを使用します。各継続関数cは、l残りのブラケットタプルリストのリストを取得し、既に生成されているものに接尾辞を付ける可能な文字列のリストを返します。
  • g l内のすべての角かっこを使用して形成可能な完全に一致した文字列のリストを生成しlます。
    • これを行うにはl#g、いくつかの括弧で始まる文字列を生成するために呼び出します。recursive gパラメーター自体は、による継続として使用され#、最初の括弧付きサブ要素の後に来るものを生成します。
    • そのような文字列が存在しない場合(l中に角括弧が残っていないため)、g代わりに[""]、空の文字列のみを含むリストを返します。[""]により生成#可能なすべての空でないリストと比較するので、を適用することでこれを行うことができますmax
  • l#cl少なくとも1つの括弧で囲まれたサブ要素で始まる文字列を生成しc、要素に続くものを決定するために継続に任せます。
    • bそしてeタプルのブラケットの選択したペアでありx、そしてr同じブラケットタイプの残りのタプルのリストです。
    • r:filter(/=x:r)lあるlタプルをx取り出し、わずかに再配置。
    • ?間の可能なサブ要素を生成するために呼び出されるbとしますe。それはそれ自身の継続を取得します、それはによって生成された各サフィックス文字列にmap(e:).cプレフィックスeを付けますc
    • #それ自体は、およびbによって生成されたすべての文字列の先頭に頭文字を追加します。?c
  • l?cから0個以上のブラケットペアを使用して形成可能な完全に一致する文字列を生成し、残りの部分を処理lするために継続cします。c l一部は直接行きcながら、任意のサブ要素を追加することなく、l#(?c)用途は#1つのサブ要素を生成して呼び出すこと(?c)がさらに可能なもののために再帰的に。

4

ゼリー50 40 34 バイト

Leaky Nunのおかげで-6バイト(reduceができなかったところをreduceにした)

“()“{}“[]“<>”©ẋ"FŒ!QµW;®œṣF¥/µÐLÐḟ

プレーンで非効率的。

オンラインでお試しください!([1,1,1,1]のTIOでタイムアウト-はい、非効率的。)

どうやって?

形成される可能性のあるすべての文字列が削除されなくなるまで、隣り合った一致するブラケットのペアを再帰的に削除します。

“()“{}“[]“<>”©ẋ"FŒ!QµW;®œṣF¥/µÐLÐḟ - Main link: list: [n(), n{}, n[], n<>]
“()“{}“[]“<>”                      - literal ["()", "{}", "[]", "<>"]
             ©                     - copy to register
               "                   - zip with:
              ẋ                    -   repeat list
                F                  - flatten
                 Œ!                - all permutations (yeah, it's inefficient!)
                   Q               - de-duplicate
                    µ              - monadic chain separation
                                Ðḟ - filter discard if (non empty is truthy):
                             µÐL   -   loop until no change:
                       ®           -     recall value from register
                     W             -     wrap loop variable in a list
                      ;            -     concatenate
                           ¥/      -     reduce with last two links as a dyad:
                        œṣ         -       split left on occurrences of sublist on the right
                          F        -       flatten the result

1
evalトリックを使用する必要はありません...代わりにreduceを使用してください。35バイト
リーキー修道女

1
最初の行を2番目の行に移動する... 34バイト
リーキー修道女

@LeakyNunありがとう!試してみましたが、reduceを動作させることができませんでした(したがって、evalを使用することに頼りました)。
ジョナサンアラン

ニースは、私は同じアプローチを使用œṣ- F- µÐL多少関連の問題
ザカリー

3

Pyth- 83 74 71 63バイト

K("\[]""{}""\(\)""<>")Fd{.psm*:@Kd*\\2k@QdU4JdVldFHK=:JHk))I!Jd

それを試してみてください

1:Kc "[] {}()<>")Fd {.ps * VR \ KQJdVldFHK =:JHk))I!Jd

また、この53バイトバージョンはLeaky Nunのおかげです。

Kc"\[] \{} \(\) <>")Fd{.ps*V-R\\KQJdVldFHK=:JHk))I!Jd

ここに


Pythにbeatられたゼリー?この魔術とは何ですか?
数学中毒

@mathjunkie私はゼリーを負かしませんでした。入力構文を台無しにしました。
マリア

...と私は改善することができると思います:D
ジョナサン・アラン

@JonathanAllanもそう答えられます。
リーキー修道女

1
ステップ1:代わりに("\[]""{}""\(\)""<>")、私たちはc"\[] \{} \(\) <>")(空白で分割)。の代わりに:@Kd*\\2k-@Kd2つのバックスラッシュが続きます。次に、にマッピングする代わりにU4*V-R\\KQ2つの配列を並列に乗算します。最初の配列を使用して生成されるR、すなわち、-R\\kこれはあなたを与えるだろう54バイト版
漏れ修道女

2

05AB1E33 32 30 27 25バイト

Rileyのおかげで7バイト節約されました。

入力順は [(),<>,[],{}]

žu4äשJœJÙD[D®õ:DŠQ#]€g_Ï

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

説明

žu                             # push the string "()<>[]{}"
  4ä                           # split in 4 parts
    ©                          # store a copy in register
     ×                         # repeat each bracket a number of times decided by input
      JœJÙ                     # get the unique permutations of the string of brackets
          D                    # duplicate
           [                   # start infinite loop
            D                  # duplicate current list of permutations
             ®õ:               # replace any instance of (), [], <>, {} 
                               # with an empty string
                DŠ             # duplicate and move down 2 places on stack
                  Q#           # if the operation didn't alter the list, exit loop
                    ]          # end loop
                     €g        # get the length of each subtring
                       _Ï      # keep only the strings in the original 
                               # list of unique permutations 
                               # that have a length of 0 in the resulting list

1. :ベクトル化すると思います(無限ループのほとんどをスキップできます)。2. UX最初とX、ブラケットのリストが再び必要なときに使用するのは1バイト短くなります。
ライリー

@Riley::最初に試してみましたが、たとえば、すべてのを既に置き換えようとしているため、たとえばでの置き換え{}が可能な置き換えを作成するときに問題が発生し()ます()。約良い点UX。別のバイトも取得できます©®
エミグナ

Uトップをポップするという事実は常にイライラしていました。私は知りませんでした©®
ライリー

私はこの答えを見ていました。05AB1Eは、それを破壊する更新を取得しましたか、またはその回答は無効ですか?
ライリー

その答えは機能しますが[([]{})<{[()<()>]}()>{}]、機能しません[({})<{[()<()>]}()>{}]。唯一の違いは削除され[]ます。TNBでそれについて尋ねます。
ライリー

2

ルビー、123バイト

->a{"<>{}[]()".gsub(/../){$&*a.pop}.chars.permutation.map(&:join).uniq.grep /^((\(\g<1>\)|\[\g<1>\]|\{\g<1>\}|<\g<1>>)*)$/}

オンラインでお試しください!ただし、非効率的であるため、次のような入力でも[1,2,1,1]オンラインでタイムアウトになります。リストされたすべての例は、少なくとも機能します!

説明

->a{                                        # Procedure with input a
    "<>{}[]()".gsub(/../){                  # For all pairs of brackets
                          $&*a.pop          # Pop last item in input, then repeat
                                            #   the bracket pair by that number
                                  }.chars   # Get characters
        .permutation                        # All permutations of characters
                    .map(&:join)            # For each permutation, join the chars
                                .uniq       # Get unique permutations only
            .grep /^((\(\g<1>\)|\[\g<1>\]|\{\g<1>\}|<\g<1>>)*)$/}
                                            # Only return permutations that match
                                            #   this bracket-matching regex
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.