及物平等


16

挑战

您的程序应接受3个输入:

  • 一个正整数,它是变量的数量,
  • 一组无序的非负整数对,其中每对代表变量之间的等式,并且
  • 代表起始变量的正整数,

它应该返回一组表示所有变量的非负整数,这些变量可以证明与起始变量(包括起始变量本身)在传递上相等。

换句话说,给定的输入NES返回一个set 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不是。
  • 不能假定任何变量将具有与其相关的任何等式。如果给定第三个输入是“寂寞的”(没有相等性),则正确的输出是仅包含该输入的单例集(因为它等于自身)。
  • 您可以假设等式不会包含从变量到其本身的等式,并且不会多次给出相同的等式(这包括诸如1 = 22 = 1)。
  • 您可以假定所有给定的整数都将在您的语言可表示的范围内。
  • 您可以采用任何合理格式的第二个输入。

以下是一些合理的格式:

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

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“第一个输入将对存在的变量数进行计数,其中变量以数字形式给出。或者,您不能采用此输入,在这种情况下,该输入等于存在的最高变量索引或一个。不止此,根据您的索引方案 “(规范第2点)
Esolanging水果

抱歉,有时我忘了读完书
dylnan

输出中是否可以包含重复项?(我可以说它代表一个集合...)
Ton Hospel

Answers:


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工作如何?
Esolanging Fruit

@EsolangingFruit接受一个假定为无限的列表,并返回连续出现两次的第一个元素。
世纪

1
哦,这似乎很有用!
水果


1

闪点行动脚本语言,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由于埃里克Outgolfer(取代原子œ&f

⁹fÐfȯFµÐLQ

双向链接E在左侧(作为长度为两个列表的列表)和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的返回值始终具有相同的布尔属性。
暴民埃里克(Erik the Outgolfer)

1

Perl的5 -n049 39个字节

在STDIN上的一行上给出起始值,然后再输入成对的等价线对(或者在最后或中间给出起始值,或者给出多个起始值,这一切都可行)

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

在线尝试!

这样可以多次输出结果集中的元素。这个48字节的变化仅输出每个等效元素一次:

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}

在线尝试!

{ }带参数的函数xyz表示NES分别

!x 是列表0 1 ... x-1

&2 是清单 0 0

y,,&2我们添加一0 0y以避免出现空的特殊情况y

+y,,&2 从配对列表转换为一对列表的同一件事

{ }[+y,,&2]是一个投影,即一个函数,其中x将是的值,+y,,&2并且y将是调用投影时传入的参数

|y xy在指标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,:));

将输入作为“邻接矩阵”,例如[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字节的成本可以实现重复数据删除。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.