Geçiş Eşitliği


16

Meydan okuma

Programınız 3 giriş almalıdır:

  • Değişken sayısı olan pozitif bir tam sayı,
  • Her bir çiftin değişkenler arasında bir eşitliği temsil ettiği bir dizi sırasız negatif olmayan tamsayı çifti ve
  • Başlangıç ​​değişkenini temsil eden pozitif bir tam sayı,

Başlangıç ​​değişkenine geçiş olarak eşit olduğu gösterilebilen tüm değişkenleri temsil eden (başlangıç ​​değişkeninin kendisi dahil) bir dizi negatif olmayan tamsayı döndürmelidir.

Başka bir deyişle, verilen girdiler N, Eve S, bir set döndürür Q, öyle ki:

  • S ∈ Q.
  • Eğer Z ∈ Qve (Y = Z) ∈ E, sonra Y ∈ Q.
  • Eğer Z ∈ Qve (Z = Y) ∈ E, sonra Y ∈ Q.

Bu aynı zamanda bir sorunu olarak da ifade edilebilir :

Yönlendirilmemiş bir grafik ve grafikte bir tepe noktası verildiğinde, bağlı bileşenindeki köşeleri listeleyin .

Özellikler

  • 0 tabanlı veya 1 tabanlı dizinlemeyi kullanmayı seçebilirsiniz.
  • İlk giriş, değişkenlerin sayı olarak verildiği mevcut değişken sayısını sayar. Alternatif olarak, bu girdiyi alamazsınız; bu durumda, dizinleme düzeninize bağlı olarak, bunun mevcut en yüksek değişken dizinine veya bundan bir tanesine eşit olduğu varsayılır.
  • Girdinin iyi biçimlendirildiğini varsayabilirsiniz: size ilk girdi tarafından belirtilen aralığın dışında değişkenler verilmeyecektir. Örneğin, 3, [1 = 2, 2 = 0], 1geçerli bir giriş olsa 4, [1 = 719, 1 = 2, 3 = 2], -3da değil.
  • Sen olamaz herhangi değişken onunla ilişkili herhangi Eşitlikler sahip olacağını varsayıyoruz. "Yalnız" olan üçüncü bir girdi verilirse (eşitliği yoktur), doğru çıktı yalnızca bu girdiyi içeren tek bir kümedir (kendisine eşit olduğu için).
  • Eşitliklerin bir değişkenden kendisine bir eşitlik içermeyeceğini ve aynı eşitliğin birden çok kez verilmeyeceğini varsayabilirsiniz (bu, 1 = 2ve gibi şeyleri içerir 2 = 1).
  • Verilen tüm tam sayıların dilinizin temsil edilebilir aralığı içinde olacağını varsayabilirsiniz.
  • İkinci girişi istediğiniz formatta alabilirsiniz.

İşte bazı makul biçimler:

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]
  • İstediğiniz herhangi bir biçimde çıktı alabilirsiniz (yani set, liste, vb.). Düzen önemsizdir.

puanlama

Bu , bu nedenle en kısa geçerli program (bayt cinsinden) kazanır.

Test Durumları (0 dizinli)

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}

Test Durumları (1 dizinli)

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}


Arzu edersek ilk girdiyi almayı bırakabilir miyiz? Doğru çıktıyı almanın gerekli olmadığını düşünüyorum
dylnan

@dylnan "İlk giriş, değişkenlerin sayı olarak verildiği mevcut değişkenlerin sayısını sayar. Alternatif olarak, bu girdiyi alamazsınız, bu durumda bunun mevcut en yüksek değişken dizinine veya bir değişkene eşit olduğu varsayılır. indeksleme
şemanıza

Üzgünüm bazen okumayı bitirmeyi unuttum
dylnan

Çıktıda kopyalar olabilir mi? (Bir seti temsil ettiğini iddia edebilirim ...)
Ton Hospel

Yanıtlar:


7

