Posso amarrar todos os meus cabos e adaptadores?

30

Suponha que um dia você esteja vasculhando sua grande caixa de cabos e adaptadores de computador não utilizados (USB para USB mini, VGA para DVI etc.). Em todos os lugares, há cabos emaranhados que bagunçam bastante, e você quer saber se poderia simplificar as coisas, conectando todos os cabos em um único fio longo e depois enrolando-o.

A questão é: é possível conectar todos os seus cabos e adaptadores em uma linha longa como esta? Obviamente, nem sempre é possível, por exemplo, se você tivesse apenas dois cabos com plugues completamente diferentes, eles não poderiam ser conectados. Mas se você tiver um terceiro cabo que possa se conectar aos dois, poderá amarrar todos os seus cabos.

Você não se importa com o tipo de plugue nas extremidades do fio. Eles não precisam se conectar para formar um loop. Você só quer saber se é possível fazer o fio todo, e se for, como fazê-lo.

Desafio

Escreva um programa ou função que utilize uma cadeia de linhas múltiplas, onde cada linha representa um dos cabos que você possui. Um cabo é composto de um ou mais traços ( -), com um plugue em cada extremidade. Um plug é sempre um dos 8 caracteres ()[]{}<>.

Portanto, estes são alguns cabos válidos:

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

Mas estes não são:

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

Ao conectar cabos, apenas plugues do mesmo tipo de suporte podem ser conectados juntos.

Portanto, estas são algumas conexões de cabo válidas:

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

E estes são inválidos:

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

Se todos os cabos da entrada puderem ser reorganizados e conectados juntos em um fio longo, faça a saída desse fio para o padrão de saída em uma linha (com uma nova linha à direita opcional). Quando existem várias soluções, você pode escolher qualquer uma delas para a saída. Se não for possível criar um único fio, não produza nada (ou produza um texto vazio com uma nova linha à direita opcional).


Por exemplo, se a entrada for

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

a saída pode ser

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

onde todos os cabos estão amarrados juntos.

No entanto, se a entrada fosse

