¿Puedo unir todos mis cables y adaptadores?


30

Suponga que un día está buscando en su gran caja de cables y adaptadores de computadora no utilizados (USB a USB mini, VGA a DVI, etc.). Hay cables enredados en todas partes que hacen un desastre, y te preguntas si podrías simplificar las cosas al unir todos los cables en un solo hilo y luego enrollarlos.

La pregunta es, ¿es posible conectar todos sus cables y adaptadores en una línea larga como esta? Obviamente, no siempre es posible, por ejemplo, si solo tuviera dos cables con enchufes completamente diferentes, no podrían conectarse entre sí. Pero si tuviera un tercer cable que pueda conectarse a ambos, entonces podría unir todos sus cables.

No le importa qué tipo de enchufes hay en los extremos del cordón de todos los cables. No necesitan conectarse entre sí para formar un bucle. Solo desea saber si es posible hacer el cordón de cable completo y, si es así, cómo hacerlo.

Reto

Escriba un programa o función que tome una cadena multilínea donde cada línea represente uno de los cables que posee. Un cable está formado por uno o más guiones ( -), con un enchufe en cada extremo. Un complemento siempre es uno de los 8 caracteres ()[]{}<>.

Estos son algunos cables válidos:

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

Pero estos no son:

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

Al conectar cables, solo se pueden conectar entre sí enchufes con exactamente el mismo tipo de soporte.

Estas son algunas conexiones de cable válidas:

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

Y estos no son válidos:

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

Si todos los cables de la entrada se pueden reorganizar y unir en una sola hebra larga, entonces envíe esa hebra a stdout en una línea (con una nueva línea final opcional). Cuando hay varias soluciones, puede elegir cualquiera de ellas para la salida. Si no es posible hacer un solo capítulo, no envíe nada (o envíe una cadena vacía con una nueva línea final opcional).


Por ejemplo, si la entrada es

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

la salida podría ser

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

donde todos los cables están unidos.

Sin embargo, si la entrada fuera

