ตรวจสอบว่าความสัมพันธ์เป็นสกรรมกริยา


15

คำอธิบายการท้าทาย

เริ่มด้วยคำจำกัดความบางอย่าง:

  • ความสัมพันธ์เป็นชุดของคู่อันดับขององค์ประกอบ (ในความท้าทายนี้เราจะใช้จำนวนเต็ม)

ตัวอย่างเช่น[(1, 2), (5, 1), (-9, 12), (0, 0), (3, 2)]มีความสัมพันธ์

  • ความสัมพันธ์เรียกว่าสกรรมกริยาหากมีองค์ประกอบสองคู่(a, b)และ(b, c)ในความสัมพันธ์นี้คู่(a, c)ก็มีอยู่ด้วย

  • [(1, 2), (2, 4), (6, 5), (1, 4)]เป็นสกรรมกริยาเพราะมันมี(1, 2)และ(2, 4)แต่ก็(1, 4)เช่นกัน

  • [(7, 8), (9, 10), (15, -5)]เป็นสกรรมกริยาเพราะมีไม่ใดสองคู่ (a, b), (c, d)ปัจจุบันเช่นที่=bc

  • [(5, 9), (9, 54), (0, 0)]ไม่ใช่สกรรมกริยาเนื่องจากมี(5, 9)และ(9, 54)แต่ไม่ใช่(5, 54)

รับรายการคู่จำนวนเต็มพิจารณาว่าความสัมพันธ์เป็นสกรรมกริยาหรือไม่

อินพุต / เอาต์พุต

คุณจะได้รับรายการจำนวนเต็มคู่ในรูปแบบที่เหมาะสม พิจารณาความสัมพันธ์

[(1, 6), (9, 1), (6, 5), (0, 0)]

รูปแบบต่อไปนี้เทียบเท่า:

[(1, 6), (9, 1), (6, 5), (0, 0)] # list of pairs (2-tuples)
[1, 9, 6, 0], [6, 1, 5, 0] # two lists [x1, x2, ..., xn] [y1, y2, ..., yn]
[[1, 6], [9, 1], [6, 5], [0, 0] # two-dimentional int array
[4, 1, 6, 9, 1, 6, 5, 0, 0] # (n, x1, y1, ..., xn, yn)
[1+6i, 9+i, 6+5i, 0+0i] # list of complex numbers

... many others, whatever best suits golfing purposes

เอาท์พุท: คุณค่าความจริงสำหรับความสัมพันธ์สกรรมกริยาเป็นเท็จอย่างอื่น คุณอาจสมมติว่าอินพุตจะประกอบด้วยอย่างน้อยหนึ่งคู่และคู่นั้นไม่ซ้ำกัน


อินพุตต้องมีรูปแบบรายการที่เหมือนกันหรือเป็นรูปแบบ adjacency หรือคล้ายกับเมทริกซ์หรือไม่
xnor

คุณควรมีกรณีทดสอบที่เป็นสกรรมกริยาเพียงเพราะคู่มีการสั่งซื้อ (1,3) (2,1) (3,4) (1,4) (2,4)เช่น หากคู่ไม่ได้รับคำสั่งสิ่งนี้จะไม่ส่งผ่านเพราะ(2,3)ขาดหายไป
Martin Ender

1
@ มาร์ตินฉันคิดว่าคุณตีความ "คู่ที่สั่งซื้อ" ผิดไป ฉันไม่คิดว่ามันหมายถึงคู่ตามลำดับ - ฉันคิดว่ามันหมายความว่าแต่ละคู่มีคำสั่งตั้งแต่แรกแล้วที่สอง
isaacg

@isaacg นั่นคือสิ่งที่ฉันหมายถึง กล่าวอีกนัยหนึ่งกรณีทดสอบของฉันเป็นจริงเพียงเพราะความสัมพันธ์ไม่สมมาตรโดยปริยาย
Martin Ender

กรณีทดสอบครั้งที่สาม ( [(7, 8), (9, 10), (15, -5)]) ไม่ควรส่งผ่าน?
wnnmaw

คำตอบ:


8

Haskell, 42 ไบต์

f x=and[elem(a,d)x|(a,b)<-x,(c,d)<-x,b==c]

ตัวอย่างการใช้งาน: ->f [(1,2), (2,4), (6,5), (1,4)]True

(ด้านนอก) วนรอบคู่ทั้งหมด(a,b)และ (ภายใน) วนรอบคู่เดียวกันตอนนี้เรียก(c,d)และทุกครั้งเมื่อb==cตรวจสอบว่า(a,d)เป็นคู่ที่มีอยู่ andรวมผลลัพธ์ด้วยตรรกะ


คำตอบที่อ่านได้มากที่สุด!
Lynn

@Lynn ลองดูคำตอบจาก Prolog จากนั้น ;-)
coredump

