折れ線グラフ/共役グラフを作成する


8

前書き

無向グラフGが与えられると、Gのエッジ間の接続を表すグラフL(G)(線グラフまたは共役グラフと呼ばれます)を構築できます。これは、 Gおよびそれらが表すエッジに共通の頂点がある場合、これらの頂点を接続します。

これは、折れ線グラフ(緑)の作成を示すWikipediaの例です。

グラフG Gの各エッジを表す新しい頂点 Gのエッジが接続されているときに頂点が接続されている 折れ線グラフL(G)

別の例として、頂点A、B、C、およびDを持つこのグラフGを取り上げます。

    A
    |
    |
B---C---D---E

Gの各エッジに新しい頂点を作成します。この場合、AとCの間のエッジはACと呼ばれる新しい頂点で表されます。

   AC

 BC  CD  DE

また、頂点が表すエッジに共通の頂点がある場合は、頂点を接続します。この場合、AからCへのエッジとBからCへのエッジは頂点Cが共通なので、頂点ACとBCが接続されます。

   AC
  /  \
 BC--CD--DE

この新しいグラフは、Gの折れ線グラフです。

詳細については、Wikipediaを参照してください。

チャレンジ

グラフGの隣接リストが与えられた場合、プログラムは線グラフL(G)の隣接リストを出力または返す必要があります。これはコードゴルフなので、バイト数が最も少ない答えが勝ちます!

入力

Gのエッジを表す文字列のペアのリスト。各ペアは、そのエッジによって接続されている頂点を示します。

  • 各ペア(X、Y)は一意であることが保証されています。つまり、リストには(Y、X)または2番目の(X、Y)は含まれません。

例えば:

[("1","2"),("1","3"),("1","4"),("2","5"),("3","4"),("4","5")]
[("D","E"),("C","D"),("B","C"),("A","C")]

出力

L(G)のエッジを表す文字列のペアのリスト。各ペアは、そのエッジによって接続されている頂点を表します。

  • 各ペア(X、Y)は一意である必要があります。つまり、リストには(Y、X)または2番目の(X、Y)は含まれません。

  • Gのエッジ(X、Y)の場合、L(G)で作成される頂点の名前はXYにする必要があります(名前は、入力で指定されたのと同じ順序で連結されます)。

例えば:

[("12","13"),("12","14"),("12","25"),("13","14"),("13","34"),("14","34"),("14","45"),("25","45"),("34","45")]
[("DE","CD"),("CD","CB"),("CD","CA"),("BC","AB")]

テストケース

[] -> []

[("0","1")] -> []

[("0","1"),("1","2")] -> [("01","12")]

[("a","b"),("b","c"),("c","a")] -> [("ab","bc"),("bc","ca"),("ca","ab")]

[("1","2"),("1","3"),("1","4"),("2","5"),("3","4"),("4","5")] -> [("12","13"),("12","14"),("12","25"),("13","14"),("13","34"),("14","34"),("14","45"),("25","45"),("34","45")]

4
のような入力を除外する質問には何も表示されません。[("1","23"),("23","4"),("12","3"),("3","4")]出力はおそらくであるはずですが[("123","234"),("123","34")]、正しく解釈することはできません。これを修正する唯一の方法は、入力にそのようなあいまいさが含まれないように編集することですが、この質問がサンドボックスに投稿されいた場合、出力の頂点の命名について規範的ではないことをお勧めします。
Peter Taylor

2
Peter Taylorのコメントに加えて、頂点名がすべて入力で1文字長であると想定できますか?
サンダー-モニカを復活させる'16年

回答:


2

Ruby、51バイト

->a{a.combination(2){|x,y|p [x*'',y*'']if(x&y)[0]}}

オンラインでお試しください!

2つのエッジの組み合わせごとに、それらに共通の頂点がある場合(つまり、交差の最初の要素がでない場合nil)、2つのエッジを含む配列をSTDOUTに出力します。


2

JavaScript(Firefox 30-57)、77バイト

a=>[for(x of a=a.map(x=>x.join``))for(y of a)if(x<y&&x.match(`[${y}]`))[x,y]]

すべての入力が単一の文字であると想定します(まあ、^および以外の単一の文字])。


Firefox 30-57がこの回答にとって特別な理由は何ですか?
Night2

1
@ Night2配列内包構文は、これらのバージョンのFirefoxでのみサポートされていました。
Neil、

2

Brachylog、13バイト

{⊇Ċ.c¬≠∧}ᶠcᵐ²

