Tutta la luce Tutta la luce Tutta la luce!


13

Questa sfida è stata completamente strappata fortemente ispirata da All Light , sviluppata da Soulgit Games.

Sfida

Sei un elettricista ed è il tuo compito collegare tutte le luci alla batteria.

  • Le luci e la batteria sono disposte in una griglia.
  • È possibile collegare una luce o una batteria alla luce o alla batteria più vicine a nord, sud, est e ovest.
  • La batteria può avere un numero qualsiasi di connessioni.
  • Ogni luce specifica quante connessioni sono necessarie. Devi fare esattamente così tante connessioni a quella luce.
  • È possibile creare connessioni singole o doppie tra due luci (o luce e batteria).
  • I fili non possono incrociarsi.
  • Deve esserci un percorso da ciascuna luce alla batteria.
  • È garantita l'esistenza di almeno una soluzione valida.

Data la posizione della batteria e di ciascuna luce e il numero di connessioni richieste da ciascuna luce, emettere le connessioni tra loro che ammettono queste proprietà.

Condizioni di vittoria

Questo è , quindi vince il codice più corto in ogni lingua.

Casi test

L'I / O è flessibile come al solito.

Per l'input userò un array 2d delle dimensioni della griglia che memorizza numeri interi positivi per luci, zeri per spazi vuoti e -1 per la batteria. Un'altra buona scelta potrebbe essere un elenco di luci, in cui una luce è una tupla contenente la posizione della luce e il numero di connessioni necessarie.

