모든 빛 모든 빛 모든 빛!


13

이 도전은 Soulgit Games가 개발 한 All Light 에서 많은 영감을 얻었습니다 .

도전

전기 기사는 모든 조명을 배터리에 연결하는 것이 당신의 일입니다.

  • 표시등과 배터리는 그리드에 배치됩니다.
  • 조명이나 배터리를 가장 가까운 조명이나 배터리를 북쪽, 남쪽, 동쪽 및 서쪽에 연결할 수 있습니다.
  • 배터리는 여러 개의 연결을 가질 수 있습니다.
  • 각 표시등은 필요한 연결 수를 지정합니다. 당신이해야 정확히 그 빛에 많은 연결을.
  • 두 표시 등 (또는 표시 등 및 배터리)간에 단일 연결 또는 이중 연결을 만들 수 있습니다.
  • 전선은 교차 할 수 없습니다.
  • 각 표시 등에서 배터리까지의 경로가 있어야합니다.
  • 하나 이상의 유효한 솔루션이 존재해야합니다.

배터리의 위치와 각 표시 등 및 각 표시등에 필요한 연결 수를 고려하여 이러한 속성을 허용하는 배터리 간 연결을 출력하십시오.

승리 조건

이것은 이므로 각 언어에서 가장 짧은 코드가 승리합니다.

테스트 사례

I / O는 평소처럼 유연합니다.

입력의 경우 조명의 양의 정수, 공백의 경우 0, 배터리의 경우 -1을 저장하는 그리드 크기의 2d 배열을 사용합니다. 또 다른 좋은 선택은 조명 목록 일 수 있습니다. 여기서 조명은 조명의 위치와 필요한 연결 수를 포함하는 튜플입니다.

출력을 위해 연결 목록을 사용합니다. 연결은 시작 위치와 끝 위치를 포함하는 튜플입니다. 연결이 두 배가되면 목록에 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].
user202729

꽃송이 알고리즘을 생각 나게합니다.
user202729

2
@ user202729 입력에 모든 조건을 만족하는 솔루션이 있음을 보증합니다
musicman523

1
이것은 하시 퍼즐과 유사합니다. 둘 중 하나를 해결하는 동일한 단계 중 많은 부분이 동일하다고 생각합니다.
Οurous

답변:


2

자바 스크립트 (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)
)


JavaScript RegEx에 / [1-9] /에 대한 바로 가기가 있습니까?
Zacharý

@ Zacharý 나는 그렇게 생각하지 않습니다. 일반적 [0-9]으로 사용
l4m2

바보 나! 나는 그것이 당신이 쓴 것이라고 생각했습니다
Zacharý

@ Zacharý 뭐 ??
l4m2
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.