推移的平等


16

チャレンジ

プログラムには3つの入力が必要です。

  • 変数の数である正の整数、
  • 非負整数の順序付けられていないペアのセット。各ペアは変数間の等式を表し、
  • 開始変数を表す正の整数、

開始変数(開始変数自体を含む)と推移的に等しいことを示すことができるすべての変数を表す、負でない整数のセットを返す必要があります。

すなわち、所与の入力においてNEおよびS、セットを返すQ、その結果:

  • S ∈ Q
  • もしZ ∈ Qして(Y = Z) ∈ E、その後、Y ∈ Q
  • もしZ ∈ Qして(Z = Y) ∈ E、その後、Y ∈ Q

これは、問題として表現することもできます。

無向グラフとグラフ内の頂点が与えられた場合、その接続されたコンポーネント内の頂点をリストします

仕様書

  • 0ベースまたは1ベースのインデックスを使用することを選択できます。
  • 最初の入力は、存在する変数の数をカウントします。変数は数値として与えられます。または、この入力を受け取ることはできません。この場合、これは、インデックススキームに応じて、存在する最高の変数インデックスまたはこれよりも大きいインデックスのいずれかに等しいと見なされます。
  • 入力が正しい形式であると仮定できます。最初の入力で指定された範囲外の変数は与えられません。たとえば、3, [1 = 2, 2 = 0], 1は有効な入力ですが、そうで4, [1 = 719, 1 = 2, 3 = 2], -3はありません。
  • あなたはできません任意の変数は、それに関連付けられたすべての等式を持つことを前提としています。「孤独な」(等値性がない)3番目の入力が与えられると、正しい出力はその入力のみを含むシングルトンセットになります(それ自体に等しいため)。
  • 等式には変数からそれ自体への等式が含まれておらず、同じ等式が複数回与えられていないことを想定できます(これには1 = 2やなどが含まれます2 = 1)。
  • 指定されたすべての整数は、言語の表現可能な範囲内にあると想定できます。
  • 2番目の入力は、適切な形式で取得できます。

いくつかの妥当な形式は次のとおりです。

0 = 2
0 = 3
1 = 0

{(0, 2), (0, 3), (1, 0)}

[0, 2, 0, 3, 1, 0]

0 2 0 3 1 0

Graph[{{0, 2}, {0, 3}, {1, 0}}]

[0 = 2, 0 = 3, 1 = 0]
  • 任意の妥当な形式(つまり、セット、リストなど)で出力できます。順序は関係ありません。

得点

これはであるため、最短の有効なプログラム(バイト単位)が勝ちます。

テストケース(0インデックス付き)

3, [1 = 2, 2 = 0], 1                      -> {0, 1, 2}
5, [0 = 2, 0 = 3, 1 = 2], 3               -> {0, 1, 2, 3}
6, [0 = 3, 1 = 3, 2 = 4, 5 = 1], 4        -> {2, 4}
6, [0 = 3, 1 = 3, 2 = 4, 5 = 1], 5        -> {0, 1, 3, 5}
5, [0 = 1, 2 = 0, 0 = 3, 4 = 0], 2        -> {0, 1, 2, 3, 4}
6, [0 = 1, 1 = 2, 2 = 3, 3 = 4, 4 = 5], 3 -> {0, 1, 2, 3, 4, 5}
4, [0 = 1, 1 = 2, 2 = 0], 3               -> {3}
5, [0 = 2, 2 = 4], 2                      -> {0, 2, 4}
8, [], 7                                  -> {7}

テストケース(1-indexed)

3, [2 = 3, 3 = 1], 2                      -> {1, 2, 3}
5, [1 = 3, 1 = 4, 2 = 3], 4               -> {1, 2, 3, 4}
6, [1 = 4, 2 = 4, 3 = 5, 6 = 2], 5        -> {3, 5}
6, [1 = 4, 2 = 4, 3 = 5, 6 = 2], 6        -> {1, 2, 4, 6}
5, [1 = 2, 3 = 1, 1 = 4, 5 = 1], 3        -> {1, 2, 3, 4, 5}
6, [1 = 2, 2 = 3, 3 = 4, 4 = 5, 5 = 6], 4 -> {1, 2, 3, 4, 5, 6}
4, [1 = 2, 2 = 3, 3 = 1], 4               -> {4}
5, [1 = 3, 3 = 5], 3                      -> {1, 3, 5}
8, [], 8                                  -> {8}


