すべての光すべての光すべての光!


13

このチャレンジはされて完全に食い物に大きく触発され た全ての光 Soulgitゲームによって開発されました、。

チャレンジ

あなたは電気技師であり、すべてのライトをバッテリーに接続するのはあなたの仕事です。

  • ライトとバッテリーは格子状に配置されています。
  • ライトまたはバッテリーを、その北、南、東、および西の最も近いライトまたはバッテリーに接続できます。
  • バッテリーにはいくつでも接続できます。
  • 各ライトは、必要な接続数を指定します。そのライトと正確に同じ数の接続を行う必要があります。
  • 2つのライト(またはライトとバッテリー)間の単一接続または二重接続を作成できます。
  • ワイヤーは交差できません。
  • 各ライトからバッテリーへのパスが必要です。
  • 少なくとも1つの有効なソリューションが存在することが保証されています。

バッテリーと各ライトの位置、および各ライトに必要な接続の数が与えられたら、これらのプロパティを認めるそれらの間の接続を出力します。

勝利条件

これはであるため、各言語で最も短いコードが優先されます。

テストケース

I / Oは通常どおり柔軟です。

入力には、ライト用の正の整数、空白用のゼロ、およびバッテリー用の-1を格納するグリッドのサイズの2D配列を使用します。別の良い選択としては、ライトのリストがあります。ライトは、ライトの位置と必要な接続の数を含むタプルです。

出力には、接続のリストを使用します。接続は、開始位置と終了位置を含むタプルです。接続が2倍になった場合、リストに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

Blossomアルゴリズムを少し思い出させます。
user202729

2
入力はすべての条件を満たしたソリューションを持っていること@ user202729 I保証
musicman523

1
これは橋のパズルに似ているようです。どちらかを解決するための同じステップの多くは同じだと思います。
18年

回答:


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


JavaScript RegExに/ [1-9] /のショートカットはありますか?
ザカリー

@ザカリー私はそうは思いません。通常[0-9]使用されます
l4m2

愚かな私!それがあなたの書いたものだと思った
ザカリー

@Zacharý何??
l4m2
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.