Все світло Все світло Все світло!


13

Цей виклик повністю вирваний з сильного натхнення від All Light , розробленого Soulgit Games.

Виклик

Ви електрик, і ваша робота підключити всі батареї до батареї.

  • Світильники та акумуляторні батареї розкладені в сітці.
  • Ви можете підключити світло або акумулятор до найближчого світла або батареї на його північ, південь, схід та захід.
  • Акумулятор може мати будь-яку кількість підключень.
  • Кожне світло вказує, скільки з'єднань потрібно. Ви повинні зробити саме стільки зв’язків із цим світлом.
  • Ви можете створити поодинокі з'єднання або подвійні з'єднання між двома фарами (або світлом і акумулятором).
  • Провід не може перетинатися.
  • Повинно бути шлях від кожного світла до акумулятора.
  • Принаймні одне дійсне рішення гарантовано існує.

Враховуючи положення акумулятора та кожного світильника, а також кількість підключень, необхідних для кожного світла, виведіть з'єднання між ними, які визнають ці властивості.

Умова виграшу

Це , тому найкоротший код на кожній мові виграє.

Випробування

Введення / виведення є гнучким, як зазвичай.

Для введення я буду використовувати 2d масив розміром сітки, який зберігає додатні цілі числа для вогнів, нулі для порожніх пробілів та -1 для акумулятора. Ще одним хорошим вибором може бути список світильників, де світло - це кортеж, що містить положення світла та кількість необхідних з'єднань.

Для виводу я буду використовувати список з'єднань, де з'єднання являє собою кортеж, що містить початкове положення і кінцеве положення. Якщо з'єднання подвоїться, у мене буде 2 з них у списку (інший варіант - включити цей параметр у кортеж). Ще одним хорошим варіантом може стати якийсь макет сітки.

Якщо ви використовуєте систему координат, ви можете вказати початковий індекс та де індексувати. Мої приклади будуть індексованими 0 і використовувати (0, 0) як лівий верхній кут (рядок, стовпець). (Я використовую {} просто для введення іншого типу роздільника, щоб його було легше читати не тому, що вони є наборами.)

Ось графічний вигляд тестових випадків: Тести 1-12

Тест 1:

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

Тест 2:

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

Тест 3:

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

Тест 4:

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

Тест 5:

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

Тест 6:

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

Тест 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)}]

Тест 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)}]

Тест 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 ]

Тест 10:

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

Тест 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 ]

Тест 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)}]



Я пропоную зробити тестовий випадок таким, щоб існувало рішення, яке задовольняло б кожну умову, крім "Повинно бути шлях від кожного світла до акумулятора". Наприклад [1 | -1] [1 1].
користувач202729

Дещо нагадує мені алгоритм Blossom.
користувач202729

2
@ user202729 Я гарантую, що вхід має рішення, що задовольняє всім умовам
musicman523

1
Це схоже на головоломку Хаші. Я думаю, що багато однакових кроків до вирішення будь-якого з них однакові.
Οurous

Відповіді:


2

JavaScript (Node.js) , 393 391 378 байт

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

Спробуйте в Інтернеті!

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


Чи є ярлик для / [1-9] / в JavaScript RegEx?
Zacharý

@ Zacharý Я так не думаю. Зазвичай [0-9]використовується
l4m2

Дурний мене! Я подумав, що це ви написали
Zacharý

@ Zacharý Що ??
l4m2
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.