Перехідна рівність


16

Змагання

Ваша програма повинна взяти 3 входи:

  • Позитивне ціле число - кількість змінних,
  • Сукупність не упорядкованих пар цілих чисел, де кожна пара являє собою рівність між змінними, і
  • Позитивне ціле число, яке представляє стартову змінну,

Він повинен повернути набір невід’ємних цілих чисел, які представляють усі змінні, які можуть бути показані як перехідно рівні початкової змінної (включаючи саму стартову змінну).

Іншими словами, при входах N, Eі 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як ні.
  • Ви не можете припустити, що будь-яка змінна матиме з нею будь-які рівності. Якщо дано третій вхід, який є "одиноким" (не має рівностей), правильний вихід - це односинний набір, що містить лише цей вхід (оскільки він дорівнює самому).
  • Ви можете припустити, що рівності не будуть містити рівності від змінної до себе, і що однакова рівність не буде надана багаторазово (сюди входять такі речі, як 1 = 2і 2 = 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 Fruit

Вибачте, іноді забуваю закінчити читання
dylnan

Може висновок містить дублікати? (Я можу стверджувати, що він являє собою набір ...)
Тон Євангелія

Відповіді:


7

Брахілог , 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 бере список, який вважається нескінченним, і повертає перший елемент, що виникає двічі поспіль.
Οurous

1
О, це здається дуже корисним!
Esolanging Fruit


1

Операція мови сценаріїв 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

Python 2 , 53 байти

e,s,n=input()
b={s}
for p in n*e:b|=b&p and p
print b

Спробуйте в Інтернеті!

Та ж довжина, що і функція:

lambda e,s,n:reduce(lambda b,p:b|(b&p and p),n*e,{s})

Спробуйте в Інтернеті!

Це засноване на приємному рішенні Рода, використовуючи оновлення короткого замикання b|=b&p and p. Введення кількості змінних як вхідних даних nсприяє скороченню коду циклу.


1

Желе ,  12   11  10 байт

-1 спасибі Еріку Аутгольферу (заміни атома œ&на 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Зворотні значення 's і ' завжди мають однакове булеве властивість.
Ерік Аутгольфер

1

Перл 5 -n0 , 49 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

К (нг / к) , 37 36 35 байт

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

Спробуйте в Інтернеті!

{ }функція з аргументами x, yі zпредставляючи N, Eі Sвідповідно

!x - це список 0 1 ... x-1

&2 це перелік 0 0

y,,&2ми додаємо пару, 0 0щоб yуникнути особливого випадку порожньогоy

+y,,&2 те саме, що перенесено зі списку пар до пари списків

{ }[+y,,&2]- це проекція, тобто функція, в якій xбуде значення +y,,&2і yбуде аргумент, переданий при виклику проекції

|y xзнаходиться yв індексах x, зворотній (| )

@[y;x;&;|y x]вносити зміни yв індекси x, взявши мінімум (& ) існуючого елемента та елемента з|y x

/ продовжуйте телефонувати до конвергенції

a: призначити а

a[z]=zбулева маска елементів, що aдорівнює z-му

& перетворити булеву маску в список індексів


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 байт.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.