すべてのコードとアダプターを一緒につなげることはできますか?


30

ある日、未使用のコンピューターコードとアダプター(USBからUSB mini、VGAからDVIなど)の大きな箱を掘っていると仮定します。絡み合ったコードがいたるところに散らかっているので、すべてのコードを1本の長いストランドにまとめて、それを巻き上げるだけで物事を単純化できるかどうか疑問に思います。

問題は、すべてのコードとアダプターをこのように1本の長いラインで接続することは可能ですか?明らかに、常に可能なわけではありません。たとえば、プラグがまったく異なる2本のコードしかない場合、それらを接続できませんでした。しかし、両方に接続できる3つ目のコードがあれば、すべてのコードをつなぎ合わせることができます。

全コードより線の端にあるプラグの種類は気にしません。ループを形成するために互いに接続する必要はありません。あなたは、すべてのコードのストランドを作ることが可能かどうか、可能であれば、それをどのように行うかを知りたいだけです。

チャレンジ

すべての行が所有するコードの1つを表す複数行の文字列を取り込むプログラムまたは関数を作成します。コードは、1つ以上のダッシュ(-)で構成され、両端にプラグが付いています。プラグは常に8文字の1つです()[]{}<>

これらはいくつかの有効なコードです:

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

しかし、これらはそうではありません:

