ความเท่าเทียมกันของสกรรมกริยา


16

ความท้าทาย

โปรแกรมของคุณควรมี 3 อินพุต:

  • จำนวนเต็มบวกซึ่งเป็นจำนวนตัวแปร
  • ชุดของคู่ที่ไม่เรียงลำดับของจำนวนเต็มที่ไม่ใช่ค่าลบซึ่งแต่ละคู่แสดงถึงความเท่าเทียมกันระหว่างตัวแปรและ
  • จำนวนเต็มบวกซึ่งแสดงถึงตัวแปรเริ่มต้น

มันควรจะส่งคืนชุดของจำนวนเต็มที่ไม่ใช่ค่าลบซึ่งเป็นตัวแทนของตัวแปรทั้งหมดซึ่งสามารถแสดงให้เห็นว่าเป็นแบบเปลี่ยนผ่านได้เท่ากับตัวแปรเริ่มต้น (รวมถึงตัวแปรเริ่มต้นเอง)

ในคำอื่น ๆ ปัจจัยการผลิตที่กำหนดN, EและSกลับชุดQดังกล่าวว่า:

  • S ∈ Q.
  • ถ้าZ ∈ Qและแล้ว(Y = Z) ∈ EY ∈ Q
  • ถ้าZ ∈ Qและแล้ว(Z = Y) ∈ EY ∈ 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 ของข้อมูลจำเพาะ)
ผลไม้ที่ถูกทำลาย

ขออภัยบางครั้งฉันลืมอ่านจนจบ
dylnan

เอาท์พุทอาจมีซ้ำกัน? (ฉันสามารถอ้างว่ามันเป็นชุด ... )
Ton Hospel

คำตอบ:


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 ต้องใช้รายการสันนิษฐานว่าไม่มีที่สิ้นสุดและส่งคืนองค์ประกอบแรกที่เกิดขึ้นสองครั้งติดต่อกัน
Marurous

1
โอ้ดูเหมือนว่ามีประโยชน์มาก!
แยกผลไม้


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 ขอบคุณ Erik the Outgolfer (แทนที่อะตอมœ&ด้วยf)

⁹fÐfȯFµÐLQ

ลิงก์ dyadic ยอมรับ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 -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

K (ngn / k) , 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 -th

& แปลงบูลีนมาสก์เป็นรายการดัชนี


1

อ็อกเท48 48ไบต์

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

รับอินพุตเป็น "adjacency-matrix" ตัวอย่างเช่นใช้[0 0 0; 0 0 1; 1 0 0]สำหรับ[2 = 3, 3 = 1],ลองออนไลน์!

คำอธิบาย

ก่อนอื่นเราสร้างเมทริกซ์ adjacency ที่สมบูรณ์สำหรับกราฟสกรรมกริยาโดยใช้ผลรวมของ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.