Posso mettere insieme tutti i miei cavi e adattatori?


30

Supponiamo che un giorno stia scavando nella tua grande scatola di cavi e adattatori per computer inutilizzati (da USB a USB mini, da VGA a DVI, ecc.). Ci sono corde aggrovigliate dappertutto che creano un bel pasticcio, e ti chiedi se potresti semplificare le cose collegando tutte le corde insieme in un lungo filo, e poi semplicemente arrotolando.

La domanda è: è possibile collegare tutti i cavi e gli adattatori in una linea lunga come questa? Ovviamente non è sempre possibile, ad esempio se avessi solo due cavi con spine completamente diverse, non potrebbero essere collegati insieme. Ma se avessi un terzo cavo che può collegarsi a entrambi, allora potresti mettere insieme tutti i tuoi cavi.

Non ti importa di che tipo di spine si trovano alle estremità del filo all-cord. Non hanno bisogno di collegarsi l'un l'altro per formare un loop. Volete solo sapere se è possibile realizzare il filo all-cord, e se lo è, come farlo.

Sfida

Scrivi un programma o una funzione che accetta una stringa multilinea in cui ogni riga raffigura uno dei cavi che possiedi. Un cavo è costituito da uno o più trattini ( -), con una spina su entrambe le estremità. Una spina è sempre uno degli 8 caratteri ()[]{}<>.

Quindi questi sono alcuni cavi validi:

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

Ma questi non sono:

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

Quando si collegano i cavi, è possibile collegare insieme solo spine con lo stesso tipo di staffa.

Quindi questi sono alcuni collegamenti validi:

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

E questi non sono validi:

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

Se tutti i cavi nell'input possono essere riorganizzati e collegati insieme in un lungo filamento, quindi emettere quel filamento allo stdout su una riga (con una nuova riga finale opzionale). Quando esistono più soluzioni, puoi sceglierne una qualsiasi da produrre. Se non è possibile creare un singolo filamento, non produrre nulla (o generare una stringa vuota con una nuova riga finale facoltativa).


Ad esempio, se l'ingresso è

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

l'output potrebbe essere

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

dove tutte le corde sono legate insieme.

Tuttavia, se l'input fosse

[-->
{---]

i cavi non possono essere collegati quindi non ci sarebbe uscita.


Si noti che i cavi possono essere capovolti quanto necessario per effettuare le connessioni. ad es. [-->e <--]sono effettivamente lo stesso cavo perché possono effettuare lo stesso tipo di connessioni. Alcune uscite potrebbero dipendere dal capovolgere i cavi di ingresso.


Per esempio

(-[
}--]

potrebbe avere output

(-[[--{

dove viene capovolto il secondo cavo, oppure

}--]]-)

dove viene capovolto il primo cavo.

(Si noti che in generale il lancio dell'intero output è valido perché è lo stesso del primo avvio di ogni singolo cavo.)


Le lunghezze dei cavi nell'uscita dovrebbero ovviamente corrispondere alle lunghezze dei cavi di ingresso corrispondenti. Ma i cavi possono essere riordinati e capovolti quanto vuoi per creare il filo all-cord. L'ingresso conterrà sempre almeno un cavo.

Vince il codice più breve in byte.

Casi test

Casi con uscita:

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

Casi senza uscita:

[-->
{---]

[-]
[-]

(-]
]->
}-)

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

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

{--[
]--}

6
grande scatola di cavi e adattatori per computer inutilizzati che mi fa sentire meglio - non sono l'unico. In realtà ho diverse di queste scatole.
Digital Trauma,

ma cosa succede se si collega un cavo in se stesso?
anOKsquirrel il

I cavi sono garantiti per essere tutti validi?
R. Kap,

@ R.Kap Sì, lo sono
Calvin's Hobbies

Risposte:


10

Illeggibile , 3924 byte

Questa è la prima volta che ho implementato in qualche modo una struttura simile a uno stack di chiamate in Illeggibile.