[-->
{---]

los cables no se pueden conectar, por lo que no habría salida.


Tenga en cuenta que los cables se pueden voltear tanto como sea necesario para hacer las conexiones. por ejemplo, [-->y <--]son efectivamente el mismo cable porque pueden hacer el mismo tipo de conexiones. Algunas salidas pueden depender de voltear los cables de entrada.


Por ejemplo

(-[
}--]

podría tener salida

(-[[--{

donde se voltea el segundo cable, o

}--]]-)

donde se voltea el primer cable.

(Tenga en cuenta que, en general, invertir toda la salida es válido porque es lo mismo que invertir inicialmente cada cable individualmente).


Las longitudes de los cables en la salida, por supuesto, deben coincidir con las longitudes de los cables de entrada correspondientes. Pero los cables pueden reordenarse y girarse tanto como desee para hacer que el cable esté completamente trenzado. La entrada siempre contendrá al menos un cable.

El código más corto en bytes gana.

Casos de prueba

Casos con salida:

[-->
{---]
>----{
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.

Casos sin salida:

[-->
{---]

[-]
[-]

(-]
]->
}-)

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

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

{--[
]--}

66
caja grande de cables y adaptadores de computadora sin usar Eso me hace sentir mejor, no soy el único. En realidad tengo varias de estas cajas.
Trauma digital

pero ¿y si enchufas un cable a sí mismo?
anOKsquirrel

¿Se garantiza que todos los cables sean válidos?
R. Kap

@ R.Kap Sí, lo son
Hobbies de Calvin

Respuestas:


10

Ilegible , 3924 bytes

Esta es la primera vez que implementé una estructura similar a la pila de llamadas en Unreadable.

(La primera versión de esto tenía más de 5300 bytes, solo para dar una idea de cuánto jugué al golf).

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

Explicación

Considere este ejemplo de entrada:

>--{
[---}

Durante la mayor parte de la ejecución, la cinta se presenta de la siguiente manera:

  • Las celdas 0 a 5 son ubicaciones para diversas variables.

  • La celda 6 en adelante contiene toda la información sobre el conjunto de cables en su caja:

    ejemplo de diseño de cinta

  • Las celdas restantes después del "terminador cero" contienen la pila. Cada "stackframe" es una celda individual que apunta a la primera celda de un cable (la celda de "enchufe de inicio"). En el ejemplo anterior, cuando el programa decide que ha encontrado una solución, la pila contendrá 6 (en referencia al >--{primer cable) y 21 (en referencia al {---]espejo del segundo cable).

El programa se desarrolla en tres etapas principales:

  1. Lea toda la entrada y genere la estructura anterior, incluidos todos los cables reflejados.
  2. Pruebe todas las combinaciones (pero pare si se encuentra una solución).
  3. Si se encuentra una solución, envíela.

La primera etapa (leer la entrada y generar la estructura de cables) solo usa las celdas n. ° 1 (que llamaré p) y n. ° 2 (que llamaré ch) y opera en un ciclo while de la siguiente manera:

  • Mientras condición: incremente pen 6, lea el siguiente carácter (comience a enchufar) en la celda *py verifique que no lo sea -1(EOF).

  • Lee los caracteres siguientes *(p+2)y cuéntalos *(p+1)hasta que encontremos algo que no sea -(guión). En ese punto, *(p+1)contendrá el número de guiones (longitud del cable) y *(p+2)el último carácter que no sea guión (el conector final). (También copiamos los caracteres de guión en la celda # 5 para que podamos acceder a este código ASCII más adelante en la etapa de salida).

  • En un bucle while, encuentre el enchufe del espejo y guárdelo *(p+3), luego incremente pen 2, hasta que *psea ​​cero. El bucle se ve así en pseudocódigo:

    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
    }
    
  • Este bucle siempre realizará dos iteraciones (el enchufe inicial y el enchufe final) y almacenará los resultados en la cuarta y sexta celda de este cable. Ahora, si prestó atención, se dará cuenta de que la sexta celda es, de hecho, la ubicación correcta para el enchufe final reflejado, pero el enchufe de inicio reflejado está en la celda etiquetada como "cable original que indica booleano". Esto está bien porque solo necesitamos que esta celda sea un valor distinto de cero.

  • Dado que pacaba de incrementarse un total de 4, ahora apunta a la celda etiquetada como "se está usando el cable indicador booleano". Establecer *(p+3)en el valor de *(p-1). Esto coloca el enchufe de inicio reflejado en el lugar correcto.

  • Lea (y descarte) un personaje más (que esperamos sea una nueva línea, pero el programa no verifica eso).

pinicialmente comienza en 0 pero se incrementa en 6 dentro de la condición while, por lo tanto, los datos del cable comienzan en la celda # 6. pse incrementa en 4 dentro del cuerpo del bucle y, por lo tanto, un total de 10 por cada cable, que es exactamente lo que necesitamos.

Durante la segunda etapa, las células # 0-4 están ocupadas por variables que voy a llamar a, p, q, m, y notdone. (La celda 5 todavía recuerda el código ASCII del guión).

Para prepararnos para la etapa 2, necesitamos *pvolver a poner a 0 (la celda etiquetada como "terminador cero") para que pueda actuar como el terminador para la lista de cables; también establecemos q(que es nuestro puntero de pila) a p+1(es decir, la celda después del "terminador cero"; aquí es donde comienza la pila); *qa 1 (el primer elemento en la pila; por qué 1 se hará evidente más adelante); y notdonepara 1. Todo esto se hace en una sola declaración:

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

La segunda etapa también es un ciclo while. Su condición es simple notdone. En cada iteración de ese ciclo while, cualquiera de las siguientes cuatro cosas podría suceder:

  1. Encontramos que todos los cables están marcados como "en uso". Esto significa que hemos encontrado una solución (que está representada por el contenido actual de la pila).
  2. Podemos avanzar *qa otro cable elegible (que marcamos rápidamente como "en uso" junto con su gemelo) y luego recurrir (es decir, crear un nuevo marco de pila).
  3. No podemos avanzar *qporque no existen más cables elegibles, por lo que debemos retroceder (eliminar un marco de pila y marcar el cable anterior y su gemelo como ya no "en uso").
  4. No podemos avanzar *qporque no existen más cables elegibles y no podemos retroceder porque hemos llegado al final de la pila. Esto significa que no hay solución.

El cuerpo del bucle verifica cada una de estas cuatro condiciones en este orden. Aquí están los detalles:

  1. Establezca my pen 1 y en un ciclo while, incremente pen 5 (iterando así a través de los cables) y verifique si *(p+4)("en uso") está configurado. Si no es así, ajústelo ma 0. Al final de ese ciclo, mnos dice si todos los cables están en uso. Si es así, ajústelo notdonea 0 para terminar el bucle principal. De lo contrario, continúe en el paso 2 a continuación.

  2. Ajústelo pa *q(el cable en la parte superior de la pila) y en un bucle while similar al anterior, incremente pen 5 para recorrer los cables. Comenzar en *qasegura que solo consideramos aquellos que no hemos considerado antes; sin embargo, recuerde que el valor inicial para un nuevo stackframe es 1, por lo que el primer cable examinado es el de la celda 6, que de hecho es el primer cable.

    Para cada cable, debemos verificar *(p+4)que no esté en uso y que sea *(q-1) cero (lo que significa que estamos en la parte inferior de la pila, por lo que no hay restricciones en el enchufe de inicio) o *p (el inicio del cable enchufe) es igual a *(*(q-1)+2)(el enchufe final del cable justo debajo de la pila). Comprobamos por la igualdad mediante el establecimiento ade *(*(q-1)+2)y mpara *p+1y luego disminuyendo tanto en un bucle while. El +1es porque mse disminuye dentro de la condición while, por lo que se disminuye una vez más que a. Si aes cero al final de esto, los dos enchufes son iguales.

    Por lo tanto, si *(q-1)fue cero o la comparación de igualdad tuvo éxito, el cable es elegible. Configure *qpara preemplazar el cable en la parte superior de la pila con el nuevo; se establece men lo mismo para indicar que encontramos un cable coincidente; y luego decremento p. Esa disminución es un pequeño truco para hacer que el ciclo while (iteración a través de los cables) termine antes; se incrementará pen 5 nuevamente, llevándolo así a la celda que contiene el indicador de "en uso" de este cable, y sabemos que es cero porque acabamos de verificar eso. Finalmente, después de la iteración del cable mientras iteramos, verificamos si mno es cero. Si es así, encontramos un cable coincidente y papuntamos a la bandera "en uso" para ese cable coincidente. Ajústelo a 1 para marcarlo como en uso. También establecer*(*(p-1) ? p+5 : p-5)a 1 para marcar su gemelo como en uso. Finalmente, incremente qy establezca el nuevo *qen 1 para crear un nuevo marco de pila.

  3. Si, después de la iteración del cable mientras iteramos, encontramos mque es cero, no hay más cables coincidentes, por lo que debemos retroceder. Disminuya qpara bajar la pila y verifique si todavía está apuntando a un cable (un valor distinto de cero). Si es así, marque ese cable y su gemelo como ya no están en uso. (Almacenamos el valor de *qin ppara acortar esta expresión en el código).

  4. Si, después de disminuir q, encontramos que apunta a un valor cero, entonces ese es el "terminador cero", lo que significa que hemos superado la pila. Concluimos que no hay solución. Ponemos notdonea 0 para terminar el ciclo principal.

La tercera etapa es la etapa de salida. Hay dos cosas que pueden suceder:

  • el bucle principal encontró una solución que necesitamos generar, o
  • El bucle principal concluyó que no hay solución y no mostramos nada.

Convenientemente, si no había solución, pes cero porque lo configuramos al valor de *qantes de verificar que sea cero; y si no era una solución, pestá apuntando a la “terminador cero”, ya que sólo itera a través de los cables, de modo que ahora podemos utilizar ppara iterar a través de la pila. Entonces, solo recorra la pila, generando para cada cable el conector de inicio ( *(*p)), los guiones (decrementando *(*p+1)en un bucle while; y usando el código ASCII de guiones almacenado en la celda # 5) y el conector final ( *(*p+2)). No importa que esto destruya la información del cable; ya no necesitamos eso.


3

CJam, 67

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

Pruébalo en línea

Nota: el enlace está utilizando el último código del repositorio (enviado pero aún no publicado), ya que contiene una corrección de errores.

Explicación:

El programa simplemente intenta todas las permutaciones y todas las orientaciones de los cables.

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

¿Quizás una explicación de cómo funciona exactamente?
Timwi

@Timwi ok, también jugué al golf un poco más
aditsu

Esta solución no es válida ya que no produce ninguna salida para la entrada (-] ]-> >-} }-) )-[ [-< <-{ {-(.
R. Kap

@ R.Kap resuelve esa entrada, pero ese intérprete en línea en particular tiene un tiempo de espera (y no dice nada al respecto). Puedes probarlo aquí en su lugar (y darle varios minutos) o utilizar el intérprete de Java (la más rápida)
aditsu

De hecho, el intérprete que vinculé anteriormente probablemente tomará mucho tiempo para resolver esa entrada. El intérprete de Java lo resuelve en menos de 1.5 minutos en mi computadora.
aditsu

2

JavaScript (ES6), 206

Función recursiva

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

Más legible

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

Prueba

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 bytes

Lejos de ser una solución optimizada, pero aquí hay un truco rápido en javascript (sin ecma5 sofisticado ni nada, porque no lo sé).

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, aquí está ... Estoy seguro de que al menos 2 para los bucles son innecesarios aquí y que la comprobación de una entrada de un solo elemento en la parte superior y una coincidencia de un solo elemento en la parte inferior es desagradable ... pero parece funcionar y procesa las entradas de prueba.

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
Puede cambiar el nombre de las funciones para guardar bastantes bytes. stackoverflow.com/questions/6156319/…
noɥʇʎԀʎzɐɹƆ

1
evite .charAt en cualquier versión de JavaScript. s.charAt(x)===s[x]
edc65

1

Python 3, 217 bytes

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]))

( Demo en Ideone )


¿Cómo toma esto entrada?
R. Kap

@ R.Kap En stdin, un cable por línea.
Anders Kaseorg

No parece, al menos cuando lo ejecuté.
R. Kap

Además, ¿qué tan rápido puede encontrar la respuesta correcta (-] ]-> >-} }-) )-[ [-< <-{ {-(?
R. Kap

@ R.Kap Vea la demostración en Ideone para ver un ejemplo de cómo toma datos y produce resultados. (Es posible que no funcione en Windows, si eso es lo que está tratando de hacer). Se ejecuta ~ instantáneamente en su caso de prueba. Sin embargo, hay casos que tomarán tiempo exponencial.
Anders Kaseorg

0

Lua, 477 bytes

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

Acepta cables como argumentos de línea de comando


0

Python 3.5, 448 432 427 424 286 311 bytes:

( +25 ya que hubo un error en el que la salida puede ser más larga de lo que debería ser para algunas entradas )

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''

¡Funciona perfectamente! excepto para entradas con 7 o más valores. Lleva mucho tiempo para ellos, muy probablemente porque debe pasar por todas esas permutaciones de la entrada más la entrada invertida . Intentaré arreglar esto si y cuando pueda, pero por ahora, esto parece ser lo suficientemente bueno. ¡Todo está bien ahora! Si sólo se pude utilizar de alguna manera que try-exceptel bloque en la lista por comprensión, podría ser un poco más corto, y buscar mucho más agradable. Sin embargo, ahora trabaja para todos los casos de prueba, y lo mejor de todo, se utiliza no hay importaciones! :)

Pruébalo en línea! (Ideone) (284 bytes aquí)

(Sugerencia: para probarlo, simplemente seleccione "bifurcación", y luego ingrese sus opciones, separadas por espacios , y seleccione "ejecutar")

Explicación

Básicamente, lo que está sucediendo es ...

  1. Se Bcrea una lista, a partir de la entrada dividiéndola en el espacio en blanco en sus "cordones" componentes.
  2. Mes una cadena que creé que, cuando se evalúa, devuelve una lista basada en la Bcual contiene todos los cables, pero esta vez al revés .
  3. La lista creada a partir de Mesta última se concatena consigo Bmisma para crear una lista f, con todas las orientaciones posibles de los "cables".
  4. Se dcrea otra lista, que se inicializará con el primer valor (valor f[0]) de f.
  5. Finalmente, todos los valores en dse repiten, y el último carácter de cada valor se compara con el primer carácter de cada elemento f, y cuando se encuentra una coincidencia, ese carácter aparece (o se elimina) y se devuelve de la lista f. Esto sucede hasta que IndexErrorse levanta a, o la longitud de la lista dexcede By a NameErrorse levanta después de la llamada a E, ambos se manejan, y luego del contenido de la lista se une en una cadena y se devuelve siempre que la longitud de la lista dsea ​​mayor igual o igual a la longitud de la lista B. De lo contrario, se devuelve una cadena vacía ( ''), ya que dno tiene la misma longitud que Bsignifica que todos los "cables" en la listaB no se puede unir en un "cordón" largo.

@KennyLau ¿Qué cambiaste? Por lo que puedo ver, acabas de agregar <!-- language: lang-python -->. ¿Qué cambia eso?
R. Kap

Eso puede habilitar el resaltado de sintaxis para su código.
Leaky Nun

@KennyLau Wow, eso es genial. Me preguntaba cómo haría eso en PPCG. ¡Ahora sé! ¡Gracias! :)
R. Kap
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.