অনেক গুপ্তচর!


38

আপনি শত্রু গুপ্তচরদের একটি বিস্তৃত নেটওয়ার্কের সাথে লড়াই করছেন । আপনি জানেন যে প্রতিটি গুপ্তচর কমপক্ষে একটি (কখনও কখনও একাধিক) নকল পরিচয় ব্যবহার করতে পছন্দ করে। আপনি প্রকৃতপক্ষে জানতে চান যে আপনি আসলে কয়টি গুপ্তচরকে নিয়ে কাজ করছেন।

ভাগ্যক্রমে, আপনার পাল্টা গোয়েন্দা এজেন্টরা তাদের কাজটি করছে এবং কখনও কখনও এটি করতে পারে দু'টি ভুয়া পরিচয় আসলে একই শত্রু গুপ্তচর দ্বারা নিয়ন্ত্রণ করা হলে বুঝতে পারে।

ঐটাই বলতে হবে:

  • তবে আপনার এজেন্টরা কখনই জানে না যে দুটি নকল শনাক্তকারীদের পেছনে একই গুপ্তচর থাকে
  • যদি কোনও এজেন্ট আপনাকে বলে যে দুটি নকল পরিচয় একই গুপ্তচর দ্বারা নিয়ন্ত্রিত হয় তবে আপনি বিশ্বাস করেন যে তারা ঠিক।

এজেন্ট বার্তা

এজেন্টরা আপনাকে ক্রিপ্টিক বার্তাগুলি প্রেরণ করে যা জানিয়ে দেয় যে কোন পরিচয়ের পিছনে একই গুপ্তচর রয়েছে। একটি উদাহরণ:

আপনার 2 টি এজেন্ট এবং 5 টি ভুয়া পরিচয় রয়েছেডিল করার জন্য রয়েছে।

প্রথম এজেন্ট আপনাকে বার্তা পাঠায়:

Red Red Blue Orange Orange

এর অর্থ তারা ভাবেন যে সেখানে 3 জন গুপ্তচর রয়েছে:

  • প্রথমটি (লাল) পরিচয় নিয়ন্ত্রণ করে 1 এবং 2
  • দ্বিতীয়টি (নীল) পরিচয় 3 নিয়ন্ত্রণ করে
  • তৃতীয়টি (কমলা) 4 এবং 5 টি পরিচয় নিয়ন্ত্রণ করে

দ্বিতীয় এজেন্ট আপনাকে বার্তা পাঠায়:

cat dog dog bird fly

এর অর্থ তারা ভাবেন যে সেখানে 4 জন গুপ্তচর রয়েছে:

  • প্রথমটি (বিড়াল) পরিচয় নিয়ন্ত্রণ করে 1
  • দ্বিতীয়টি (কুকুর) 2 এবং 3 পরিচয় নিয়ন্ত্রণ করে
  • তৃতীয়টি (পাখি) পরিচয় 4 নিয়ন্ত্রণ করে
  • চতুর্থটি (উড়ে) পরিচয় 5 নিয়ন্ত্রণ করে

আমরা দেখতে ইন্টেল সংকলন:

Identities:   id1    id2    id3    id4    id5 
Agent 1:    |--same-spy--|       |--same-spy--|
Agent 2:           |--same-spy--|
Conclusion: |-----same-spy------||--same-spy--|

এর অর্থ সেখানে সর্বাধিক 2 গুপ্তচর রয়েছে

নোট

একই গুপ্তচরের মালিকানাধীন পরিচয়গুলি একটানা হতে হবে না, যেমন একটি বার্তা:

dog cat dog

বৈধ.

এছাড়াও একই শব্দটি দুটি পৃথক এজেন্ট ব্যবহার করতে পারে - এর অর্থ কোনও কিছু নয়, এটি কেবল একটি কাকতালীয় উদাহরণ, যেমন:

Agent 1: Steam Water Ice
Agent 2: Ice Ice Baby

বরফ উভয় এজেন্ট দ্বারা ব্যবহৃত হয় - Iceপ্রথম এজেন্ট দ্বারা ব্যবহৃত দুটি ঘটনার সাথে সম্পর্কিত নয়Ice দ্বারা ব্যবহৃত দ্বিতীয় এজেন্ট দ্বারা ব্যবহৃত ।

চ্যালেঞ্জ