4

 Prolog, 66 ไบต์

t(L):-not((member((A,B),L),member((B,C),L),not(member((A,C),L)))).

ความสัมพันธ์ไม่ได้เป็นสกรรมกริยาถ้าเราสามารถหา (A, B) และ (B, C) เช่นนั้น (A, C) ไม่ได้ถือ


4

MATL , 27 25 ไบต์

7#u2e!l6MX>thl4$XQttY*g<~

รูปแบบอินพุตเป็นเมทริกซ์ (ใช้;เป็นตัวคั่นแถว) โดยที่ความสัมพันธ์แต่ละคู่เป็นคอลัมน์ ตัวอย่างเช่นกรณีทดสอบ

[(1, 2), (2, 4), (6, 5), (1, 4)]
[(7, 8), (9, 10), (15, -5)]
[(5, 9), (9, 54), (0, 0)]

มีการป้อนข้อมูลตามลำดับเป็น

[1 2 6 1; 2 4 5 4]
[7 9 15; 8 10 -5]
[5 9 0; 9 54 0]

Truthyเอาท์พุทเมทริกซ์ที่เกิดขึ้นจากคน Falsyเป็นเมทริกซ์ที่มีศูนย์อย่างน้อยหนึ่งรายการ

ลองออนไลน์!

คำอธิบาย

รหัสก่อนลดจำนวนเต็มเข้าค่าที่ไม่ซ้ำกัน 1 ตามจำนวนเต็ม จากค่าเหล่านั้นมันจะสร้างเมทริกซ์ adjacency; เมทริกซ์คูณมันด้วยตัวมันเอง และแปลงค่าที่ไม่ใช่ศูนย์ในเมทริกซ์ผลลัพธ์ให้เป็นค่า ในที่สุดมันจะตรวจสอบว่าไม่มีรายการในเมทริกซ์หลังเกินกว่าในเมทริกซ์ adjacency


3

JavaScript (ES6), 69 67 ไบต์

a=>(g=f=>a.every(f))(([b,c])=>g(([d,e])=>c-d|!g(([d,c])=>b-d|c-e)))

บันทึก 2 ไบต์ด้วยความคิดที่ @Cyoce มีสี่สูตร 69 ไบต์ก่อนหน้านี้:

a=>a.every(([b,c])=>a.every(([d,e])=>c-d|a.some(([d,c])=>b==d&c==e)))
a=>!a.some(([b,c])=>!a.some(([d,e])=>c==d&a.every(([d,c])=>b-d|c-e)))
a=>a.every(([b,c])=>a.every(([d,e])=>c-d|!a.every(([d,c])=>b-d|c-e)))
(a,g=f=>a.every(f))=>g(([b,c])=>g(([d,e])=>c-d|!g(([d,c])=>b-d|c-e)))

1
คุณอาจจะสามารถที่จะลดลงการแก้ปัญหาที่สองโดยการย่อสำหรับ.every
Cyoce

@Cyoce แน่นอนคุณบันทึก 3 ไบต์ในแต่ละครั้งโดยการเขียน[e]ดังนั้นแม้ว่าจะมีค่าใช้จ่าย 8 ไบต์ในการกำหนดให้eคุณยังคงบันทึกไบต์ อย่างไรก็ตามฉันไปอีกขั้นหนึ่งโดยใช้ตัวย่อa.everyซึ่งบันทึกไบต์ที่สอง
Neil

3

Brachylogขนาด 24 ไบต์

'{psc[A:B:B:C],?'e[A:C]}

ลองออนไลน์!

คำอธิบาย:

'{psc[A:B:B:C],?'e[A:C]}
'{                     } it is impossible to find
    c                    a flattened
   s                     subset of
  p                      a permutation of the input
     [A:B:B:C]           that has four elements, with the second and third equal
              ,?         and such that the input
                'e       does not contain
                  [A:C]  a list formed of the first and fourth element

ในคำอื่น ๆ ถ้าใส่มีคู่[A:B]และ [B:C]เราสามารถเปลี่ยนรูปการป้อนข้อมูลที่จะนำ[A:B]และ [B:C]ที่จุดเริ่มต้นให้ลบองค์ประกอบอื่น ๆ [A:B:B:C]ทั้งหมดและผลิตรายการ จากนั้นเราจะคืนความจริงจากภาคแสดงภายใน (ความเท็จจากโปรแกรมทั้งหมด) หาก[A:C]ไม่มี


2

CJam (22 ไบต์)

{__Wf%m*{z~~=*}%\-e_!}

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

การผ่า

