কোনও সম্পর্ক ট্রানজিটিভ কিনা তা নির্ধারণ করুন


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)এমন b= উপস্থিত রয়েছে c

  • [(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

আউটপুট: ট্রানজিটিভ সম্পর্কের জন্য সত্যবাদী মান, অন্যথায় মিথ্যা। আপনি ধরে নিতে পারেন যে ইনপুটটিতে কমপক্ষে একটি জোড়া থাকবে এবং জোড়গুলি অনন্য।


ইনপুটটি কি কোনও তালিকার মতো বিন্যাস হতে পারে, বা এটি সংলগ্ন - ম্যাট্রিক্সের মতো ফর্ম্যাট হতে পারে?
xnor

আপনার কাছে এমন একটি পরীক্ষার কেস থাকা উচিত যা কেবলমাত্র ট্রানজিটিভ কারণ যুগলগুলি অর্ডার করা হয়। যেমন (1,3) (2,1) (3,4) (1,4) (2,4)। যদি জোড়গুলি অর্ডার না করা হয় তবে এটি ট্রানসিটিভ হবে না কারণ (2,3)এটি অনুপস্থিত।
মার্টিন এেন্ডার

1
@ মার্টিনএন্ডার আমি মনে করি আপনি "অর্ডারযুক্ত জোড়" ভুল ব্যাখ্যা করেছেন। আমি মনে করি না এটির জোড়গুলির অর্থ অর্ডারে রয়েছে - আমি মনে করি এটির অর্থ প্রতিটি জোড়ের একটি অর্ডার রয়েছে, প্রথমে দ্বিতীয়।
isaacg

@ আইস্যাকগ এটাই আমি বোঝাতে চাইছিলাম অন্য কথায়, আমার পরীক্ষার কেসটি কেবল সত্যবাদী কারণ সম্পর্ক সুস্পষ্টভাবে প্রতিসম নয় isn't
মার্টিন ইন্ডার

তৃতীয় পরীক্ষার কেস ( [(7, 8), (9, 10), (15, -5)]) ট্রানসিটিভ না হওয়া উচিত ?
wnnmaw

উত্তর:


8

হাস্কেল, 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 Prolog উত্তর দিন, তারপর ;-) পরীক্ষা করে দেখুন
coredump

4

 প্রোলোগ, 66 বাইট

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

সম্পর্ক না যদি আমরা (এ, বি) এবং জানতে পারেন সকর্মক (বি, সি) যেমন যে (এ, সি) না রাখা।


4

এমএটিএল , 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]

সত্যবাদী আউটপুট হল একটি ম্যাট্রিক্স যা দ্বারা গঠিত formed ফালসি একটি ম্যাট্রিক্স যা অন্তত একটি শূন্য থাকে।

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

কোডটি প্রথমে ইনপুট পূর্ণসংখ্যাকে অনন্য, 1-ভিত্তিক পূর্ণসংখ্যার মানগুলিতে হ্রাস করে। এই মানগুলি থেকে এটি সংলগ্ন ম্যাট্রিক্স উত্পন্ন করে; ম্যাট্রিক্স এটিকে নিজেই গুণ করে; এবং ফলাফল ম্যাট্রিক্সে ননজারো মানগুলিকে রূপান্তর করে। শেষ পর্যন্ত, এটি পরীক্ষা করে যে পরবর্তী ম্যাট্রিক্সের কোনও প্রবেশিকা সংলগ্ন ম্যাট্রিক্সের চেয়ে বেশি নয়।


3

জাভাস্ক্রিপ্ট (ES6), 69 67 বাইট

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

@ কোয়েসের একটি ধারণার জন্য 2 বাইট সংরক্ষণ করা হয়েছে। পূর্ববর্তী চারটি 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
সাইওস