[-->
{---]

os cabos não podem ser conectados, portanto não haverá saída.


Observe que os cabos podem ser girados o tempo necessário para fazer as conexões. por exemplo, [-->e <--]são efetivamente o mesmo cabo, porque eles podem fazer o mesmo tipo de conexões. Algumas saídas podem depender da inversão dos cabos de entrada.


Por exemplo

(-[
}--]

poderia ter saída

(-[[--{

onde o segundo cabo é invertido, ou

}--]]-)

onde o primeiro cabo é invertido.

(Observe que, em geral, o lançamento de toda a saída é válido, pois é o mesmo que o lançamento inicial de cada cabo individualmente.)


É claro que os comprimentos dos cabos na saída devem corresponder aos comprimentos dos cabos de entrada correspondentes. Mas os cabos podem ser reordenados e girados o quanto você quiser, a fim de formar o fio todo. A entrada sempre conterá pelo menos um cabo.

O código mais curto em bytes vence.

Casos de teste

Casos com saída:

[-->
{---]
>----{
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 sem saída:

[-->
{---]

[-]
[-]

(-]
]->
}-)

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

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

{--[
]--}
Passatempos de Calvin
fonte
6
caixa grande de cabos e adaptadores de computador não utilizados Isso me faz sentir melhor - eu não sou o único. Na verdade, tenho várias dessas caixas.
Digital Trauma
mas e se você conectar um cabo?
Anoksquirrel
Os cabos são garantidos para todos serem válidos?
R. Kap
@ R.Kap Sim, eles são
Calvin's Hobbies

Respostas:

10

Ilegível , 3924 bytes

Esta é a primeira vez que implementei uma estrutura semelhante à pilha de chamadas no ilegível.

(A primeira versão disso tinha mais de 5300 bytes, apenas para dar uma idéia do quanto eu joguei isso.)

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

Explicação

Considere esta entrada de exemplo:

>--{
[---}

Durante a maior parte da execução, a fita é apresentada da seguinte maneira:

  • As células de 0 a 5 são locais para várias variáveis.

  • A célula 6 em diante contém todas as informações sobre o conjunto de cabos em sua caixa:

    exemplo de layout de fita

  • As células restantes após o "terminador zero" contêm a pilha. Cada "stackframe" é uma célula única que aponta para a primeira célula de um cabo (a célula "start plug"). No exemplo acima, quando o programa decidir que encontrou uma solução, a pilha conterá 6 (referente ao >--{primeiro cabo) e 21 (referente ao {---]espelho do segundo cabo).

O programa prossegue em três etapas principais:

  1. Leia toda a entrada e gere a estrutura acima, incluindo todos os cabos espelhados.
  2. Experimente todas as combinações (mas pare se uma solução for encontrada).
  3. Se uma solução foi encontrada, produza-a.

O primeiro estágio (leia a entrada e gere a estrutura dos cabos) usa apenas as células # 1 (que chamarei p) e # 2 (que chamarei ch) e opera em um loop while da seguinte maneira:

  • Enquanto condição: incremente pem 6, leia o próximo caractere (plug inicial) na célula *pe verifique se não é -1(EOF).

  • Leia os caracteres subseqüentes *(p+2)e conte-os *(p+1)até encontrar algo diferente de -(hífen). Nesse ponto, *(p+1)conterá o número de hífens (comprimento do cabo) e *(p+2)o último caractere não hífen (o plugue final). (Também copiamos os caracteres de hífen na célula nº 5 para que possamos acessar esse código ASCII posteriormente no estágio de saída.)

  • Em um loop while, encontre o plugue do espelho e armazene-o em *(p+3), depois aumente pem 2, até que *pseja zero. O loop fica assim no 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
    }
    
  • Esse loop sempre realiza duas iterações (o plugue inicial e o final) e armazena os resultados na quarta e sexta célula deste cabo. Agora, se você prestar atenção, percebe que a sexta célula é realmente o local correto para o plugue final espelhado, mas o plugue de início espelhado está na célula rotulada como “cabo original indicando booleano”. Isso é bom porque precisamos que essa célula seja um valor diferente de zero.

  • Como pacaba de ser incrementado um total de 4, agora está apontando para a célula rotulada como "cabo indicador booleano em uso". Defina *(p+3)com o valor de *(p-1). Isso coloca o plugue de início espelhado no lugar certo.

  • Leia (e descarte) mais um caractere (que esperamos ser uma nova linha, mas o programa não verifica isso).

pinicialmente começa em 0, mas é incrementado em 6 dentro da condição while, portanto, os dados do cabo começam na célula # 6. pé incrementado por 4 dentro do corpo do loop e, portanto, um total de 10 para cada cabo, exatamente o que precisamos.

Durante a segunda fase, as células # 0-4 são ocupados por variáveis que eu vou chamar a, p, q, m, e notdone. (A célula nº 5 ainda se lembra do código ASCII do hífen.)

Para se preparar para o estágio 2, precisamos *pvoltar para 0 (a célula denominada "terminador zero") para que ele possa atuar como o terminador da lista de cabos; também definimos q(que é o ponteiro da pilha) como p+1(ou seja, a célula após o "zero terminator"; é aqui que a pilha é iniciada); *qpara 1 (o primeiro item na pilha; por que 1 se tornará aparente mais tarde); e notdonepara 1. Tudo isso é feito em uma única declaração:

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

O segundo estágio também é um loop while. Sua condição é simples notdone. Em cada iteração desse loop while, qualquer uma das quatro coisas a seguir pode acontecer:

  1. Concluímos que todos os cabos estão marcados como "em uso". Isso significa que encontramos uma solução (que é representada pelo conteúdo atual da pilha).
  2. Podemos avançar *qpara outro cabo elegível (que marcamos prontamente como “em uso” junto com o seu gêmeo) e depois recursar (ou seja, criar um novo stackframe).
  3. Não podemos avançar *qporque não existe mais cabo elegível; portanto, precisamos voltar atrás (remova um quadro de pilha e marque o cabo anterior e seu gêmeo como não mais em uso).
  4. Não podemos avançar *qporque não existe mais cabo elegível e não podemos voltar atrás porque chegamos ao fundo da pilha. Isso significa que não há solução.

O corpo do loop verifica cada uma dessas quatro condições nesta ordem. Aqui estão os detalhes:

  1. Defina me pcomo 1 e em um loop while, aumente pem 5 (iterando através dos cabos) e verifique se *(p+4)("em uso") está definido. Caso contrário, defina mcomo 0. No final desse loop, minforma se todos os cabos estão em uso. Nesse caso, defina notdonecomo 0 para finalizar o loop principal. Caso contrário, continue na etapa 2 abaixo.

  2. Defina pcomo *q(o cabo na parte superior da pilha) e em um loop while semelhante ao acima, aumente pem 5 para percorrer os cabos. A partir de *qgarante que consideramos apenas aqueles que ainda não consideramos antes; no entanto, lembre-se de que o valor inicial para um novo quadro de pilha é 1; portanto, o primeiro cabo observado é o da célula 6, que é realmente o primeiro cabo.

    Para cada cabo, precisamos verificar *(p+4)se ele ainda não está em uso e também se *(q-1) é zero (o que significa que estamos no fundo da pilha, para que não haja restrições no plugue de partida) ou *p (no início do cabo) plugue) é igual a *(*(q-1)+2)(o plugue final do cabo logo abaixo na pilha). Verificamos a igualdade definindo apara *(*(q-1)+2)e mpara *p+1e, em seguida, diminuindo os dois em um loop while. A +1é porque mé decrementado no interior da condição enquanto, por isso, é diminuída uma vez que mais do que a. Se afor zero no final, os dois plugues são iguais.

    Portanto, se *(q-1)foi zero ou a comparação de igualdade foi bem-sucedida, o cabo é elegível. Defina *qpara psubstituir o cabo na parte superior da pilha pelo novo; defina mo mesmo para indicar que encontramos um cabo correspondente; e depois diminua p. Esse decréscimo é um pequeno truque para fazer com que o loop while (iterando pelos cabos) termine mais cedo; ele aumentará pnovamente em 5, levando-o para a célula que contém o sinalizador “em uso” deste cabo, e sabemos que é zero porque acabamos de verificar isso. Finalmente, após o loop while de iteração de cabo, verificamos se mnão é zero. pNesse caso, encontramos um cabo correspondente e apontamos para a bandeira "em uso" desse cabo correspondente. Defina como 1 para marcar como em uso. Definir também*(*(p-1) ? p+5 : p-5)1 para marcar seu gêmeo como em uso. Por fim, incremente qe defina o novo *qcomo 1 para criar um novo quadro de pilha.

  3. Se, após o loop while de iteração de cabo, acharmos mzero, não há mais cabos correspondentes, portanto, precisamos voltar atrás. Decremente qpara mover a pilha para baixo e verifique se ainda está apontando para um cabo (um valor diferente de zero). Nesse caso, marque esse cabo e seu conector duplo como não mais em uso. (Armazenamos o valor de *qin ppara tornar essa expressão mais curta no código.)

  4. Se, após decrementar q, descobrimos que ele aponta para um valor zero, então esse é o "zero terminator", o que significa que estamos com a pilha abaixo. Concluímos que não há solução. Definimos notdonecomo 0 para finalizar o loop principal.

O terceiro estágio é o estágio de saída. Há duas coisas que podem acontecer:

  • o loop principal encontrou uma solução que precisamos gerar, ou
  • o loop principal concluiu que não há solução e não produzimos nada.

Convenientemente, se não houvesse solução, pé zero porque o definimos como o valor de *qantes de verificar isso como zero; e se não era uma solução, pestá apontando para a “terminator zero”, porque só iterado através dos cabos, então agora nós podemos usar ppara percorrer a pilha. Portanto, basta percorrer a pilha, produzindo para cada cabo o plugue de partida ( *(*p)), os hífens (diminuindo *(*p+1)em um loop while; e usando o código ASCII do hífen armazenado na célula # 5) e o plugue final ( *(*p+2)). Não importa que isso destrua as informações sobre o comprimento do cabo; não precisamos mais disso.

Timwi
fonte
3

CJam, 67

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

Experimente online

Nota: o link está usando o código mais recente do repositório (enviado, mas ainda não foi lançado), pois contém uma correção de bug.

Explicação:

O programa simplesmente tenta todas as permutações e todas as orientações dos cabos.

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
aditsu
fonte
Talvez uma explicação de como funciona exatamente?
Timwi
@Timwi ok, eu também golfed-lo um pouco mais
aditsu
Esta solução é inválida, pois não produz nenhuma saída para a entrada (-] ]-> >-} }-) )-[ [-< <-{ {-(.
R. Kap
@ R.Kap resolve essa entrada, mas esse intérprete on-line específico tem um tempo limite (e é bastante silencioso sobre isso). Você pode experimentá-lo aqui em vez disso (e dar-lhe alguns minutos) ou usar o interpretador java (mais rápido)
aditsu
De fato, o intérprete que vinculei acima provavelmente levará muito tempo para resolver essa entrada. O intérprete java resolve em menos de 1,5 minutos no meu computador.
Aditsu
2

JavaScript (ES6), 206

Função 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

Mais legível

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

Teste

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>

edc65
fonte
1

Javascript, 800 bytes

Longe de ser uma solução otimizada, mas aqui está um hack rápido em javascript (sem ecma5 sofisticado ou qualquer coisa, porque eu não sei).

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}

Sem jogar, aqui está ... Tenho certeza de que pelo menos 2 loops são desnecessários aqui e que verificar se há uma entrada de elemento único no topo e uma correspondência de elemento único na parte inferior é fedido ... mas parece funcionar e processa as entradas de teste.

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;
	}
}

Chris O'Kelly
fonte
1
Você pode renomear as funções para economizar alguns bytes. stackoverflow.com/questions/6156319/…
noɥʇʎԀʎzɐɹƆ
1
evite .charAt em qualquer versão do 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]))