必要に応じて、最初の入力を控えることができますか?正しい出力を取得する必要はないと思う
-dylnan

@dylnan "最初の入力は存在する変数の数をカウントします。変数は数値として与えられます。あるいは、この入力を受け取ることはできませんこの場合、これは存在する最高の変数インデックスまたは1インデックス作成スキームに応じて、これよりも多くなります。 "(仕様のポイント2)
エソランジングフルーツ

申し訳ありませんが、読み終えることを忘れる場合があります
-dylnan

出力に重複が含まれることがありますか?(私はそれがセットを表していると主張することができます...)
トンホスペル

回答:


7

Brachylog、22バイト

{tc⊇,?k.&¬(t∋;.xȮ)∧}ᶠt

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

説明

{tc⊇,?k.&¬(t∋;.xȮ)∧}ᶠt  Input is a pair, say [2,[[1,3],[2,4],[5,2]]]
{                   }ᶠ   Find all outputs of this predicate:
 t                        Tail: [[1,3],[2,4],[5,2]]
  c                       Concatenate: [1,3,2,4,5,2]
   ⊇                      Choose a subset: [4,5]
    ,?                    Append the input: [4,5,2,[[1,3],[2,4],[5,2]]]
      k                   Remove the last element: [4,5,2]
       .                  This list is the output.
        &¬(      )∧       Also, the following is not true:
           t∋              There is a pair P in the second part of the input.
             ;.x           If you remove from P those elements that occur in the output,
                Ȯ          the result is a one-element list.
                      t  Take the last one of these outputs, which is the shortest one.



2

クリーン85 81バイト

import StdEnv
$l=limit o iterate(\v=removeDup(flatten[v:filter(isAnyMember v)l]))

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

関数を定義します $ :: [[Int]] -> ([Int] -> [Int])


面白い。どのように機能しlimitますか?
エソランジングフルーツ

@EsolangingFruitは、無限であると見なされたリストを受け取り、連続して2回出現する最初の要素を返します。
Οurous

1
ああ、それはとても便利なようです!
エソランジングフルーツ


1

Operation Flashpointスクリプト言語、364バイト

f={t=_this;r=t select 1;i=0;while{i<t select 0}do{call format["V%1=[%1]",i];i=i+1};i=0;while{i<count r}do{call format(["V%1=V%1+V%2;V%2=V%1"]+(r select i));i=i+1};l=call format["V%1",t select 2];g={i=0;c=count l;while{i<c}do{if(i<count l)then{e=l select i;call _this};i=i+1}};{l=l+call format["V%1",e]}call g;"l=l-[e]+[e];if(count l<c)then{c=count l;i=0}"call g;l}

で呼び出す:

hint format
[
    "%1\n%2\n%3\n%4\n%5\n%6\n%7\n%8\n%9",
    [3, [[1, 2], [2, 0]], 1] call f,
    [5, [[0, 2], [0, 3], [1, 2]], 3] call f,
    [6, [[0, 3], [1, 3], [2, 4], [5, 1]], 4] call f,
    [6, [[0, 3], [1, 3], [2, 4], [5, 1]], 5] call f,
    [5, [[0, 1], [2, 0], [0, 3], [4, 0]], 2] call f,
    [6, [[0, 1], [1, 2], [2, 3], [3, 4], [4, 5]], 3] call f,
    [4, [[0, 1], [1, 2], [2, 0]], 3] call f,
    [5, [[0, 2], [2, 4]], 2] call f,
    [8, [], 7] call f
]

出力:

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

展開:

f =
{
    t = _this;
    r = t select 1;
    i = 0;
    while {i < t select 0} do
    {
        call format["V%1=[%1]", i];
        i = i + 1
    };

    i = 0;
    while {i < count r} do
    {
        call format(["V%1=V%1+V%2;V%2=V%1"] + (r select i));
        i = i + 1
    };

    l = call format["V%1", t select 2];

    g =
    {
        i = 0;
        c = count l;
        while {i < c} do
        {
            if (i < count l) then
            {
                e = l select i;
                call _this
            };
            i = i + 1
        }
    };

    {l = l + call format["V%1", e]} call g;
    "l = l - [e] + [e];

    if (count l<c)then
    {
        c = count l;
        i = 0
    }" call g;

    l
}


1

ゼリー 12   11  10 バイト

-1アウトゴルファーのエリックに感謝(アトムœ&をに置き換えf

⁹fÐfȯFµÐLQ

E左側(長さ2のリストのリストとして)およびS右側(整数として)を受け入れて、[重複排除]リストを返すダイアディックリンク。

オンラインでお試しください!またはテストスイートを参照してください。

どうやって?

⁹fÐfȯFµÐLQ - Link: list of lists, E; integer S
      µÐL  - repeat the monadic chain to the left until a fixed point is reached:
  Ðf       -   (for each pair in E) filter keep if:
 f         -     filter discard if in
⁹          -     chain's right argument
           -     (originally [S], thereafter the previous result as monadic)
    ȯ      -   logical OR with implicit right
           -   (force first pass to become S if nothing was kept)
     F     -   flatten to a single list
           -   (S -> [S] / [[1,4],[1,0]]->[1,4,1,0] / etc...)
         Q - de-duplicate

œ&fの戻り値は常に同じブール値プロパティを持ちます。
エリックアウトゴルファー

1

Perl 5の -n049の 39バイト

STDINの行に開始値を指定し、その後に同等の番号のペアの行を指定します(または開始値を最後または中央に指定するか、複数の開始値を指定します。すべて機能します)。

#!/usr/bin/perl -n0
s/
$1? | $1/
/ while/^(\d+
)/msg;say//g

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

これにより、結果セットの要素を複数回出力できます。この48バイトのバリエーションは、同等の各要素を1回だけ出力します。

s/
$1? | $1/
/ while/^(\d+
)(?!.*^\1)/msg;say//g

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



1

K(ngn / k)37 36 35バイト

{&a[z]=a:{y[x]&:|y x;y}[+y,,&2]/!x}

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

{ }引数を持つ関数xy、およびz表現するNESそれぞれ

!x リストは0 1 ... x-1です

&2 リストです 0 0

y,,&2ペアを追加0 0しますy、空の特殊なケースを避けるために、y

+y,,&2 ペアのリストからペアのリストに転置された同じもの

{ }[+y,,&2]は射影、つまり、xの値となる関数です+y,,&2y、投影を呼び出す際に渡される引数になります

|y xあるy指標でx(反転、|

@[y;x;&;|y x]修正y指数でx最小値をとることによって(&)既存の要素と要素からの|y x

/ 収束するまで呼び出しを続ける

a: に割り当てる

a[z]=za等しい要素のブールマスクz-th

& ブールマスクをインデックスのリストに変換します


1

オクターブ48 45バイト

t=@(A,u)find(((eye(size(A))+A+A')^nnz(A))(u,:));

入力を「adjacency-matrix」として取得します。たとえば、forを使用[0 0 0; 0 0 1; 1 0 0]して[2 = 3, 3 = 1]オンライン試してください。

説明

まず、eye(size(A))(要素は再帰的)、A(入力)、A'(関係は対称)の合計を使用して、推移グラフの完全な隣接行列を構築します。

推移的閉包は、nnz(A)十分なパワー(nnz(A)パスの長さの上限)を計算することで計算されるため、そこから残りは右の行(u,:)findすべての非ゼロエントリを取得することです。




0

JavaScript(ES6)、87バイト

(a,n)=>a.map(([b,c])=>[...d[b]||[b],...d[c]||[c]].map((e,_,a)=>d[e]=a),d=[])&&d[n]||[n]

重複排除は&&[...new Set(d[n]||[n])]、14バイトのコストで使用できます。

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