オンラインでお試しください!

すべてのテストケースで

(@Fatalizeのおかげl₂Ċ、1バイトがで置き換えられます。)

{⊇Ċ.c¬≠∧}ᶠcᵐ²   Full code
{       }ᶠ      Find all outputs of this predicate:
 ⊇Ċ.             A two-element subset of the input
    c            which when its subarrays are concatenated
     ­          does not have all different elements
                 (i.e. some element is repeated)
       ∧         (no further constraint on output)
          cᵐ²   Join vertex names in each subsubarray in that result

1バイトを節約するĊ代わりに、制約付き変数(カップル)を使用できl₂ます。
18

2

K(ngn / k)45 39 33 29 30バイト

(*>:)#(3=#?,/)#,/{x,/:\:x}@,:'

オンラインでお試しください!

,:' 各要素を1要素のリストでラップする

{ }@ 暗黙の引数を持つ関数を適用する x

x,/:\:x左のxそれぞれを右のそれぞれと連結しx、結果の行列を取得します-エッジのすべてのペア

,/ マトリックスを平坦化する

( )# フィルタ

(3=#?,/)#連結(,/)のカウント(#)が正確に3つの一意の(?)要素であるペアのみをフィルタリングします

これは、エッジのように削除("ab";"ab")し、("ab";"cd")リストから。

(*>)#ソート降順の順列(>)が(*)a 1で始まるペアのみをフィルタリングします(0以外はブールtrue)

私たちの場合、ソートの降順の順列は0 1またはになり1 0ます。


1

どのようにしているfƇゼリーに使用?ドキュメントでそれを読んだ場合、どちらもフィルターです。f「である。; Yていないxから要素を削除フィルタ」とƇは「フィルタ(の別名Ðf)の条件を満足するすべてのアイテムを保管してください。。」。それらは常に一緒に使用されますか?をƇ使用してフィルターを閉じていますfか?のように、05AB1E とf...Ƈ似ていʒ...}ますか?それとも/(「Reduceまたはn-wise reduce。」)はそれと関係がありますか?コードを理解しようとするだけで、2つの異なるフィルターコマンド(およびここで両方がどのように使用されるか)に戸惑います。:)
Kevin Cruijssen

2
@KevinCruijssenいいえ、fおよびƇ2つの完全に独立したものです。あなたは考えることができますfように、交差点(それが彼らの共通の要素を返し、与えられた二つのリスト)とƇのようなものですʒ05AB1Eインチ つまりŒc、リストから2つの要素の可能なすべての組み合わせを返し、2つの項目の共通部分を返すƇリンク(つまり、Jelly関数)を満たすものだけを保持しf/ます。しかしfdyad(2つの引数を持つ関数)であり、代わりに2つの要素のリストに適用する必要があるため、、/ reduce を使用する必要があります。
Xcoder氏

ああ、わかりました。私fはドキュメントで「フィルター」という用語を推測していますが、正しいですが、主に実際Ƈに使用されているフィルターと混同されていました。「2つのリストを指定すると、それらの共通の要素を返す」という説明ですべてが明確になりました。そして、私は確かにそれが/何らかの形でジェリーのデータを変換するために使用されていると感じました。実際、私は今、Jelly wikiのチュートリアルのセクション6.6 Reduceを見て、それがダイアドをポップし、簡約されたモナドをプッシュする方法を説明しています(基本的に2つの引数と引数としてのペアのリスト)。ありがとう、すべてクリアになりました!
Kevin Cruijssen

1

MATL、13バイト

2XN!"@Y:X&n?@

オンラインでお試しください!

与えられたセル配列入力を期待したほど悪くはありません。基本的に@DoorknobのRubyの回答と同じ考えです。

2XN   % Get all combinations of 2 elements from the input
!     % Transpose
"     % Iterate over the columns (combinations)
@     % Push the current combination of edges
Y:    % Split it out as two separate vectors
X&n   % Get the number of intersecting elements between them
?@    % If that's non-zero, push the current combination on stack
      % Implicit loop end, valid combinations collect on the stack 
      %  and are implicitly output at the end


0

Mathematica 23バイト