আপনার সমস্ত এজেন্টের ইন্টেল সংকলন করুন এবং প্রকৃতপক্ষে কত শত্রু গুপ্তচর রয়েছে তা নির্ধারণ করুন। (আরও সুনির্দিষ্টভাবে বলতে গেলে, আপনার কাছে সীমিত তথ্যের ভিত্তিতে নিম্নতম উপরের আবদ্ধ হন))

বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়ী।

ইনপুট এবং আউটপুট স্পেক

ইনপুটটি এন লাইনগুলির একটি তালিকা যা এজেন্টদের n বার্তাগুলি উপস্থাপন করে। প্রতিটি লাইনে কে স্পেস-বিচ্ছিন্ন টোকেন, সমস্ত লাইনের জন্য একই কে থাকে। টোকেনগুলি বর্ণমালা, স্বেচ্ছাসেবী দৈর্ঘ্যের হয়। মামলার বিষয়।

আউটপুটটি আপনার এজেন্টদের ইন্টেলের ভিত্তিতে স্বতন্ত্র স্পাইগুলির সংখ্যা উপস্থাপন করে একক সংখ্যা হওয়া উচিত।

উদাহরণ

উদাহরণ 1

ইনপুট:

Angel Devil Angel Joker Thief Thief
Ra Ra Ras Pu Ti N
say sea c c see cee

আউটপুট:

2

উদাহরণ 2

ইনপুট:

Blossom Bubbles Buttercup
Ed Edd Eddy

আউটপুট:

3

উদাহরণ 3

ইনপুট:

Botswana Botswana Botswana
Left Middle Right

আউটপুট:

1

উদাহরণ 4

ইনপুট:

Black White
White Black

আউটপুট:

2

উদাহরণ 5

ইনপুট:

Foo Bar Foo
Foo Bar Bar

আউটপুট:

1

উদাহরণ 6

ইনপুট:

A B C D
A A C D
A B C C
A B B D

আউটপুট:

1

উদাহরণ 7

ইনপুট:

A B A C

আউটপুট:

3

উদাহরণ 8

ইনপুট:

A
B
C

আউটপুট:

1

উদাহরণ 9

ইনপুট:

X

আউটপুট:

1

আমরা কি প্রতিটি লাইনকে শব্দের অ্যারে হিসাবে নিতে পারি?
Arnauld

8
@ হেনরিহেনারিনসন কেবলমাত্র ইনপুটটিকে কঠোর করে তোলে তা হল ইনপুট ফর্ম্যাটটি পরিবর্তন করতে কোডের শুরুতে একটি সংক্ষিপ্ত ব্লার্ব যোগ করা। এটি চ্যালেঞ্জটিতে সত্যই কিছু যুক্ত করে না
ফেব্রুস্টিক

6
আমার কাছে এ জাতীয় শব্দগুলি
গল্ফকে

17
কঠোর I / O ফর্ম্যাটগুলি সত্যই নিরুৎসাহিত করা হয়েছে যেহেতু তারা চ্যালেঞ্জের মূল থেকে বিরত রয়েছে। উদাহরণস্বরূপ, ইনপুটটি স্পেস-বিভক্ত শব্দের রেখার আকারে প্রয়োগ করা প্রয়োজনীয় নয়, যেহেতু প্রত্যেকটি লাইনকে শব্দের তালিকা হিসাবে উপস্থাপন করতে পারে (আর্নল্ড যা বলেছিল), এবং এই নিয়মটি চ্যালেঞ্জকে যুক্ত করার একমাত্র জিনিস লাইনগুলি বিভক্ত করার প্রয়োজনীয়তা, এমন কিছু যা অগত্যা চ্যালেঞ্জের একটি অংশ নয়।
এরিক আউটগল্ফার

2
এই শিরোনামটি আপনার গড় টিম ফোর্ট্রেস 2 গেমের মতো শোনাচ্ছে!
টিভি

উত্তর:


10

স্লেজহ্যামার 0.5.5 , 16 15 বাইট 15

⡡⠥⡀⡾⠥⢢⠍⣽⡷⣩⣅⡷⣡⢒⠅

এই ওল্ফ্রাম ল্যাঙ্গুয়েজ ফাংশনে ডিকম্প্রেস করে (চূড়ান্তটি অন্তর্ভুক্ত &):

