Toute la lumière Toute la lumière Toute la lumière!

13

Ce défi est complètement arnaqué, fortement inspiré de All Light , développé par Soulgit Games.

Défi

Vous êtes électricien et c'est votre travail de câbler toutes les lumières à la batterie.

  • Les lumières et la batterie sont disposées dans une grille.
  • Vous pouvez connecter une lumière ou une batterie à la lumière ou à la batterie la plus proche au nord, au sud, à l'est et à l'ouest.
  • La batterie peut avoir un nombre illimité de connexions.
  • Chaque voyant spécifie le nombre de connexions dont il a besoin. Vous devez établir exactement autant de connexions avec cette lumière.
  • Vous pouvez créer des connexions simples ou doubles entre deux lumières (ou lumière et batterie).
  • Les fils ne peuvent pas se croiser.
  • Il doit y avoir un chemin entre chaque lumière et la batterie.
  • Il existe au moins une solution valide.

Étant donné la position de la batterie et de chaque lumière, et le nombre de connexions que chaque lumière nécessite, émettez les connexions entre elles qui admettent ces propriétés.

Condition de victoire

C'est le , donc le code le plus court dans chaque langue l'emporte.

Cas de test

Les E / S sont flexibles comme d'habitude.

Pour l'entrée, j'utiliserai un tableau 2D de la taille de la grille qui stocke des entiers positifs pour les lumières, des zéros pour les espaces vides et -1 pour la batterie. Un autre bon choix pourrait être une liste de lumières, où une lumière est un tuple contenant la position de la lumière et le nombre de connexions requises.

Pour la sortie, j'utiliserai une liste de connexions, où une connexion est un tuple contenant la position de départ et la position de fin. Si une connexion est doublée, j'en aurai 2 dans la liste (une autre option est d'inclure ce paramètre dans le tuple). Une autre bonne option pourrait être une sorte de disposition de la grille.

Si vous utilisez un système de coordonnées, vous pouvez spécifier l'index de départ et d'où vous indexez. Mes exemples seront indexés 0 et utiliseront (0, 0) comme coin supérieur gauche (ligne, colonne). (J'utilise {} simplement pour introduire un autre type de délimiteur afin qu'il soit plus facile à lire, pas parce qu'ils sont des ensembles.)

Voici une vue graphique des cas de test: Tests 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
la source
Sandbox
musicman523
Je suggère d'avoir un cas de test tel qu'il existe une solution satisfaisant à toutes les conditions sauf "Il doit y avoir un chemin de chaque lumière vers la batterie". Par exemple [1 | -1] [1 1].
user202729
Cela me rappelle un peu l'algorithme Blossom.
user202729
2
@ user202729 Je garantis que l'entrée a une solution remplissant toutes les conditions
musicman523
1
Cela semble similaire à un puzzle Hashi. Je pense que plusieurs des mêmes étapes pour résoudre l'un ou l'autre sont les mêmes.
Οurous

Réponses:

2

JavaScript (Node.js) , 393 391 378 octets

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

Essayez-le en ligne!

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
la source
Existe-t-il un raccourci pour / [1-9] / dans JavaScript RegEx?
Zacharý
@ Zacharý Je ne pense pas. [0-9]Est habituellement utilisé
l4m2
Que je suis bête! Je pensais que c'est ce que vous avez écrit
Zacharý
@ Zacharý Quoi ??
l4m2