{         e# Begin a block
  _       e#   Duplicate the argument
  _Wf%    e#   Duplicate again and reverse each pair in this copy
  m*      e#   Cartesian product
  {       e#   Map over arrays of the form [[a b][d c]] where [a b] and [c d]
          e#   are in the relation
    z~~=* e#     b==c ? [a d] : []
  }%
  \-      e#   Remove those transitive pairs which were in the original relation
  e_!     e#   Test that we're only left with empty arrays
}

2

Pyth, 14 ไบต์

!-eMfqFhTCM*_M

ชุดทดสอบ

รูปแบบอินพุตคาดว่าจะเป็น [[0, 0], [0, 1], ... ]

!-eMfqFhTCM*_M
!-eMfqFhTCM*_MQQQ    Variable introduction
            _MQ      Reverse all of the pairs
           *   Q     Cartesian product with all of the pairs
         CM          Transpose. We now have [[A2, B1], [A1, B2]] for each pair
                     [A1, A2], [B1, B2] in the input.
    f                Filter on
       hT            The first element (the middle two values)
     qF              Being equal
  eM                 Take the end of all remaining elements (other two values)
 -              Q    Remove the pairs that are in the input
!                    Negate. True if no transitive pairs were not in the input

2

Mathematica, 49 ไบต์

#/.{x=___,{a_,b_},x,{b_,c_},x}/;#~FreeQ~{a,c}:>0&

ฟังก์ชั่นเพียวซึ่งใช้เวลารายการคู่ ถ้ารายการการป้อนข้อมูลที่มี{a,b}และ{b,c}แต่ไม่{a,c}สำหรับบางa, b, c, 0แทนที่มันด้วย Truthy คือรายการป้อน falsy 0คือ


1

C ++ 14, 140 ไบต์

เป็นแลมบ์ดาที่ไม่มีชื่อที่ส่งคืนผ่านพารามิเตอร์อ้างอิง pair<int,int>ต้องใช้ปัจจัยการผลิตที่จะเป็นภาชนะของ ใช้แนวทาง O (n ^ 3) ที่น่าเบื่อ

[](auto m,int&r){r=1;for(auto a:m)for(auto b:m)if (a.second==b.first){int i=0;for(auto c:m)i+=a.first==c.first&&b.second==c.second;r*=i>0;}}

Ungolfed และการใช้งาน:

#include<vector>
#include<iostream>

auto f=
[](auto m,int&r){
  r=1;                         //set return flag to true
  for(auto a:m)                //for each element
    for(auto b:m)              //check with second element
      if (a.second==b.first){  //do they chain?
        int i=0;               //flag for local transitivity
        for(auto c:m)          //search for a third element
          i+=a.first==c.first&&b.second==c.second;
        r*=i>0;                //multiply with flag>0, resulting in 0 forever if one was not found
      }
}
;

int main(){
 std::vector<std::pair<int,int>> m={
  {1, 2}, {2, 4}, {6, 5}, {1, 4}
 };

 int r;
 f(m,r);
 std::cout << r << std::endl;

 m.emplace_back(3,6);
 f(m,r);
 std::cout << r << std::endl;

 m.emplace_back(3,5);
 f(m,r);
 std::cout << r << std::endl;

}

1

Python 2 , 91 67 55 ไบต์

lambda s:all(b-c or(a,d)in s for a,b in s for c,d in s)

ลองออนไลน์!

-24 bytes จากแม่ชี Leaky -24 bytes ขอบคุณ
Bubbler