-->
(--
)--
[{
---

コードを接続する場合、まったく同じブラケットタイプのプラグのみを接続できます。

したがって、これらは有効なコード接続です。

...---((---...
...---))---...
...---]]---...
...---{{---...
...---<<---...

そして、これらは無効です。

...---()---...
...---)(---...
...---{]---...
...---{[---...
...---><---...
...--->)---...

入力内のすべてのコードを並べ替えて1つの長いストランドにまとめて接続できる場合は、そのストランドを1行のstdoutに出力します(オプションの末尾の改行を使用)。複数のソリューションがある場合、それらのいずれかを選択して出力できます。単一のストランドを作成できない場合は、何も出力しません(または、オプションの末尾の改行を含む空の文字列を出力します)。


たとえば、入力が

[-->
{---]
>----{

出力は

[-->>----{{---]

すべてのコードが一緒に張られています。

ただし、入力が

[-->
{---]

コードは接続できないため、出力はありません。


接続に必要なだけコードをひっくり返すことができることに注意してください。例えば[-->とは<--]、彼らが接続の同じ種類を作ることができるので、効果的に同じコードです。一部の出力は、入力コードの反転に依存する場合があります。


例えば

(-[
}--]

出力できる

(-[[--{

2番目のコードが反転している場所、または

}--]]-)

最初のコードが反転します。

(一般に、最初にすべてのコードを個別にフリップするのと同じであるため、出力全体をフリップすることは有効です。)


もちろん、出力のコードの長さは、対応する入力コードの長さと一致する必要があります。しかし、コードを並べ替えて、必要なだけひっくり返して、オールコードのストランドを作ることができます。入力には常に少なくとも1本のコードが含まれます。

バイト単位の最短コードが優先されます。

テストケース

出力のあるケース:

[-->
{---]
>----{
gives
[-->>----{{---]
or
[---}}----<<--]

(-[
}--]
gives
(-[[--{
or
}--]]-)

(-)
gives
(-)

[--{
gives
[--{
or
}--]

[-]
]-[
gives
[-]]-[
or
]-[[-]

[----->
)------------[
{--<
}---)
could give
[----->>--}}---))------------[
or
>--}}---))------------[[----->
or
}---))------------[[----->>--}
or
{--<<-----]]------------((---{
etc.

>-->
>->
>--->
could give
>-->>->>--->
or
>--->>-->>->
or
>->>-->>--->
or
<--<<---<<-<
etc.

(-]
]->
>-}
}-)
)-[
[-<
<-{
{-(
could give
(-]]->>-}}-))-[[-<<-{{-(
or
{-((-]]->>-}}-))-[[-<<-{
or
<-{{-((-]]->>-}}-))-[[->
etc.

出力のないケース:

[-->
{---]

[-]
[-]

(-]
]->
}-)

>->
>-->
]---]

[-------------------]
]-------------------[
[-----------------]
[-----------------]

{--[
]--}

6
未使用のコンピューターコードとアダプターの大きな箱 それは私が気分が良くなる-私だけではありません。実際、私はこれらの箱をいくつか持っています。
デジタル外傷

しかし、コードをそれ自体に接続するとどうなりますか?
anOKsquirrel

コードはすべて有効であることが保証されていますか?
R. Kap

@ R.Kapはい、そうです
カルビンの趣味

回答:


10

読み取り不可、3924バイト

これは、Unstackで呼び出しスタックのような構造を実装したのは初めてです。

(これの最初のバージョンは、5300バイト以上でした。これは、私がどれだけゴルフをしたかを知るためです。)

'"" "" "'" "'" "" "" "'" "" "" "'" ""' "" '""' "" '""' "" '""' "" "" " "" "" "" "" "" "" "'" "'" "" "" "" "" "" "" "" "" "" "" "" '"" ""' "" "" "" '"" "" "'" "'" "'" "'" "'" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""' "" "" "" "" "" "" "" "" "'" "" "" "" "'" "" "" "" "" "" "" "" "'" "" "" "" " "'" "" "" "" "" "" "" "" "" "" "" "" ""' "" "" "" "" "" "" "" "" "'"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" '"" "" "" ""' "" "" "" "" "" "" "" "" '"" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" ""' "" "" "" "" '""" "" "" "" "" "" "" "" "" "" "" "" '"" "" "" "" "" "" "" ""' "" "" "" " "" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""' "" "" "" "" '"" "" "" ""' "" "" "" '""' "" '"" "" "" "'" "" '"" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" '""' "" '""' "" " '"" "" "" "" ""' "" '"" "" "" "'" "" '"" "" ""' "" '"" "" "" "'" "" '" "'" "" "" "" "" "" "" "" ""' "" "'" "" "" "" "" "" "" "'" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" '' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" "" ""' "" "" "" "" "" "" "" "" '""" "" "" "" "" "" "" "" "" "" "" "" '"" "" "" "" "" "" "" ""' "" "" "" " "" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""' "" "" "" "" '"" "" "" ""' "" "" "" "" '"" "" "" ""' "" "" "" "" '"" """ "" "" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" "" "'" "" """" '"" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" "" "" "" "'" "" "" "" " '""' "" "'" "" "" "" ""' "" "" "" '""' "" "" "" "" "" "'" "" "" "" "' "" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" ""' "" "" "" "" '"""" "" "" '"" "" "" ""' "" "" "" "" '"" "" "" "" "" "" "" ""' "" "" "" "" "'" "" "" "" "" "" "" "" "'" "" "" "" "'" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "'" "'" "" '"" "" "" "" "" "" "" "" ""' "" "'""" "" "" "" "" "" "" "" "" "" "" "" '"" "" "" "" "" "" "" ""' "" "" "" " "" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""' "" "" "" "" '"" "" "" ""' "" "" "" "" '"" "" "" ""' "" "" "" "" '"" """ "" "" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" '"" "" "" ""' "" "" "" "" "" "" "" "" "" '"" "'"" "" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" "" '"" "" "" ""' "" "" "" "" '"" "" "" ""' "" "" "" "" '"" "" "" ""'"" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" ""' '" "" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" "" "" "" "" "'" """ "" "" '"" "" "" "'" "'" ""' "" "" "" "" "" "" "" "" "'" "" "" "'" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" '""' "" "" "" "' "" "" "" "" "" "'" "'" "'" "" "" ""' "" "" "" "" "" "'" "" "" "" "'"" "" "" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" ""' "" "" "" "" "" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" "" "" "" "" "" '"" "" "" "'" "" '"" "" "" "" ""' "" "" "" '"" "" "" "" "" "'" "" "" "" "" "" "" ""' "" '""' "" '"" "'" "" "" "'" " "" "" '"" "" ""' "" '"" "" "" "'" "" '"" "" "" "" "" "" "" "" ""' "" '"" "" "" "" "" "" "" "" "" "" ""' "" '""' "" "'" "" "" "'" "" '"""'" "" "" "" "" "" ""' "" "" "" '"" "'" "" "" "" "" "'" "'" "" "" "" ' "" "" "" "" "" "" '"" "" "" "" ""' "" '"" "" "" "" "" ""' "" "" "" "' "" "" "" "" "" "" '"" "" "" "" "" ""' "" "" "" "" "" "" '"" "" "" "'"" "" "" "" "" "" "" "'" "'" "'" "'" "" "" "" "" "" "'" "'" "" "'" " "" '"" "" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" " '"" "" ""' "" "'" "'" "'" "'" "'" "'" "" "" "" "" "" '"" "" "" "" "'"" "" "" "'" "'" "'" "'" "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" ""' "" "" '"" ""' " "" "" "'" "" "" "" "'" "" '"" "" "" "'" "'" "'" "" "" "" '"" "" """" "" "" "" "'" "'" "" "" "" "" '""' "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" "" "" "'" "" "" "" "'"" "" "" "" "" "" "" "" "" "" "" "" "" "" "'" ""' "" "'" ""' "" "" "" '" "" '"" "" "" "" "" "" "" "" "" ""' "" "'" "" "" "" "" "" ""' "" '"" "" '"" "" "" "'" "" '"" "'" "" "" "" "" '"" "" "" "" ""' "" '"" "'" """ "" "" "" "" '""' "" "'" "'" "" "" "" "" "" "" "" "" "" "'" "" "" "" "'" ""' "" "" "" '"" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "'" " "'" "'" "" "" '""' "" '"" "" "" "'" "" '"" "" "" "" "" "" "" ""'"" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" "" "" "" "'" "" "" "" " "" '"" "" "" "" ""' "" "" "" "'" "" "" "'" "'" ""' "" "" "" "" "" "" "" "" '""' "" "'" "" "" "'" "'" "'" "'" "'" "" "" "" '"" "'" "" "" "'"" "" "" "" "'" "" "" "" '"" "" "'" "'" "" "" "" "" "" "" "" "" ""' " "'" "'" "" "" '""' "" '"" "" "" "'" "" '"" "" "" "" "" "" "" "" ""' ' "" "" "" "'" ""' "" "" "" '""' "" '""' "" "" "" "" "" "" '"" "'" """ "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "' "" "" "" "" "" "" "'" "" "" "" "" "" ""' "'" "" "" ""' "" "" "" "" "" " "" "" "" "" "" "" "'" "'" "" "" "'" "'" "" "" "'" "" "" ""' "" "'"" "" "" ""' "" "" "" "'" "" "" "" "" "'" "" "" "" '"" "'" '"" "" "" "" '""' "" '""' "" '"" "'" '"" "" "" "'" "'" "'" "" "" "" '"" "" "" "'" "" '"" "'"" "" "" "" ""' "" '""' "" "" "" '"'" "" "" "" "" "'" "'" "" "" "" '" "" "" "" '"" "'" ""'"" "" "" "" ""' "" '""' "" "" "" '"'" "" "" "" "" "'" "'" "" "" "" '" "" "" "" '"" "'" ""

説明

次の入力例を検討してください。

>--{
[---}

ほとんどの実行を通じて、テープは次のようにレイアウトされます。

  • セル0〜5は、さまざまな変数の場所です。

  • セル6以降には、ボックス内のケーブルセットに関するすべての情報が含まれています。

    テープレイアウトの例

  • 「ゼロターミネータ」の後の残りのセルにはスタックが含まれます。各「スタックフレーム」は、ケーブルの最初のセル(「開始プラグ」セル)を指す単一のセルです。上記の例では、プログラムが解決策を見つけたと判断すると、スタックには6(>--{最初のケーブルを参照)と21({---]2番目のケーブルのミラーを参照)が含まれます。

プログラムは、3つの主要な段階で進行します。

  1. 入力全体を読み取り、すべてのミラーケーブルを含む上記の構造を生成します。
  2. すべての組み合わせを試します(ただし、解決策が見つかった場合は停止します)。
  3. ソリューションが見つかった場合、それを出力します。

最初の段階(入力の読み取りとケーブル構造の生成)では、セル#1(これを呼び出すp)と#2(私が呼び出すch)のみを使用し、次のようにwhileループで動作します。

  • while条件:p6 ずつインクリメントし、次の文字(開始プラグ)をcell *pに読み込み、それが-1(EOF)でないことを確認します。

  • 後続の文字を*(p+2)に読み込み*(p+1)-(ハイフン)以外の文字に遭遇するまでそれらをカウントします。その時点で、*(p+1)ハイフンの数(ケーブルの長さ)と*(p+2)最後の非ハイフン文字(終了プラグ)が含まれます。(ハイフン文字もセル#5にコピーするので、出力ステージの後半でこのASCIIコードにアクセスできます。)

  • whileループで、ミラープラグを見つけてに保存し*(p+3)、ゼロpになるまで2 ずつ増やし*pます。擬似コードでは、ループは次のようになります。

    while (ch = *p) {
        *(p+3) = (ch -= 40) ? (ch -= 1) ? (ch -= 19) ? (ch -= 31) ? ch-32 ? *p-2 : *p+2 : *p+2 : *p+2 : *p-1 : *p+1
        p += 2
    }
    
  • このループは常に2回の反復(開始プラグと終了プラグ)を実行し、このケーブルの4番目と6番目のセルに結果を保存します。ここで、注意を払えば、6番目のセルが実際にミラー化されたエンドプラグの正しい場所であることに気付きますが、ミラー化されたスタートプラグは「booleanを示す元のケーブル」というラベルのセルにあります。このセルはゼロ以外の値である必要があるだけなので、これは問題ありません。

  • 以来、pわずか4の合計をインクリメントしており、それは今や「ブール示すケーブルが使用されている」とラベル付けされた細胞を指します。*(p+3)の値に設定します*(p-1)。これにより、ミラー化された開始プラグが適切な場所に配置されます。

  • もう1文字を読み取ります(そして破棄します)(これは改行であると予想されますが、プログラムはそれをチェックしません)。

p最初は0から始まりますが、while条件内で6ずつ増加するため、ケーブルデータはセル#6から始まります。pループ本体内で4ずつ増加するため、ケーブルごとに合計10が必要になります。

第二段階では、細胞#0-4が、私は電話するよという変数によって占有されているapqm、とnotdone。(セル#5は、まだハイフンのASCIIコードを記憶しています。)

ステージ2の準備をするに*pは、ケーブルのリストのターミネーターとして機能できるように、0(「ゼロターミネーター」というラベルが付いたセル)に戻す必要があります。また、q(スタックポインターである)に設定しますp+1(つまり、「ゼロターミネーター」の後のセル。これがスタックの開始位置です)。*q1(スタックの最初のアイテム。1が後で明らかになる理由)。そしてnotdone1。これはすべて単一のステートメントで行われます。

*p = (notdone = *(q = p+1) = 1)-1

2番目のステージもwhileループです。その状態は単純notdoneです。whileループの各反復では、次の4つのいずれかが発生する可能性があります。

  1. すべてのケーブルに「使用中」のマークが付いています。これは、解決策(現在のスタックの内容で表される)が見つかったことを意味します。
  2. 我々は進めることができます*q(私たちは速やかにその双子と一緒に「使用中」としてマークされた)別の資格ケーブルにして、再帰的(すなわち、新たなスタックフレームを作成します)。
  3. それ*q以上の適格なケーブルが存在しないため、先に進むことができません。そのため、バックトラックする必要があります(スタックフレームを削除し、以前のケーブルとそのツインを「使用中でない」とマークします)。
  4. 私たちは進めることができません*qそれ以上の適格なケーブルが存在しないため、我々はバックトラック我々はスタックの底に達していることができないため。これは、解決策がないことを意味します。

ループ本体は、これら4つの条件のそれぞれをこの順序でチェックします。詳細は次のとおりです。

  1. mand pを1に設定し、whileループで、p5 ずつ増やし(ケーブルを反復処理)、*(p+4)(「使用中」)が設定されているかどうかを確認します。そうでない場合は、m0 に設定mします。そのループの終わりに、すべてのケーブルが使用されているかどうかを通知します。その場合、notdone0に設定してメインループを終了します。それ以外の場合は、以下の手順2に進みます。

  2. (スタックの最上部のケーブル)に設定p*q、上記と同様のwhileループで、p5 ずつ増やしてケーブルを反復処理します。で開始*qすると、まだ考慮していないもののみが考慮されます。ただし、新しいスタックフレームの初期値は1であるため、最初に調べたケーブルはセル6のケーブルであり、実際に最初のケーブルです。

    各ケーブルについては、我々はチェックする必要があり*(p+4)、それがすでに使用中ではないこと、また、ことを確認するために、どちらかの *(q-1)(私たちは、スタックの一番下にいるという意味なので、スタート・プラグには制約がありません)がゼロである、または *p(ケーブルの開始をプラグ)*(*(q-1)+2)(スタックのすぐ下のケーブルの端のプラグ)と等しい。私たちは、設定することによって、等価性をチェックaする*(*(q-1)+2)m*p+1た後、whileループの両方を減少します。これ+1m、while条件内でデクリメントされるためですaaこの最後でがゼロの場合、2つのプラグは等しくなります。

    したがって、いずれか*(q-1)がゼロであるか、等値比較が成功した場合、ケーブルは適格です。に設定*qpて、スタックの上部のケーブルを新しいものと交換します。m同じに設定して、一致するケーブルが見つかったことを示します。そして、デクリメントしますp。この減少は、whileループ(ケーブルを反復処理する)を早期に終了させるための小さなトリックです。p再び5 増加し、このケーブルの「使用中」フラグを含むセルに移動します。チェックしただけなので、ゼロであることがわかります。最後に、ケーブル反復whileループの後、mゼロでないかどうかを確認します。その場合、一致するケーブルが見つかり、その一致するケーブルpの「使用中」フラグを指しています。1に設定して、使用中としてマークします。また設定*(*(p-1) ? p+5 : p-5)ツインを使用中としてマークするには1に設定します。最後に、新しいスタックフレームを作成するためにq、new *qをインクリメントして1に設定します。

  3. ケーブル反復whileループの後、mゼロであることがわかった場合、一致するケーブルがなくなるため、バックトラックする必要があります。デクリメントは、qそれはまだケーブル(非ゼロ値)を指していた場合、スタックを下に移動して確認してください。その場合は、そのケーブルとそのツインが使用されていないことをマークします。(この式をコードで短くするために*qin の値を格納pします。)

  4. デクリメントした後q、それがゼロ値を指していることがわかった場合、それは「ゼロターミネーター」であり、スタックをアンダーランしていることを意味します。解決策はないと結論付けます。notdoneメインループを終了するには、0に設定します。

3番目のステージは出力ステージです。発生する可能性のある2つのことがあります。

  • メインループが出力する必要がある解決策を見つけた、または
  • メインループは解決策がないと結論付け、何も出力しません。

便利なことに解がなかった場合、pゼロを*qチェックする前に値を設定するため、ゼロになります。そして、解決策あればp、ケーブルを介して繰り返したので、「ゼロターミネータ」を指しているのでp、スタックを繰り返し使用することができます。したがって、スタックを反復処理して、各ケーブルに開始プラグ(*(*p))、ハイフン(*(*p+1)whileループでデクリメントすることにより、セル#5に格納されたハイフンASCIIコードを使用)、および終了プラグ(*(*p+2))を出力します。これがケーブル長情報を破壊することを気にしないでください。もう必要ありません。


3

CJam、67

qN%e!{_,2,m*\f{.{_{"()[]{}<>--"_@#1^=}%W%?}_2ew{~\W=#}%0-{;}&}~}%1<

オンラインで試す

注:リンクにはバグ修正が含まれているため、リポジトリの最新のコード(プッシュされているがまだリリースされていない)を使用しています。

説明:

プログラムは、単にコードのすべての順列とすべての方向を試します。

qN%             read the input and split into lines
e!              generate all permutations
{…}%            map each permutation of cords
  _,            get the number of cords (n)
  2,m*          generate all patterns of n bits (cartesian power of [0 1])
  \f{…}         for each bit pattern and the cord permutation
    .{…}        apply the block to each bit and cord (flipping cords for bit 0)
      _         duplicate the cord
      {…}%      map each character of the cord
        "…"_    push the string of all the plugs (and 2 dashes) and duplicate it
        @#      get the index of the character in the string
        1^      XOR with 1
        =       get the character at this new index (plugs get toggled)
      W%        reverse the cord
                 the stack now has the bit, the original cord and the flipped cord
      ?         if the bit is 1, use the original cord, else use the flipped one
    _           duplicate the array of cords
    2ew         get all pairs of adjacent cords
    {…}%        map each pair of cords
      ~\        dump the 2 cords on the stack and swap them
      W=        get the right plug of the first cord
      #         find its position in the second cord (if 0, we have a match)
    0-          remove all the zeros
    {…}&        if the array is not empty (i.e. we have a mismatch)
      ;         pop the array of cords
  ~             dump all the results for this permutation on the stack
                 (to avoid nested arrays)
1<              get the first result (if any) from the array of all results

おそらくそれが正確にどのように機能するかの説明ですか?
ティムウィ

@Timwi OK、もう少しゴルフをしました
-aditsu

このソリューションは、入力に対して出力を生成しないため無効(-] ]-> >-} }-) )-[ [-< <-{ {-(です。
R.ガプス

@ R.Kapはその入力を解決しますが、その特定のオンラインインタープリターにはタイムアウトがあります(そして、それについては非常に静かです)。代わりにここで試して(数分与えて)、Javaインタープリターを使用して(最速)
aditsu

実際、上でリンクしたインタープリターは、おそらくその入力を解決するのに長い時間がかかるでしょう。Javaインタプリタの私のコンピュータ上で、1.5未満分で解くこと。
-aditsu

2

JavaScript(ES6)、206

再帰関数

f=(l,a=l.pop(),x=x=>(z='<>[]{}()')[z.indexOf(x)^1])=>l[0]?l.some((b,i)=>r=[b,x([...b].pop())+b.slice(1,-1)+x(b[0])] .some(b=>r=a[0]==[...b].pop()?b+a:b[0]==[...a].pop()?a+b:0)&&(l=[...l],l[i]=r,f(l)))?r:'':a

より読みやすい

f=(l,a=l.pop(),x=x=>(z='<>[]{}()')[z.indexOf(x)^1])=>
  l[0]?
  l.some((b,i)=>
     r=[b,x([...b].pop())+b.slice(1,-1)+x(b[0])]
     .some(b=>r=a[0]==[...b].pop()?b+a:b[0]==[...a].pop()?a+b:0)
     &&(l=[...l],l[i]=r,f(l))
    )?r:''
 :a

テスト

f=(l,a=l.pop(),x=x=>(z='<>[]{}()')[z.indexOf(x)^1])=>l[0]?l.some((b,i)=>r=[b,x([...b].pop())+b.slice(1,-1)+x(b[0])] .some(b=>r=a[0]==[...b].pop()?b+a:b[0]==[...a].pop()?a+b:0)&&(l=[...l],l[i]=r,f(l)))?r:'':a

console.log=(...x)=>O.textContent+=x+'\n'

;[
 //OK
 ['[-->','{---]','>----{']
,['(-[','}--]']
,['(-)']
,['[--{']
,['[-]',']-[']
,['[----->',')------------[','{--<','}---)']
,['>-->','>->','>--->']
,['(-]',']->','>-}','}-)',')-[','[-<','<-{','{-(']
 //KO
,['[-->','{---]']
,['[-]','[-]']
,['(-]',']->','}-)']
,['>->','>-->',']---]']
,['[-------]',']-------[','[-------]','[---------]'] // shortened a little,
,['{--[',']--}']
].forEach(t=>{
  console.log(t+' : "'+f(t)+'"\n')
})
<pre id=O></pre>


1

Javascript、800バイト

最適化されたソリューションとはほど遠いですが、ここではjavascriptで簡単にハックします(派手なecma5などはありません。私は知らないので)。

function a(r){function t(r,t){var n=r.slice();return n.splice(t,1),n}function n(r){var t,n={"[":"]","]":"[",">":"<","<":">","(":")",")":"(","{":"}","}":"{"},e=r.split("").reverse();for(t=0;t<e.length;t++)n.hasOwnProperty(e[t])&&(e[t]=n[e[t]]);return e.join("")}function e(r,t){return r.unshift(t),r}var h,u,f=[];if(1==r.length)return r[0];for(h=0;h<r.length;h++){var l=r[h],i=t(r,h),c=l.charAt(0),g=l.charAt(l.length-1);for(u=0;u<i.length;u++){var o=i[u],s=o.charAt(0),p=o.charAt(o.length-1);c==p&&f.push(e(t(i,u),o+l)),g==s&&f.push(e(t(i,u),l+o)),o=n(o),s=o.charAt(0),p=o.charAt(o.length-1),c==p&&f.push(e(t(i,u),o+l)),g==s&&f.push(e(t(i,u),l+o))}}if(f.length<1)return!1;for(h=0;h<f.length;h++){if(1===f[h].length)return f[h][0];f[h]=a(f[h])}for(h=0;h<f.length;h++)if(f[h]!==!1)return f[h];return!1}

Ungolfed、ここにあります...ここでは少なくとも2つのforループが不要であり、上部の単一要素入力と下部の単一要素一致のチェックは難しいと確信していますが...テスト入力を処理します。

function a(inputs)
{
	var i, ii, matches = [];
	if (inputs.length == 1) {
		return inputs[0];
	}
	// For each of the elements in inputs (e1)
	for (i = 0; i < inputs.length; i++) {
		var e1 = inputs[i],
			others = except(inputs,i),
			e1s = e1.charAt(0),
			e1e = e1.charAt(e1.length-1);
		// Compare to each of the other elements in inputs (e2)
		for (ii = 0; ii < others.length; ii++) {
			// get the start and end of the elements to compare (e1s,e1e,e2s,e2e)
			var e2 = others[ii],
				e2s = e2.charAt(0),
				e2e = e2.charAt(e2.length-1);
			// if any of them match up (e1s == e2e || e1s == e2s || e1e == e2s || e1e = e2e)
			// Make a new array of inputs containing the joined elements (as a single element) and all other elements which might join with them
			if (e1s == e2e) {
				matches.push(addTo(except(others,ii),e2+e1));
			}
			if (e1e == e2s) {
				matches.push(addTo(except(others,ii),e1+e2));
			}
			e2 = flip(e2);
			e2s = e2.charAt(0);
			e2e = e2.charAt(e2.length-1);
			if (e1s == e2e) {
				matches.push(addTo(except(others,ii),e2+e1));
			}
			if (e1e == e2s) {
				matches.push(addTo(except(others,ii),e1+e2));
			}
		}
	}

	if (matches.length < 1) {
		return false;
	}

	for (i = 0; i < matches.length; i++) {
		if (matches[i].length  === 1) {
			return matches[i][0];
		} else {
			matches[i] = a(matches[i]);
		}
	};

	for (i = 0; i < matches.length; i++) {
		if (matches[i] !== false) {
			return matches[i];
		}
	};

	return false;

	function except(list,idx)
	{
		var newList = list.slice();
		newList.splice(idx,1);
		return newList;
	}
	function flip(s) {
		var replacements = {
			'[':']',
			']':'[',
			'>':'<',
			'<':'>',
			'(':')',
			')':'(',
			'{':'}',
			'}':'{'
		}, i, a = s.split('').reverse();
		for (i = 0; i < a.length; i++) {
			if (replacements.hasOwnProperty(a[i])) {
				a[i] = replacements[a[i]];
			}
		}

		return a.join('');
	}
	function addTo(arr,newEl)
	{
		arr.unshift(newEl);
		return arr;
	}
}


1
関数の名前を変更して、かなりのバイト数を節約できます。stackoverflow.com/questions/6156319/...
noɥʇʎԀʎzɐɹƆ

1
JavaScriptのどのバージョンでも.charAtを避けてください。s.charAt(x)===s[x]
edc65

1

Python 3、217バイト

from itertools import*
a='()[]{}<>'
all(any(c[-1]!=d[0]for c,d in zip(q,q[1:]))or print(''.join(q))for p in permutations(open(0))for q in product(*[(c[:-1],a[a.find(c[-2])^1]+c[-3:0:-1]+a[a.find(c[0])^1])for c in p]))

Ideoneのデモ


これはどのように入力を取りますか?
R. Kap

@ R.Kap stdinでは、1行に1コード。
アンデルスカセオルグ

少なくとも私がそれを実行したときには、そうではないようです。
R.ガプス

また、どのくらい早く正解を見つけることができ(-] ]-> >-} }-) )-[ [-< <-{ {-(ますか?
R.ガプス

@ R.Kap入力を取得して出力を生成する例については、Ideoneのデモを参照してください。(それがあなたがやろうとしているのであれば、それはWindowsでは動作しないかもしれません?)それはあなたのテストケースで即座に実行されます。もちろん、指数関数的な時間がかかる場合もあります。
アンデルスカセオルグ

0

Lua、477バイト

function r(s)return s:reverse():gsub("[()%[%]{}<>]",{["("]=")",[")"]="(",["["]="]",["]"]="[",["{"]="}",["}"]="{",["<"]=">",[">"]="<"})end
function a(c,b)for i, v in next,b do
m=c:sub(-1,-1)n=v:sub(1,1)o=r(c):sub(-1,-1)p=r(v):sub(1,1)l=table.remove(b,i)if m==n then
return a(c..v,b)elseif o==n then
return a(r(c)..v,b)elseif m==p then
return a(c..r(v),b)elseif o==p then
return a(r(c)..r(v),b)end
table.insert(b,i,l)end
return#b>0 and""or c
end
print(a(table.remove(arg,1),arg))

コマンドライン引数としてコードを受け入れます


0

Python 3.5、448 432 427 424 286 311バイト:

+25は、一部の入力の場合よりも出力が長くなる可能性があるバグがあったため

def g3(z):
 B=z.split();M='i[::-1].translate({41:40,40:41,125:123,123:125,62:60,60:62,93:91,91:93})';f=B+[eval(M)for i in B if eval(M)not in B];d=[f.pop(0)]
 for h in d:
  try:[d.append([f.pop(f.index(c))for c in f if h[-1]==c[0]][0])if len(d)<len(B)else E]
  except:break
 return''.join(d)if len(d)>=len(B)else''

完全に動作します!7以上の値を持つ入力を除きます。それらには長い時間がかかります。おそらく、入力と入力のすべての順列を通過する必要があるためです。反転のです。可能であればいつでもこれを修正しようとしますが、今のところ、これで十分なようです。すべては今いいです!場合にのみ、私は何とかその使用できるtry-exceptリストの内包でブロックを、それが少し短く、そして見ることができる多くのよりよいが。それにもかかわらず、すべてのテストケースで機能するようになり、何よりもインポートを使用しません!:)

オンラインでお試しください!(Ideone)(ここでは284バイト)

(ヒント:試してみるには、「fork」を選択してから、選択肢を入力し、スペースで区切り、「run」を選択します)

説明

基本的に、何が起こっているのですか...

  1. リストはB、空白でコンポーネント「コード」に分割することにより、入力から作成されます。
  2. M私が作成した文字列は、評価されると、Bすべてのコードを含むリストに基づいてリストを返しますが、今回は逆向きです。
  3. から作成されたリスト Mは、最終的にBそれ自体と連結f、「コード」の考えられるすべての方向を持つリストを作成します。
  4. 別のリスト、 dが作成されます。これはの最初の値(値f[0])で初期化されfます。
  5. 最後に、のすべての値dが反復処理され、各値の最後の文字がの各要素の最初の文字と比較され、f一致が見つかると、その文字がポップ(または削除)されてlistから返されますf。までこれが発生IndexError上昇させる、またはリストの長さをd超えたBNameErrorの呼び出しの後に上昇させE、処理されどちらも、リストdの内容が文字列に参加し、長いリストの長さとしてとして返されるd複数でありますlistの長さ以上B。それ以外の場合、空の文字列が返されます('')。これdB、リスト内のすべての「コード」と同じ長さではないためです。B 1つの長い「コード」に結合することはできません。

@KennyLau何を変えましたか?私が見ることができるものから、あなたはちょうど追加しました<!-- language: lang-python -->。それは何を変えますか?
R. Kap

これにより、コードの構文強調表示を有効にできます。
リーキー修道女

@KennyLauうわー、それはクールです。私はPPCGでそれをどのように行うのだろうと思っていました。今私は知っている!ありがとうございました!:)
R. Kap
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.