Brachylog , 22 bayt

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

Çevrimiçi deneyin!

açıklama

{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

Temiz , 85 81 bayt

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

Çevrimiçi deneyin!

İşlevi tanımlar $ :: [[Int]] -> ([Int] -> [Int])


İlginç. Nasıl limitçalışır?
Esolanging Fruit

@EsolangingFruit sonsuz olduğu varsayılan bir liste alır ve üst üste iki kez oluşan ilk öğeyi döndürür.
Οurous

1
Oh, çok faydalı görünüyor!
Esolanging Fruit


1

Flashpoint komut dosyası dili, 364 bayt işlemi

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}

İle ara:

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
]

Çıktı:

resim açıklamasını buraya girin

unrolled:

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

Jöle ,  12   11  10 bayt

-1 Erik sayesinde Outgolfer (atomu yerine œ&ile f)

⁹fÐfȯFµÐLQ

ESolda (iki liste uzunluğunun bir listesi olarak) ve Ssağda (tamsayı olarak) bir [çoğaltılmış] liste döndüren ikili bir bağlantı .

Çevrimiçi deneyin! veya bir test takımına bakın .

Nasıl?

⁹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

œ&'s ve f' dönüş değerleri her zaman aynı boolean özelliğine sahiptir.
Outgolfer Erik

1

Perl 5 -n0 , 49 39 bayt

STDIN üzerindeki bir çizgiye başlangıç ​​değeri verin, ardından eşdeğer sayı çiftlerinin çizgilerini verin (veya başlangıç ​​değerini son veya orta olarak verin veya birden çok başlangıç ​​değeri verin, hepsi işe yarar)

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

Çevrimiçi deneyin!

Bu, sonuç kümesindeki bir öğeyi birden çok kez çıktısı alabilir. Bu 48 bayt varyasyon, her eşdeğer elemanı yalnızca bir kez çıktılar:

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

Çevrimiçi deneyin!



1

K (ngn / k) , 37 36 35 bayt

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

Çevrimiçi deneyin!

{ }bağımsız değişken ile işlev x, yve ztemsil N, EveS sırasıyla

!x liste 0 1 ... x-1

&2 liste mi 0 0

y,,&2Biz çifti eklemek 0 0için yboş bir özel durum önlemek içiny

+y,,&2 aynı şey bir çiftler listesinden bir çift listeye aktarıldı

{ }[+y,,&2]bir çıkıntı, bir işlev, yani edildiği xdeğeri olacaktır +y,,&2vey çıkıntı çağrı zaman içinde geçirilen bağımsız değişken olacak

|y xolduğu yendekslerine x, ters ( |)

@[y;x;&;|y x]mevcut öğenin ve öğenin minimum ( ) değerini alarak yendekslerde değişiklik yapmax&|y x

/ yakınsamaya kadar aramaya devam et

a: atamak

a[z]=zaEşit elemanların boole maskesiz th

& boolean maskesini bir indeks listesine dönüştür


1

Oktav , 48 45 bayt

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

Örnek kullanımlar için, "bitişiklik matris" olarak girdi Alır [0 0 0; 0 0 1; 1 0 0]için [2 = 3, 3 = 1], bunu çevrimiçi deneyin!

açıklama

İlk olarak eye(size(A))(elemanlar refleksiftir), A(girdi) ve A'(ilişki simetriktir) toplamını kullanarak geçişli grafik için tam bitişiklik matrisini oluştururuz .

Geçişli kapanışı, nnz(A)yeterli olan gücü ( nnz(A)bir yolun uzunluğu için üst sınır olan) hesaplayarak hesaplıyoruz , bu yüzden geriye kalan tek şey sağ sırayı (u,:)ve findsıfır olmayan girişleri elde etmektir .




0

JavaScript (ES6), 87 bayt

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

Tekilleştirme &&[...new Set(d[n]||[n])]14 baytlık bir maliyetle yapılabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.