67 ไบต์ (และการแก้ไขรหัสของคุณโดยการเปลี่ยนlambda xไปlambda s.
รั่วนูน

@LeakyNun โอ้โหนั่นมันงี่เง่าของฉัน ขอบคุณ!
HyperNeutrino

55 ไบต์โดยการเปิดออกที่fors
Bubbler

@Bubbler โอ้ยอดเยี่ยมขอบคุณ
HyperNeutrino

0

ความจริง 103 ไบต์

c(x)==(for i in x repeat for j in x repeat if i.2=j.1 and ~member?([i.1, j.2],x)then return false;true)

ungolfed:

c(x)==
  for i in x repeat
    for j in x repeat
       if i.2=j.1 and ~member?([i.1, j.2],x) then return false
  true

                                                                   Type: Void

การออกกำลังกาย

(2) -> c([[1,2],[2,4],[6,5],[1,4]])
   Compiling function c with type List List PositiveInteger -> Boolean
   (2)  true
                                                                Type: Boolean
(3) -> c([[7,8],[9,10],[15,-5]])
   Compiling function c with type List List Integer -> Boolean
   (3)  true
                                                            Type: Boolean
(4) -> c([[5,9],[9,54],[0,0]])
   Compiling function c with type List List NonNegativeInteger ->
      Boolean
   (4)  false


0

Clojure, 56 53 ไบต์

ปรับปรุง: แทนการใช้:whenฉันเพิ่งจะตรวจสอบว่าสำหรับทุกคู่ของ[a b] [c d]ทั้งสองb != cหรือ[a d]พบจากการตั้งค่าการป้อนข้อมูล

#(every? not(for[[a b]%[c d]%](=[b nil][c(%[a d])])))

เดิม:

ว้าว Clojure สำหรับลูปนั้นเท่: D นี่เป็นการตรวจสอบว่าforลูปไม่ได้สร้างค่าที่ผิดพลาดซึ่งจะเกิดขึ้นหาก[a d]ไม่พบจากชุดอินพุต

#(not(some not(for[[a b]%[c d]% :when(= b c)](%[a d]))))

อินพุตนี้ต้องเป็นชุดของเวกเตอร์สององค์ประกอบ:

(f (set [[1, 2], [2, 4], [6, 5], [1, 4]]))
(f (set [[7, 8], [9, 10], [15, -5]]))
(f (set [[5, 9], [9, 54], [0, 0]]))

หากการป้อนข้อมูลต้องเป็นรายการที่เหมือนกัน(%[a d])จะต้องถูกแทนที่ด้วย((set %)[a d])ค่าเพิ่มเติม 6 ไบต์


0

ทั้งการแก้ปัญหาเหล่านี้มีฟังก์ชั่นการใช้ชื่อรายการของคู่ได้รับคำสั่งเป็น input และกลับมาหรือTrueFalse

Mathematica, 65 ไบต์

SubsetQ[#,If[#2==#3,{#,#4},Nothing]&@@@Join@@@#~Permutations~{2}]&

#~Permutations~{2}]สร้างรายการของคู่ที่สั่งซื้อทั้งหมดของคู่ที่สั่งซื้อจากอินพุตและJoin@@@แปลงพวกเขาเป็นสี่เท่าสั่งซื้อ สิ่งเหล่านั้นจะถูกดำเนินการโดยฟังก์ชั่นIf[#2==#3,{#,#4},Nothing]&@@@ซึ่งมีคุณสมบัติเจ๋ง ๆ : ถ้าองค์ประกอบสองตัวตรงกลางเท่ากันมันจะส่งคืนคู่ที่สั่งซื้อซึ่งประกอบด้วยหมายเลขแรกและหมายเลขสุดท้าย; มิฉะนั้นจะส่งคืนNothingโทเค็น Mathematica พิเศษที่จะหายไปจากรายการโดยอัตโนมัติ ดังนั้นผลลัพธ์คือชุดของคู่ที่ได้รับคำสั่งซึ่งจำเป็นต้องอยู่ในอินพุตเพื่อให้สกรรมกริยาSubsetQ[#,...]ตรวจจับคุณสมบัตินั้น

Mathematica, 70 ไบต์

And@@And@@@Table[Last@i!=#&@@j||#~MemberQ~{#&@@i,Last@j},{i,#},{j,#}]&

Table[...,{i,#},{j,#}]สร้างอาร์เรย์ 2 มิติที่จัดทำดัชนีโดยiและjซึ่งนำมาโดยตรงจากอินพุต (ดังนั้นทั้งคู่สั่งซื้อ) ฟังก์ชั่นของทั้งสองดัชนีคือLast@i!=#&@@j||#~MemberQ~{#&@@i,Last@j}ซึ่งแปลว่า "องค์ประกอบที่สองของiและองค์ประกอบแรกของjไม่ตรงกันหรือมิฉะนั้นการป้อนข้อมูลที่มีคู่สั่งซื้อประกอบด้วยองค์ประกอบแรกของiและองค์ประกอบสุดท้ายของj" สิ่งนี้สร้างอาร์เรย์ของบูลีน 2D ซึ่งAnd@@And@@@แผ่เป็นบูลีนเดี่ยว


0

APL (NARS), 39 ตัวอักษร, 78 ไบต์

{∼∨/{(=/⍵[2 3])∧∼(⊂⍵[1 4])∊w}¨,⍵∘.,w←⍵}

ทดสอบ:

  f←{∼∨/{(=/⍵[2 3])∧∼(⊂⍵[1 4])∊w}¨,⍵∘.,w←⍵}
  f (1 2) (2 4) (6 5) (1 4)
1
  f (7 8) (9 10) (15 ¯5)
1
  f (5 9) (9 54) (0 0)
0

หนึ่งวินาที 'โซลูชัน' ทำตามวิธีข้ามไปนี้:

r←q w;i;j;t;v
r←1⋄i←0⋄k←↑⍴w⋄→3
r←0⋄→0
→0×⍳k<i+←1⋄t←i⊃w⋄j←0
→3×⍳k<j+←1⋄v←j⊃w⋄→4×⍳t[2]≠v[1]⋄→2×⍳∼(⊂t[1]v[2])∊w

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.