All Light All Light All Light!

13

To wyzwanie zostało całkowicie zerwane w dużej mierze z inspiracji All Light , opracowanej przez Soulgit Games.

Wyzwanie

Jesteś elektrykiem i Twoim zadaniem jest podłączyć wszystkie światła do akumulatora.

  • Światła i bateria są ułożone w siatkę.
  • Możesz podłączyć światło lub baterię do najbliższego światła lub baterii na północ, południe, wschód i zachód.
  • Bateria może mieć dowolną liczbę połączeń.
  • Każde światło określa liczbę wymaganych połączeń. Musisz wykonać dokładnie tyle połączeń z tym światłem.
  • Możesz utworzyć pojedyncze połączenia lub podwójne połączenia między dwoma światłami (lub światłem i akumulatorem).
  • Przewody nie mogą się krzyżować.
  • Musi istnieć ścieżka od każdego światła do akumulatora.
  • Gwarantowane jest istnienie co najmniej jednego poprawnego rozwiązania.

Biorąc pod uwagę położenie baterii i każdego światła oraz liczbę połączeń wymaganych przez każde światło, wysyłaj połączenia między nimi, które akceptują te właściwości.

Warunek wygranej

To jest , więc wygrywa najkrótszy kod w każdym języku.

Przypadki testowe

I / O jest elastyczny jak zwykle.

Do wprowadzenia będę używać tablicy 2d wielkości siatki, która przechowuje dodatnie liczby całkowite dla świateł, zera dla pustych spacji i -1 dla akumulatora. Innym dobrym wyborem może być lista świateł, gdzie światło jest krotką zawierającą pozycję światła i liczbę wymaganych połączeń.

Do wyjścia wykorzystam listę połączeń, gdzie połączenie jest krotką zawierającą pozycję początkową i końcową. Jeśli połączenie zostanie podwojone, będę miał 2 z nich na liście (inną opcją jest zawarcie tego parametru w krotce). Inną dobrą opcją może być układ siatki.

Jeśli używasz układu współrzędnych, możesz podać indeks początkowy i miejsce, z którego indeksujesz. Moje przykłady będą indeksowane 0 i użyję (0, 0) jako lewego górnego rogu (wiersz, kolumna). (Używam {} po prostu do wprowadzenia innego rodzaju separatora, aby był łatwiejszy do odczytania, nie dlatego, że są to zestawy.)

Oto graficzny widok przypadków testowych: Testy 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)}]

musicman523
źródło
Piaskownica
musicman523
Proponuję mieć taki przypadek testowy, aby istniało rozwiązanie spełniające wszystkie warunki z wyjątkiem „Musi istnieć ścieżka od każdego światła do akumulatora”. Na przykład [1 | -1] [1 1].
user202729,
Nieco przypomina mi algorytm Blossom.
user202729,
2
@ user202729 Gwarantuję, że wejście ma rozwiązanie spełniające wszystkie warunki
musicman523,
1
To wydaje się podobne do układanki Hashi. Myślę, że wiele takich samych kroków do rozwiązania któregokolwiek z nich jest takich samych.
tragiczny

Odpowiedzi:

2

JavaScript (Node.js) , 393 391 378 bajtów

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

Wypróbuj 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)
)
l4m2
źródło
Czy istnieje skrót do / [1-9] / w JavaScript RegEx?
Zacharý
@ Zacharý Nie sądzę. Zwykle [0-9]jest używany
14m2
Głupi ja! Myślałem, że tak napisałeś
Zacharý
@ Zacharý What ??
l4m2