( Demonstração em Ideone )

Anders Kaseorg
fonte
Como isso leva a entrada?
R. Kap
@ R.Kap No stdin, um fio por linha.
precisa saber é o seguinte
Parece que não, pelo menos quando eu o executei.
21416 R. Kap Kap
Além disso, com que rapidez ele pode encontrar a resposta correta (-] ]-> >-} }-) )-[ [-< <-{ {-(?
21416 R. Kap Kap
@ R.Kap Veja a demonstração no Ideone para obter um exemplo dele recebendo e produzindo resultados. (Pode não funcionar no Windows, se é isso que você está tentando fazer?) Ele roda ~ instantaneamente no seu caso de teste. É claro que existem casos que levarão tempo exponencial.
precisa saber é o seguinte
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))

Aceita cabos como argumentos de linha de comando

Trebuchette
fonte
0

Python 3.5, 448 432 427 424 286 311 bytes:

( +25, pois houve um erro em que a saída pode ser maior do que deveria para algumas 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 perfeitamente! exceto para entradas com 7 ou mais valores. Demora muito tempo para eles, provavelmente porque deve passar por todas essas permutações da entrada mais a entrada revertida . Vou tentar consertar isso se e quando puder, mas por enquanto, isso parece ser bom o suficiente. Tudo está bem agora! Se ao menos eu pudesse usar esse try-exceptbloco na compreensão da lista, ele poderia ser um pouco mais curto e parecer muito melhor. No entanto, ele agora trabalha para todos os casos de teste, e, melhor de tudo, ele usa nenhuma importações! :)

Experimente online! (Ideona) (284 bytes aqui)

(Dica: para tentar, basta selecionar "bifurcação" e inserir suas opções, separadas por espaço e selecione "executar")

Explicação

Basicamente, o que está acontecendo é ...

  1. Uma lista, Bé criada a partir da entrada, dividindo-a no espaço em branco em seus "cabos" componentes.
  2. Mé uma string que criei que, quando avaliada, retorna uma lista com base em Bque contém todos os cabos, mas desta vez para trás .
  3. A lista criada Mé finalmente concatenada consigo Bmesma para criar uma lista,f , com todas as orientações possíveis dos "cabos".
  4. Outra lista dé criada, que será inicializada com o primeiro valor (valor f[0]) def .
  5. Finalmente, todos os valores dsão iterados e o último caractere de cada valor é comparado com o primeiro caractere de cada elemento fe, quando uma correspondência é encontrada, esse caractere é exibido (ou removido) e retornado da lista f. Isso acontece até que a IndexErrorseja aumentado ou o comprimento da lista dexceda Be a NameErrorseja aumentado após a chamada para E, os quais são manipulados e, em seguida d, o conteúdo da lista seja unido a uma string e retornado enquanto o comprimento da lista dfor maior. igual ou igual ao comprimento da lista B. Caso contrário, uma string vazia é retornada ( ''), pois dnão possui o mesmo comprimento que Bsignifica que todos os "cabos" na listaB não pode ser unido em um "cordão" longo.
R. Kap
fonte
@KennyLau O que você mudou? Pelo que posso ver, você acabou de adicionar <!-- language: lang-python -->. O que isso muda?
R. Kap
Isso pode ativar o destaque da sintaxe para o seu código.
Leaky Nun
@KennyLau Uau, isso é legal. Eu queria saber como eu faria isso no PPCG. Agora eu sei! Obrigado! :)
R. Kap