EdgeList[LineGraph[#]]&

例: g = Graph[{1 <-> 2, 2 <-> 3, 3 <-> 4, 2 <-> 4 }]

ここに画像の説明を入力してください

EdgeList@LineGraph[g]

(*

{2 <-> 1、3 <-> 2、4 <-> 1、4 <-> 2、4 <-> 3}

*)


0

Pyth、7バイト

@F#.cQ2

ここでお試しください!

結合が必要な場合、10バイト

sMM@F#.cQ2

ここでお試しください!


出力に必要なフォームがありません。ノードを文字列結合する必要があります。
DavidC

@DavidCなぜそれが必要になるのかわからないし、それを必要とするチャレンジ仕様のどの部分も特定できませんが、それらに加わるバージョンを追加しました。
Xcoder氏18

結合はすべてのテストケースで使用されました。私の場合、参加にかかるコストは9バイトです。わずか3バイトを追加するだけでそれを行うことができました。印象的!
DavidC、

0

Wolfram言語64 53バイト

""<>#&/@#&/@Select[#~Subsets~{2},IntersectingQ@@#&]&

Subset長さ2 のすべての入力リストのsを検索しますSelect。1つのペアのノードが別のペアのノードと交差する(ペアがノードを共有することを示す)ものとStringJoin、選択したすべてのペアのノードを検索します。

4つのネストされた純粋な(別名 "匿名")関数を使用しているため、コードは特に読みにくくなっています。

コードは、Wolfram言語で慣例となっているように、リストの区切り文字として中括弧「{}」を使用します。

Xcoderさんのおかげで1バイト節約されました。


""<>#&/@#&/@Select[#~Subsets~{2},IntersectingQ@@#&]&[{{"1","2"},{"1","3"},{"1","4"},{"2","5"},{"3","4"},{"4","5"}}]

(*{{"12", "13"}, {"12", "14"}, {"12", "25"}, {"13", "14"}, {"13", "34"}, {"14", "34"}, {"14", "45"}, {"25", "45"}, {"34", "45"}}*)

現在のバイト数は実際には64バイトではなく65バイトです。ただし、1バイトでゴルフできますSelect[#~Subsets~{2},IntersectingQ@@#&]/.{a_,b_}:>{""<>a,""<>b}&オンラインでお試しください!
Xcoder氏、2018

0

Python 2、109バイト

lambda a:[(s,t)for Q in[[''.join(p)for p in a if x in p]for x in set(sum(a,()))]for s in Q for t in Q if s<t]

オンラインでお試しください!

各ノードx(フラット化されたエッジのリストからセットを作成することで検出される)について、メンバーとしてp持つペアのリストを作成しxます。次に、これらのリストのそれぞれについて、そのQ中でQ一意の個別のペアを見つけます(一意性/区別はを介して適用されますif s<t)。


0

C#233バイト

static void c(List<(string a,string b)>i,List<(string,string)>o){for(int m=0;m<i.Count;m++){for(int n=m+1;n<i.Count;n++){if((i[n].a+i[n].b).Contains(i[m].a)||(i[n].a+i[n].b).Contains(i[m].b)){o.Add((i[m].a+i[m].b,i[n].a+i[n].b));}}}}

using System;
using System.Collections.Generic;

namespace conjugateGraphGolf
{
    class Program
    {
        static void Main()
        {
            List<(string a, string b)>[] inputs = new List<(string, string)>[]
            {
                new List<(string, string)>(),
                new List<(string, string)>() {("0", "1")},
                new List<(string, string)>() {("0", "1"),("1", "2")},
                new List<(string, string)>() {("a","b"),("b","c"),("c","a")},
                new List<(string, string)>() {("1","2"),("1","3"),("1","4"),("2","5"),("3","4"),("4","5")}
            };

            List<(string, string)> output = new List<(string, string)>();

            for(int i = 0; i < inputs.Length; i++)
            {
                output.Clear();
                c(inputs[i], output);

                WriteList(inputs[i]);
                Console.Write(" -> ");
                WriteList(output);
                Console.Write("\r\n\r\n");
            }

            Console.ReadKey(true);
        }

        static void c(List<(string a,string b)>i,List<(string,string)>o){for(int m=0;m<i.Count;m++){for(int n=m+1;n<i.Count;n++){if((i[n].a+i[n].b).Contains(i[m].a)||(i[n].a+i[n].b).Contains(i[m].b)){o.Add((i[m].a+i[m].b,i[n].a+i[n].b));}}}}

        public static void WriteList(List<(string a, string b)> list)
        {
            Console.Write("[");
            for(int i = 0; i < list.Count; i++)
            {
                Console.Write($"(\"{list[i].a}\",\"{list[i].b}\"){(i == list.Count - 1 ? "" : ",")}");
            }
            Console.Write("]");
        }
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.