Per l'output userò un elenco di connessioni, in cui una connessione è una tupla contenente la posizione iniziale e finale. Se una connessione viene raddoppiata, ne avrò 2 nell'elenco (un'altra opzione è quella di includere questo parametro nella tupla). Un'altra buona opzione potrebbe essere una sorta di layout della griglia.

Se si utilizza un sistema di coordinate, è possibile specificare l'indice iniziale e la provenienza dell'indice. I miei esempi saranno indicizzati 0 e userò (0, 0) come angolo in alto a sinistra (riga, colonna). (Sto usando {} semplicemente per introdurre un altro tipo di delimitatore in modo che sia più facile da leggere, non perché sono insiemi.)

Ecco una vista grafica dei casi di test: Test 1-12

Test 1:

[-1 | 0 | 1 ] => [{(0, 0), (0, 2)}]

Test 2:

[-1 | 0 | 2 ] => [{(0, 0), (0, 2)}, {(0, 0), (0, 2)}]

Test 3:

[-1 ] [ 0 ] => [{(0, 0), (2, 0)), ((0, 0), (2, 0)}] [ 2 ]

Test 4:

[ 1 | 0 |-1 | 0 | 2 ] => [{(0, 0), (0, 2)}, {(0, 2), (0, 4)}, {(0, 2), (0, 4)}]

Test 5:

[ 2 ] [ 0 ] [-1 ] => [{(0, 0), (2, 0)}, {(0, 0), (2, 0)}, {(2, 0), (4, 0)}] [ 0 ] [ 1 ]

Test 6:

[ 1 | 0 | 0 ] [ 0 | 0 | 0 ] => [{(0, 0), (2, 0)}, {(2, 0), (2, 2)}] [ 2 | 0 |-1 ]

Test 7:

[ 4 | 0 | 0 |-1 ] [ 0 | 0 | 0 | 0 ] => [{(0, 0), (0, 3)}, {(0, 0), (0, 3)}, [ 2 | 0 | 0 | 0 ] {(0, 0), (3, 0)}, {(0, 0), (3, 0)}]

Test 8:

[ 2 | 0 |-1 | 0 | 2 ] [{(0, 0), (0, 2)}, {(0, 0), (0, 2)}, [ 0 | 0 | 0 | 0 | 0 ] => {(0, 2), (0, 4)}, {(0, 2), (0, 4)}, [ 0 | 0 | 1 | 0 | 0 ] {(0, 2), (2, 2)}]

Test 9:

[ 0 | 0 | 2 | 0 | 0 ] [ 0 | 0 | 0 | 0 | 0 ] [ 1 | 0 |-1 | 0 | 1 ] => [{(0, 2), (2, 2)}, {(0, 2), (2, 2)}, {(2, 0), (2, 2)}, [ 0 | 0 | 0 | 0 | 0 ] {(4, 2), (2, 2)}, {(2, 4), (2, 2)}, {(2, 4), (2, 2)}] [ 0 | 0 | 2 | 0 | 0 ]

Test 10:

[-1 | 2 | 3 | 2 ] => [{(0, 0), (0, 3)}, {(0, 0), (0, 3)}, {(0, 0), (0, 3)}, {(0, 0), (0, 3)}]

Test 11:

[-1 | 0 | 0 | 0 ] [ 3 | 0 | 0 | 0 ] [ 3 | 0 | 0 | 3 ] => [{(0, 0), (1, 0)}, {(1, 0), (2, 0)}, {(1, 0), (2, 0)}, [ 0 | 0 | 0 | 0 ] {(2, 0), (2, 3)}, {(2, 3), (4, 3)}, {(2, 3), (4, 3)}] [ 0 | 0 | 0 | 2 ]

Test 12:

[ 2 | 0 | 0 ] [{(0, 0), (1, 0)}, {(0, 0), (1, 0)}, {(1, 0), (1, 1)}, [ 3 |-1 | 0 ] => {(1, 1), (2, 1)}, {(1, 1), (2, 1)}, {(2, 0), (2, 1)}, [ 2 | 5 | 1 ] {(2, 0), (2, 1)}, {(2, 1), (2, 2)}]



Suggerisco di avere un caso di test in modo che esista una soluzione che soddisfi ogni condizione tranne "Deve esserci un percorso da ciascuna luce alla batteria". Per esempio [1 | -1] [1 1].
user202729

Un po 'mi ricorda l'algoritmo Blossom.
user202729

2
@utente202729 Garantisco che l'ingresso ha una soluzione che soddisfa tutte le condizioni
musicman523

1
Sembra simile a un puzzle Hashi. Penso che molti degli stessi passaggi per risolverli siano gli stessi.
Οuroso

Risposte:


2

JavaScript (Node.js) , 393 391 378 byte

a=>(R=[],f=(a,[x,...y],z,Y)=>x?f(a.map(t=>[...t]),y,z,Y)||f(a,y,[...z,x],Y.map(p=>p.map(q=>q-Y[x[0]][x[1]]?q:Y[x[2]][x[3]])),--a[x[0]][x[1]],--a[x[2]][x[3]]):/[1-9]/.test(a)|Y.some(t=>t.some(u=>u-Y[I][J]&&u))?0:z)(a=a.map(A=(b,i)=>b.map((x,j)=>x&&(A[i]+1&&R.push([i,A[i],i,j]),f[j]+1&&R.push([f[j],j,i,j]),A[I=i]=j,f[J=j]=i,x/=x>0))),[...R,...R],C=[],a.map(p=>p.map(q=>q&&++C)))

Provalo online!

a=>(
    a=a.map(
        A=(b,i)=>
            b.map(
                (x,j)=>
                    x&&(                                  // A[i]+1 <==> A[i] is NOT NaN
                        A[i]+1&&R.push([i,A[i],i,j]),     // Use A and f to store last
                        f[j]+1&&R.push([f[j],j,i,j]),     // existance of row and column
                        A[I=i]=j,f[J=j]=i,x/=x>0          // -1 => -Inf, +n => n
                    )
            ),
            R=[],
            f=([x,...y],z,Y)=>
                x?
                    f(
                        y,[...z,x],
                        Y.map(p=>p.map(q=>q-Y[x[0]][x[1]]?q:Y[x[2]][x[3]])), // merge
                        --a[x[0]][x[1]],--a[x[2]][x[3]]
                    )||
                    f(y,z,Y,++a[x[0]][x[1]],++a[x[2]][x[3]])
                :
                    /[1-9]/.test(a)|
                    Y.some(t=>t.some(u=>u-Y[I][J]&&u)) // not totally merged
                    ?0:z
    ),f)([...R,...R],[],a.map(p=>p.map(q=>q&&++C),C=0)
)


Esiste un collegamento per / [1-9] / in JavaScript RegEx?
Zacharý,

@ Zacharý Non la penso così. Di solito [0-9]viene utilizzato
l4m2

Sciocco me! Pensavo fosse quello che hai scritto
Zacharý,

@ Zacharý Cosa ??
l4m2
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.