@ কয়েস প্রকৃতপক্ষে, আপনি প্রতি বার লিখে 3 টি বাইট সংরক্ষণ করেন [e], তাই eআপনাকে এখনও বাইট সংরক্ষণ করার জন্য 8 বাইট লাগতে পারে। যাইহোক, আমি একটি সংক্ষেপণ তৈরি করে আরও এক ধাপ এগিয়ে গেলাম a.every, যা একটি দ্বিতীয় বাইট সংরক্ষণ করেছিল।
নীল

3

ব্র্যাচল্যাগ , 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

সিজেএম (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

পাইথ, 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

গণিত, 49 বাইট

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

খাঁটি ফাংশন যা জোড়াগুলির একটি তালিকা নেয়। ইনপুট তালিকা থাকে {a,b}এবং {b,c}কিন্তু {a,c}কিছু a, b, cতার সাথে প্রতিস্থাপন 0। সত্য সত্য ইনপুট তালিকা, মিথ্যা হয় 0


1

সি ++ 14, 140 বাইট

হিসাবে নামবিহীন ল্যাম্বদা রেফারেন্স প্যারামিটারের মাধ্যমে ফিরে আসছেন। এর ইনপুটটির ধারক হওয়ার প্রয়োজন pair<int,int>। বিরক্তিকর হে (এন ^ 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;}}

অবরুদ্ধ এবং ব্যবহার:

#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

পাইথন 2 , 91 67 55 বাইট

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

এটি অনলাইন চেষ্টা করুন!

-২৪ বাইট লেইকি নুনকে
-২২ বাইট ধন্যবাদ বুবলারকে ধন্যবাদ


67 বাইট (এবং পরিবর্তন করে আপনার কোড সংশোধন lambda xকরতে lambda s
লিকি নূনের

@ লিক্যনুন ওহ উফফফ, ও আমার পক্ষে বোকা। ধন্যবাদ!
হাইপার নিউট্রিনো

forএস এ আনপ্যাক করে 55 বাইট
বুদ্বুদ

@ বুবলার ওহ দুর্দান্ত ধন্যবাদ
হাইপারনিউট্রিনো

0

এক্সিয়ম 103 বাইট by

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])])))

মূল:

বাহ, লুপগুলির জন্য ক্লোজার ভাল: ডি এটি পরীক্ষা করে যে forলুপটি মিথ্যা মান উত্পন্ন করে না, যা [a d]ইনপুট সেট থেকে পাওয়া না গেলে ঘটে occurs

#(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

এই উভয় সমাধান হ'ল নামহীন ফাংশন যা ইনপুট হিসাবে প্রত্যাবর্তিত জোড়গুলির তালিকা এবং ফেরত Trueবা False

গণিত, 65 বাইট

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

#~Permutations~{2}]ইনপুট থেকে Join@@@অর্ডারযুক্ত জোড়গুলির সমস্ত জোড়ের তালিকা তৈরি করে এবং সেগুলিকে অর্ডার করা চতুর্ভুজগুলিতে রূপান্তর করে। তারপরে এগুলি ফাংশন দ্বারা পরিচালিত হয় If[#2==#3,{#,#4},Nothing]&@@@, যার একটি দুর্দান্ত সম্পত্তি রয়েছে: মাঝারি দুটি উপাদান সমান হলে, এটি প্রথম এবং শেষ সংখ্যার সমন্বিত অর্ডারযুক্ত জোড়কে ফিরিয়ে দেয়; অন্যথায় এটি ফিরে আসে Nothing, একটি বিশেষ গাণিতিক টোকেন যা তালিকা থেকে স্বয়ংক্রিয়ভাবে অদৃশ্য হয়ে যায়। সুতরাং ফলাফল হ'ল অর্ডার করা জোড়াগুলির সেট যা ট্রানজিটিভ হওয়ার জন্য ইনপুটটিতে থাকা দরকার; SubsetQ[#,...]যে সম্পত্তি সনাক্ত।

গণিত, 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

এপিএল (এনএআরএস), 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.