Length[ConnectedComponents[RelationGraph[Inner[Equal, ##1, Or] &,
    Transpose[StringSplit @ #1]]]] &

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

Transpose[StringSplit @ #1]: ইনপুট তালিকায় প্রতিটি স্ট্রিং বিভক্ত করুন এবং কলামগুলি নিন (গুপ্তচর পরিচয়)

RelationGraph[Inner[Equal, ##1, Or] &, ...]: গ্রাফটি তৈরি করুন যেখানে কমপক্ষে একটি অবস্থান সমান হলে দুটি প্রান্তকে একটি কিনারা ভাগ করে নিন (যদি তারা কিছু বন্ধুত্বপূর্ণ এজেন্ট দ্বারা একই গুপ্তচর হিসাবে শ্রেণিবদ্ধ করা হয়)

Length[ConnectedComponents[...]]: সংযুক্ত উপাদান সংখ্যা গুপ্তচর সম্ভাব্য সংখ্যার উপরের আবদ্ধ হয়।


9

জাভাস্ক্রিপ্ট (নোড.জেএস) ,  155 150 142  141 বাইট

a=>new Set((a=a.map(s=>s.split` `))[0].map((_,x)=>a.flat(m=1<<x).map(o=_=>a.map((b,y)=>b.map((w,i)=>m>>i&1|o[w+=y]?o[w]=m|=1<<i:0)))|m)).size

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

কিভাবে?

xmx

+---------+-------+-------+-------+-------+-------+-------+
| x       |   0   |   1   |   2   |   3   |   4   |   5   |
+---------+-------+-------+-------+-------+-------+-------+
| 2**x    |   1   |   2   |   4   |   8   |  16   |  32   |
+---------+-------+-------+-------+-------+-------+-------+
| words   | Angel | Devil | Angel | Joker | Thief | Thief |
|         | Ra    | Ra    | Ras   | Pu    | Ti    | N     |
|         | say   | sea   | c     | c     | see   | cee   |
+---------+-------+-------+-------+-------+-------+-------+
| bitmask |  15   |  15   |  15   |  15   |  48   |  48   |
+---------+-------+-------+-------+-------+-------+-------+

মন্তব্য

a =>                      // a[] = input
new Set(                  // we eventually convert the generated array into a set
  (a = a.map(s =>         // we first need to convert each line into
    s.split` `            // an array of words (*sigh*)
  ))                      //
  [0].map((_, x) =>       // for each word at position x in the first line:
    a.flat(m = 1 << x)    //   initialize a bitmask m with the x-th bit set and build an
                          //   array containing as many entries (N) as there are words in
                          //   the whole matrix
    .map(o =              //   the object o is used to store words
         _ =>             //   repeat N times to ensure that all relations are found:
      a.map((b, y) =>     //     for each line b[] at position y in a[]:
        b.map((w, i) =>   //       for each word w at position i in b[]:
          m >> i & 1 |    //         if the i-th bit is set in m (the relation already
                          //         exists)
          o[w += y] ?     //         or w + y is set in o (a relation exists in this line):
            o[w] =        //           set o[w + y] (the value doesn't matter as long as
                          //           it's non-zero)
              m |= 1 << i //           set the i-th bit in m
          :               //         else:
            0             //           do nothing
        )                 //       end of map() over the words
      )                   //     end of map() over the lines
    ) | m                 //   end of map() over all flatten entries; yield m
  )                       // end of map() over x
).size                    // return the size of the corresponding set

সুতরাং ... অনুশীলনে, এর কোনও 32 বা 64 পরিচয় সীমা থাকবে?
ভিলেক্স-

@ ভিলাক্স- আমি মনে করি তিনি বিগইন্টে স্যুইচ করতে পারেন, যদিও এর জন্য অবশ্যই বাইট খরচ পড়বে।
নীল


6

পাইথন 3 , 132 162 154 139 135 বাইট

def f(a):r=[*zip(*[map(b.index,b)for b in map(str.split,a)])];return sum(i==min(min(u)for u in r if min(w)in u)for i,w in enumerate(r))

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

এটি ক্লাস্টার সনাক্তকারী কোনও গ্রাফ অ্যালগরিদমের খুব কমপ্যাক্ট বাস্তবায়ন।

  1. প্রতিটি এজেন্টের জন্য, আমরা প্রোফাইলের এবং তাদের ওরফে একটি মানচিত্র, যা চেহারা সর্বনিম্ন সূচক তৈরি করুন: [map(b.index,b)for b in map(str.split,a)]। আই [0,1,2,1,2]তিনটি গুপ্তচরকে সনাক্ত করে, যেখানে প্রথম প্রোফাইলটি একের, দ্বিতীয় এবং চতুর্থ অন্যজনের এবং তৃতীয় এবং পঞ্চমটি শেষেরটির। গ্রুপ সূচকটিও গ্রুপের প্রথম প্রোফাইলের সূচক।

  2. এই ম্যাট্রিক্স ( [*zip(*m...)]) স্থানান্তরিত করে আমরা প্রতিটি প্রোফাইলের জন্য একটি গ্রুপ সদস্যতা পাই। এটি একটি নির্দেশিত, অ্যাসাইক্লিক গ্রাফ গঠন করে, কারণ গ্রুপ সূচকগুলি প্রোফাইল সূচকগুলির একটি উপসেট, এবং সমস্ত প্রান্ত নিম্ন বা সমান সূচকগুলির দিকে যায় towards একই গুপ্তচর সম্পর্কিত প্রোফাইলগুলি এখন একটি ক্লাস্টার তৈরি করে যা অন্য প্রোফাইলগুলির সাথে কোনও সংযোগ নেই। আমাদের কাছে এখনও সদৃশ পথ রয়েছে, কারণ প্রোফাইল সূচকগুলি একাধিক গোষ্ঠী সূচকগুলির সাথে লিঙ্কযুক্ত।

  3. নিম্নলিখিত লুপগুলির সাহায্যে আমরা গ্রাফটি সমতল বনের সাথে সংক্ষিপ্ত করে রাখি, যেখানে সমস্ত প্রোফাইলগুলি তাদের গাছের সর্বনিম্ন সূচকের সাথে সরাসরি যুক্ত হয়, যেমন মূল: min(min(u)for u in r if min(w)in u)

  4. অবশেষে, বনে শিকড় সংখ্যা ফিরে অর্থাত নিজেদের লিঙ্ক সূচকের: return sum(i==...)


ইন্ডেন্টেশন প্রয়োজনীয়? অজগর ব্যবহার করার পরে বহু বছর হয়ে গেছে, তবে আমি মনে করি আপনি অনলাইনার তৈরি করতে পারেন।
মার্ক গার্ডনার

আপনি করতে পারেন, তবে আপনি লুপগুলির জন্য নেস্টেড ব্যবহার করেন না তবে। নিজের জন্য টিআইও;)
মুভ্যাটিকা

5

কাঠকয়লা , 49 43 বাইট

≔⪪S θWS«≔⪪ι ιFLιUMθ⎇⁼λ§θκ§θ⌕ι§ικλ»ILΦθ⁼κ⌕θι

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। একটি জটিল ইনপুট ফর্ম্যাট ব্যবহার করে সম্ভবত কয়েকটা বাইট সংরক্ষণ করতে পারে। ব্যাখ্যা:

≔⪪S θ

প্রথম এজেন্টের তালিকাটি ইনপুট করুন।

WS«

বাকি এজেন্টদের জন্য পুনরাবৃত্তি করুন।

≔⪪ι ι

তাদের তালিকা ইনপুট করুন।

FLι

প্রতিটি উপাদান সূচক উপর লুপ।

UMθ⎇⁼λ§θκ§θ⌕ι§ικλ»

একই পরিচয় সহ এই এজেন্টের তালিকায় প্রথম উপাদানটি সন্ধান করুন এবং তারা একই পরিচয় তা দেখানোর জন্য প্রথম এজেন্টের তালিকা আপডেট করুন।

ILΦθ⁼κ⌕θι

বাকি অনন্য পরিচয়ের সংখ্যা গণনা করুন।


5

জেলি , 25 15 বাইট

ḲĠ)ẎfƇFQɗⱮQ$ÐLL

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

স্পষ্ট-বিচ্ছিন্ন এজেন্ট দাবির তালিকা নিয়ে এবং স্বতন্ত্র গোয়েন্দাগুলির সংখ্যার সর্বনিম্ন উপরের প্রান্তটি ফিরিয়ে দেওয়া একটি মোনাডিক লিঙ্ক।

ব্যাখ্যা

  )              | For each list:
Ḳ                | - Split at spaces
 Ġ               | - Group indices of equal items
   Ẏ             | Tighten lists, so we have a single list of grouped indices
           $ÐL   | Repeat the following until no change:
        ʋⱮQ      | - Do the following as a dyad, mapping through each element of the uniquified list as the right argument
    fƇ           |   - Keep only those list members with one or more items matching the right argument
      F          |   - Flatten
       Q         |   - Uniquify
              L  | Finally take the length of the resultant list

পূর্ববর্তী সংস্করণগুলির সাথে সমস্যাগুলি চিহ্নিত করার জন্য @ আরনাউল্ড এবং @ জোনাথান অ্যালানকে এবং বাইট সংরক্ষণের জন্য আবার @ জোনাথন অ্যালানকে ধন্যবাদ! যদি ইনপুট স্পিকে তালিকার তালিকাকে অনুমতি দিতে শিথিল করা হয় তবে এটি একটি বাইট সংরক্ষণ করবে।


আমি মনে করি বাছাইটি আসলে অপ্রয়োজনীয় হতে পারে, যেহেতু গ্রুপগুলির সূচকগুলি Ġবাছাই করা হয় এবং সমতল, ডি-সদৃশ ফিল্টার ফলাফল, fƇFQসর্বদা, পুনরাবৃত্তি প্রয়োগের পরে, এইগুলি বাছাই করা ক্রমে শেষ করা 'a a b b c', 'a b a b cহবে (যেমন কোনও পরিণতি খুঁজে পাবে না) [3,4,1,2], যদিও এটি পথে উপস্থিত হবে)। সুতরাং ḲĠ)ẎfƇFQɗⱮQ$ÐLL15 জন্য ভাল হতে পারে?
জোনাথন অ্যালান

@ জোনাথান অ্যালান ভালো জায়গা আমার কিছুটা নাটক হয়েছে (এবং এটি কীভাবে কাজ করে তা সম্পর্কে ভাবেন) এবং মনে হয় আপনি ঠিক আছেন।
নিক কেনেডি

4

জাভাস্ক্রিপ্ট (নোড.জেএস) , 120 বাইট

a=>a.map(l=>(s=l.split` `).map((w,i)=>r[o(i)]=o(s.indexOf(w)),o=i=>r[i]-i?o(r[i]):i),r=[])|r.map(g=(v,i)=>t+=v==i,t=0)|t

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

a=>a.map(l=>(                  // for each line
  (s=l.split` `).map((w,i)=>(  // for each words in line
    r[o(i)]=o(s.indexOf(w)),   // join(current index, first occurrence index)
  )),                          //   without updating nodes in path
  o=i=>r[i]-i?o(r[i]):i,       // a function to find root of some node
  r=[]                         // initial disjoint-set
))|
r.map(g=(v,i)=>t+=v==i,t=0)|   // count roots of tree
t                              // output

3

হুশ , 12 বাইট

LωomΣknṁoηkw

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

ব্যাখ্যা

ধারণাটি হ'ল সেই গোয়েন্দাদের সমস্ত গ্রুপের একটি তালিকা তৈরি করা যা একই ব্যক্তি হিসাবে পরিচিত, তারপরে একটি নির্দিষ্ট বিন্দু না পৌঁছা পর্যন্ত ক্রমবর্ধমান ছেদক দলগুলিকে একীভূত করুন। আউটপুটটি অবশিষ্ট গ্রুপগুলির সংখ্যা যা মার্জ করা যায়নি।

LωomΣknṁoηkw  Implicit input: list of strings, say ["a bc a","b g g"]
       ṁ      Map and concatenate:
           w   Split at spaces: "a bc a" becomes ["a","bc","a"]
         ηk    Group indices by equality of elements: [[1,3],[2]]
              Result: [[1,3],[2],[1],[2,3]]
 ω            Iterate until result doesn't change:
     k         Group greedily by
      n        (non-emptiness of) intersection: [[[1,3],[1]],[[2],[2,3]]]
   mΣ          Concatenate each part: [[1,3,1],[2,2,3]]
              Result: [[1,3,1,2,2,3]]
L             Length: 1


3

রুবি , 123 117 বাইট

মুভ্যাটিকার পাইথন 3 সমাধানের জন্য একই ধারণা ব্যবহার করে তবে প্রতিটি "গাছ" এর জন্য সর্বনিম্ন গুপ্তচর সূচকে কিছুটা ভিন্ন উপায়ে গণনা করে (পূর্ববর্তী প্রোফাইলগুলির উপর নজর রেখে, যদি এটি উপস্থিত থাকে তবে ওভারল্যাপ সন্ধান করে এবং সেগুলি একত্রিত করে)

@ জিবি থেকে -6 বাইট।

->a,*b{a.map{|s|e=s.split;e.map{|i|e.index i}}.transpose.map{|e|b<<(b.find{|i|i-e!=i}||[])+e}
b.map(&:min).uniq.size}

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

ব্যাখ্যা

->a,*b{                                             # Start lambda with input a, b=[]
       x=
         a.map{|s|                             }    # For each agent's report
                  e=s.split;                        # Split the words
                            e.map{|i|e.index i}     # Get spy number for each

   .transpose                                       # Transpose to get group membership
             .map{|e|                            }  # For each profile
                        (b.find{|i|i-e!=i}||[])     # Find a profile in b that overlaps
                                                    #  If one is not found, use []
                                               +e   # Add the profile onto the found one
                     b<<                            # Insert this modified profile into b

b.map(&:min)                                        # Get minimum of each modded profile
            .uniq                                   # Deduplicate
                 .size                              # Size of array
}                                                   # Implicit return

পপিং এবং জিপিংয়ের পরিবর্তে আপনি কেবল স্থানান্তর করতে পারেন।
জিবি


শীর্ষস্থানীয়দের জন্য @ জিবি ধন্যবাদ; আমি চিরকালের জন্য অ্যারে স্থানান্তর করতে পপ-জিপ বা শিফট-জিপ ব্যবহার করছি! এছাড়াও, আপনার ব্যবহারের কৌশলটি দুর্দান্ত s.split.map{|i|s.index i}তবে এটি ইনপুটগুলির দৈর্ঘ্যের উপর নির্ভর করে প্রান্তের কেস তৈরি করতে পারে। এই ইনপুটটি 3 না, 2 এ ফিরে আসবে
মান ইঙ্ক

2

পাইথন 2 , 229 221 বাইট

e=enumerate
def f(s):
 v=[];u=sum([(lambda a:[{i for i,x in e(a)if x==k}for k in set(a)])(a.split())for a in s.split('\n')],v)
 while u:
	x=u.pop()
	for i,y in e(u):
	 if x&y:u.pop(i);u+=[x|y];break
	else:v+=[x]
 return v

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

8 ধন্যবা বাইট wilkben


যেহেতু gশুধুমাত্র একবার ব্যবহার করা হয়েছে, আপনি কি এটি ইনলাইনটি সংজ্ঞায়িত করতে পারবেন না? পাইথনে যদি এটি সম্ভব হয় তবে আমি ভুলে যাই তবে আমার মনে হয় এটি আছে।
স্টিফেন


1

পরিষ্কার , 137 বাইট

import StdEnv,Text,Data.List
q=length
$l=q(iter(q l)(map flatten o groupBy isAnyMember)(transpose[[(s,n)\\s<-split" "z]\\z<-l&n<-[1..]]))

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

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


0

পিএইচপি , 271 বাইট

আমি পরিচয়গুলির সাথে "স্পাই নম্বর" সংরক্ষণ করার সাথে পরিচয়গুলির কোনওটি কেবল সংখ্যা হিসাবে কাজ করবে না। আমি মনে করি না যদিও এটি ঠিক করা কঠিন হবে না।

$a=$argv;array_shift($a);if(count($a)==1)array_push($a,...$a);foreach($a as&$b)$b=explode(" ",$b);$c=array_map(null,...$a);foreach($c as&$d)foreach($d as$k=>$e){if(!$d[s])$d[s]=++$s;foreach($c as&$f)if($f[$k]==$e)$f[s]=$d[s];}echo count(array_unique(array_column($c,s)));

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

ব্যাখ্যা

বিভ্রান্ত বাছাই করুন নিজেকে এই লিখতে কিন্তু এটি সমস্ত পরীক্ষার ক্ষেত্রে কাজ করে!

$a=$argv;					//shorten the arguments variable
array_shift($a);				//removes the script name from the arguments variable
if(count($a)==1)array_push($a,...$a);		//the code needs at least 2 messages to run so if only 1 message duplicate it. "..." passes the stuff in the array rather than the array itself?
foreach($a as&$b)$b=explode(" ",$b);		//turns each string message into an array
$c=array_map(null,...$a);			//if you give array_map "null" for the callabck then it zips the arrays, turning a m by n 2D array into a n by m 2D array. this changes it from the messages being grouped to the identities being grouped
foreach($c as&$d)				//loop over the groups of identities
	foreach($d as$k=>$e)			//loop over the names the agents gave the identity and keep track of the key
	{
		if(!$d[s])$d[s]=++$s;		//if this identity doesn't have a "spy number" give it the next one
		foreach($c as&$f)		//loop over the groups of identities again
			if($f[$k]==$e)		//check if the agents gave any other identities this name 
				$f[s]=$d[s];	//if they did then give those the same "spy number"
	}
echo count(array_unique(array_column($c,s)));	//use array_column to get the "spy number" of each identity, remove duplicates using array_unique and then count the size of the array giving the upper limit of spies

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.