(La prima versione di questo era oltre 5300 byte, solo per dare un'idea di quanto ho giocato a golf.)

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

Spiegazione

Considera questo input di esempio:

>--{
[---}

Per gran parte dell'esecuzione, il nastro è disposto come segue:

  • Le celle da 0 a 5 sono posizioni per varie variabili.

  • La cella 6 in poi contiene tutte le informazioni sul set di cavi nella confezione:

    esempio di layout del nastro

  • Le celle rimanenti dopo "terminatore zero" contengono lo stack. Ogni "stackframe" è una singola cella che punta alla prima cella di un cavo (la cella "start plug"). Nell'esempio sopra, quando il programma decide di aver trovato una soluzione, lo stack conterrà 6 (riferendosi al >--{primo cavo) e 21 (riferendosi al {---]mirror del secondo cavo).

Il programma procede in tre fasi principali:

  1. Leggi l'intero input e genera la struttura sopra, inclusi tutti i cavi speculari.
  2. Prova tutte le combinazioni (ma fermati se viene trovata una soluzione).
  3. Se è stata trovata una soluzione, emetterla.

Il primo stadio (leggi l'input e genera la struttura dei cavi) utilizza solo le celle # 1 (che chiamerò p) e # 2 (che chiamerò ch) e funziona in un ciclo while come segue:

  • Mentre condizione: incrementa pdi 6, leggi il carattere successivo (avvia plug) nella cella *pe controlla che non sia -1(EOF).

  • Leggi i personaggi successivi *(p+2)e contali fino a *(p+1)quando incontriamo qualcosa di diverso da -(trattino). A quel punto, *(p+1)conterrà il numero di trattini (lunghezza del cavo) e *(p+2)l'ultimo carattere non trattino (la spina terminale). (Copiamo anche i caratteri trattino nella cella # 5 in modo da poter accedere a questo codice ASCII più avanti nella fase di output.)

  • In un ciclo while, trova il plug mirror e memorizzalo in *(p+3), quindi incrementa pdi 2, fino a *pzero. Il ciclo si presenta così in pseudocodice:

    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
    }
    
  • Questo loop eseguirà sempre due iterazioni (la spina iniziale e la spina finale) e memorizzerà i risultati nella quarta e sesta cella di questo cavo. Ora, se hai prestato attenzione, ti rendi conto che la sesta cella è effettivamente la posizione corretta per la spina terminale specchiata, ma la spina iniziale speculare si trova nella cella etichettata "cavo booleano che indica il cavo originale". Questo va bene perché abbiamo solo bisogno che questa cella abbia un valore diverso da zero.

  • Poiché pè stato appena incrementato di un totale di 4, ora punta alla cella etichettata "cavo booleano che indica che è in uso". Impostare *(p+3)sul valore di *(p-1). In questo modo la spina di avvio con mirroring si trova nel posto giusto.

  • Leggi (e scarta) un altro personaggio (che prevediamo essere una nuova riga, ma il programma non lo controlla).

pinizialmente inizia da 0 ma viene incrementato di 6 all'interno della condizione while, quindi i dati del cavo iniziano dalla cella # 6. pviene incrementato di 4 all'interno del corpo del circuito, e quindi un totale di 10 per ciascun cavo, che è esattamente ciò di cui abbiamo bisogno.

Durante la seconda fase, le cellule # 0-4 sono occupati da variabili che chiamerò a, p, q, m, e notdone. (La cella # 5 ricorda ancora il codice ASCII del trattino.)

Per prepararci allo stadio 2, dobbiamo *ptornare a 0 (la cella etichettata "zero terminator") in modo che possa fungere da terminatore per l'elenco dei cavi; impostiamo anche q(che è il nostro puntatore dello stack) su p+1(cioè la cella dopo il "terminatore zero"; è qui che inizia lo stack); *qa 1 (il primo oggetto in pila; perché 1 diventerà evidente in seguito); e notdonea 1. Tutto ciò è fatto in una singola affermazione:

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

Il secondo stadio è anche un ciclo while. Le sue condizioni sono semplicemente notdone. In ogni iterazione di quel ciclo while, potrebbe accadere una delle seguenti quattro cose:

  1. Troviamo che tutti i cavi sono contrassegnati come "in uso". Ciò significa che abbiamo trovato una soluzione (che è rappresentata dal contenuto dello stack corrente).
  2. Possiamo passare *qa un altro cavo idoneo (che contrassegniamo prontamente come "in uso" insieme al suo gemello) e quindi ricorrere (ovvero creare un nuovo stackframe).
  3. Non possiamo avanzare *qperché non esistono altri cavi idonei, quindi dobbiamo tornare indietro (rimuovere uno stack frame e contrassegnare il cavo precedente e il suo gemello come non più "in uso").
  4. Non possiamo avanzare *qperché non esistono altri cavi idonei e non possiamo tornare indietro perché abbiamo raggiunto il fondo dello stack. Questo significa che non esiste soluzione.

Il corpo del loop verifica ciascuna di queste quattro condizioni in questo ordine. Ecco i dettagli:

  1. Impostare me psu 1 e in un ciclo while, incrementare pdi 5 (ripetendo così i cavi) e verificare se *(p+4)è impostato ("in uso"). In caso contrario, impostare msu 0. Alla fine di quel loop, mci dice se tutti i cavi sono in uso. In tal caso, impostare notdonesu 0 per terminare il loop principale. In caso contrario, continuare con il passaggio 2 di seguito.

  2. Impostare psu *q(il cavo nella parte superiore dello stack) e in un ciclo while simile al precedente, incrementare pdi 5 per scorrere tra i cavi. Partendo da *qci assicuriamo di considerare solo quelli che non abbiamo già considerato prima; tuttavia, ricorda che il valore iniziale per un nuovo stackframe è 1, quindi il primo cavo esaminato è quello della cella 6, che è effettivamente il primo cavo.

    Per ogni cavo, dobbiamo verificare *(p+4)che non sia già in uso e che sia *(q-1) zero (il che significa che siamo nella parte inferiore dello stack, quindi non ci sono vincoli sulla spina di avvio) o *p (l'inizio del cavo plug) è uguale a *(*(q-1)+2)(la spina del cavo appena sotto nello stack). Controlliamo l'uguaglianza impostando asu *(*(q-1)+2)e msu *p+1e quindi diminuendo entrambi in un ciclo while. Il +1perché mè decrementato all'interno della condizione while, quindi è diminuito ancora una volta a. Se aè zero alla fine di questo, le due spine sono uguali.

    Pertanto, se uno *(q-1)era zero o il confronto di uguaglianza ha avuto esito positivo, il cavo è idoneo. Imposta *qper psostituire il cavo nella parte superiore dello stack con quello nuovo; impostato msullo stesso per indicare che abbiamo trovato un cavo corrispondente; e quindi decrementa p. Tale decremento è un piccolo trucco per far terminare anticipatamente il ciclo while (iterando attraverso i cavi); aumenterà pdi nuovo di 5, portandolo quindi nella cella contenente il flag "in uso" di questo cavo e sappiamo che è zero perché l'abbiamo appena verificato. Infine, dopo l'iterazione del cavo while loop, controlliamo se mè diverso da zero. In tal caso, abbiamo trovato un cavo corrispondente e ppunta al flag "in uso" per quel cavo corrispondente. Impostalo su 1 per contrassegnarlo come in uso. Anche impostato*(*(p-1) ? p+5 : p-5)a 1 per contrassegnare il suo gemello come in uso. Infine, incrementa qe imposta il nuovo *qsu 1 per creare un nuovo stackframe.

  3. Se, dopo l'iterazione del cavo while loop, troviamo mzero, non ci sono più cavi corrispondenti, quindi dobbiamo tornare indietro. Decrementa qdi spostarti verso il basso dello stack e controlla se sta ancora puntando su un cavo (un valore diverso da zero). In tal caso, contrassegnare quel cavo e il suo gemello come non più in uso. (Memorizziamo il valore di *qin pper rendere questa espressione più breve nel codice.)

  4. Se, dopo il decremento q, scopriamo che punta a un valore zero, allora quello è il "terminatore zero", il che significa che abbiamo sottovalutato lo stack. Concludiamo che non esiste soluzione. Impostiamo notdonesu 0 per terminare il loop principale.

Il terzo stadio è lo stadio di uscita. Ci possono essere due cose che possono accadere:

  • il ciclo principale ha trovato una soluzione che dobbiamo produrre, o
  • il ciclo principale ha concluso che non esiste soluzione e non abbiamo prodotto nulla.

Convenientemente, se non c'era soluzione, pè zero perché lo abbiamo impostato sul valore *qprima di controllarlo per zero; e se ci fosse una soluzione, ppunta verso il “terminatore zero” perché semplicemente iterata attraverso i cavi, così ora possiamo usare pper scorrere la pila. Quindi basta scorrere attraverso lo stack, emettendo per ciascun cavo la spina iniziale ( *(*p)), i trattini (diminuendo *(*p+1)in un ciclo while; e usando il codice ASCII trattino memorizzato nella cella n. 5) e la spina finale ( *(*p+2)). Non importa che questo distrugga le informazioni sulla lunghezza del cavo; non ne abbiamo più bisogno.


3

CJam, 67

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

Provalo online

Nota: il collegamento utilizza l'ultimo codice dal repository (inviato ma non ancora rilasciato), poiché contiene una correzione di bug.

Spiegazione:

Il programma prova semplicemente tutte le permutazioni e tutti gli orientamenti delle corde.

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

Forse una spiegazione di come funziona esattamente?
Timwi,

@Timwi ok, ho anche giocato a golf un po 'di più
aditsu,

Questa soluzione non è valida in quanto non produce alcun output per l'input (-] ]-> >-} }-) )-[ [-< <-{ {-(.
R. Kap,

@ R.Kap risolve quell'input, ma quel particolare interprete online ha un timeout (ed è abbastanza silenzioso al riguardo). Puoi invece provarlo qui (e concedere alcuni minuti) o utilizzare l'interprete java (il più veloce)
aditsu,

In effetti, l'interprete che ho collegato sopra probabilmente richiederà molto tempo per risolvere quell'input. L' interprete Java lo risolve in meno di 1,5 minuti sul mio computer.
aditsu,

2

JavaScript (ES6), 206

Funzione ricorsiva

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

Più leggibile

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

Test

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 byte

Lungi dall'essere una soluzione ottimizzata, ma ecco un rapido hack insieme in JavaScript (niente ecma5 di fantasia o altro, perché non lo so).

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, eccolo qui ... Sono sicuro che almeno 2 per i loop non sono necessari qui e che il controllo di un singolo elemento immesso nella parte superiore e una corrispondenza di un singolo elemento nella parte inferiore è puzzolente ... ma sembra funzionare e elabora gli input di test.

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
È possibile rinominare le funzioni per salvare parecchi byte. stackoverflow.com/questions/6156319/...
noɥʇʎԀʎzɐɹƆ

1
evitare .charAt in qualsiasi versione di JavaScript. s.charAt(x)===s[x]
edc65,

1

Python 3, 217 byte

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


In che modo questo richiede input?
R. Kap

@ R.Kap Su stdin, un cavo per riga.
Anders Kaseorg,

Non sembra, almeno quando l'ho eseguito.
R. Kap

Inoltre, quanto velocemente può trovare la risposta corretta per (-] ]-> >-} }-) )-[ [-< <-{ {-(?
R. Kap

@ R.Kap Vedi la demo su Ideone per un esempio che prende input e produce output. (Potrebbe non funzionare su Windows, se è quello che stai cercando di fare?) Funziona ~ istantaneamente sul tuo test case. Naturalmente ci sono casi che richiederanno tempo esponenziale.
Anders Kaseorg,

0

Lua, 477 byte

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

Accetta i cavi come argomenti della riga di comando


0

Python 3.5, 448 432 427 424 286 311 byte:

( +25 poiché si è verificato un errore in cui l'output potrebbe essere più lungo di quanto dovrebbe essere per alcuni input )

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

Funziona perfettamente! ad eccezione degli ingressi con 7 o più valori. Ci vuole molto tempo per quelli, molto probabilmente perché deve passare attraverso tutte quelle permutazioni dell'ingresso più l'ingresso invertito . Proverò a risolvere questo problema se e quando potrò, ma per ora questo sembra essere abbastanza buono. Adesso va tutto bene! Se solo potessi in qualche modo usare quel try-exceptblocco nella comprensione dell'elenco, potrebbe essere un po 'più breve e apparire molto più bello. Tuttavia, ora funziona per tutti i casi di test e, soprattutto, utilizza no importazioni! :)

Provalo online! (Ideone) (284 byte qui)

(Suggerimento: per provarlo, seleziona "fork", quindi inserisci le tue scelte, separate da spazio e seleziona "run")

Spiegazione

Fondamentalmente, ciò che sta accadendo è ...

  1. Un elenco, Bviene creato dall'input suddividendolo nello spazio bianco nel suo "cavo" componente.
  2. Mè una stringa che ho creato che, una volta valutato, restituisce un elenco in base al Bquale contiene tutti i cavi, ma questa volta al contrario .
  3. L'elenco creato da alla Mfine viene concatenato con Bse stesso per creare un elenco,f , con tutti i possibili orientamenti delle "corde".
  4. dViene creato un altro elenco, che verrà inizializzato con il primo valore (valore f[0]) dif .
  5. Infine, tutti i valori in dvengono ripetuti e l'ultimo carattere di ciascun valore viene confrontato con il primo carattere di ciascun elemento in f, e quando viene trovata una corrispondenza, quel carattere viene visualizzato (o rimosso) e restituito dall'elenco f. Ciò accade fino a quando IndexErrorviene sollevato a, oppure quando la lunghezza dell'elenco dsupera Be NameErrorviene sollevato dopo la chiamata a E, entrambi i quali vengono gestiti, quindi di contenuti dell'elenco vengono uniti in una stringa e restituiti purché la lunghezza dell'elenco dsia maggiore uguale o uguale alla lunghezza dell'elenco B. Altrimenti, viene restituita una stringa vuota ( ''), poiché non può essere unita in un lungo "cavo".d non ha la stessa lunghezza di Bsignifica che tutti i "cavi" nell'elencoB

@KennyLau Cosa hai cambiato? Da quello che posso vedere, hai appena aggiunto. <!-- language: lang-python -->Cosa cambia?
R. Kap

Ciò può abilitare l'evidenziazione della sintassi per il tuo codice.
Leaky Nun,

@KennyLau Wow, è fantastico. Mi chiedevo come avrei potuto farlo su PPCG. Adesso lo so! Grazie! :)
R. Kap
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.