খারাপ খবর, কেউ


10

ফুতুরামা পর্বে দ্য প্রিজনার অফ বেনদা সদস্যরা ক্রুদের সদস্যরা একে অপরের সাথে দেহ বদল করে, যে কোনও শরীরের দেহ একাধিকবার অদলবদল করতে পারে না এই ধরা পড়ে ।

চ্যালেঞ্জ

এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা ইতিমধ্যে ঘটেছে এমন মানসিক-দেহের অদলবদলের বৈধ সংগ্রহকে গ্রহণ করে এবং এমন এক স্বরূপের আইনী সেট আউটপুট দেয় যা প্রতিটি মনকে তার মূল শরীরে ফিরিয়ে দেবে। এই মন-দেহ সংগ্রহের জন্য শনাক্তকারীদের অবশ্যই স্ট্রিং থাকতে হবে যাতে নতুন লাইন থাকবে না। আপনি দু'জন (স্বতন্ত্র নামযুক্ত) জনকে যুক্ত করতে পারেন যাদের ইনপুট গোষ্ঠীতে পূর্বের অদলবদল নেই। (প্রমাণ যে আপনার কেবলমাত্র অতিরিক্ত 2 টি অতিরিক্ত দেহ প্রয়োজন) তবে সমস্যাটি সমাধানের জন্য আপনাকে ন্যূনতম সংখ্যক লোক যুক্ত করতে হবে।

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

উদাহরণ

[('A','B'),('C','D')] -> [('A','C'),('B','D'),('A','D'),('B','C')]

['A','B'] -> ['C','D','A','C','B','D','A','D','B','C']

[('A','B'),('C','D'),('A','C'),('A','D')] -> [('B', 'E'), ('A', 'E'), ('C', 'B'), ('C', 'E')]

"A\nB\nC\nD\n" -> "A\nC\nB\nD\nA\nD\nB\nC\n"

শো থেকে একটি:

[("Amy","Hubert"),("Bender","Amy"),("Hubert","Turanga"),("Amy","Wash Bucket"),("Wash Bucket","Nikolai"),("Phillip","John"),("Hermes","Turanga")]

নীচে দেওয়া শোটির সমাধানটি অবৈধ:

[("Clyde","Phillip"),("Ethan","John"),("Clyde","John"),("Ethan",Phillip"),("Clyde","Hubert"),("Ethan","Wash Bucket"),("Clyde","Leela"),("Ethan","Nikolai"),("Clyde","Hermes"),("Ethan","Bender"),("Clyde","Amy"),("Ethan","Hubert"),("Clyde","Wash Bucket")]

এটি অবৈধ কারণ এথন এবং ক্লাইড অপ্রয়োজনীয় কারণেই ফ্রাই ফিলিপ, জোয়েডবার্গ জন এবং হার্মিস হার্মিস মেশিনটি কতটা ব্যবহার করেছিলেন। এই মামলার বৈধ সমাধান নীচে সরবরাহ করা হয়েছে:

[("Philip","Hubert"),("John","Wash Bucket"),("Philip","Turanga"),("John","Nikolai"),("Philip","Hermes"),("John","Bender"),("Philip","Amy"),("John","Hubert"),("Philip","Wash Bucket")]

নোট করুন যে কোনও বৈধ ইনপুট জন্য পরিষ্কারভাবে অনেকগুলি উত্তর আছে। যে কোনও বৈধ।


এমন কিছু নাম আছে যা আমরা ধরে নিতে পারি যে ব্যবহৃত হবে না?
315

@ ফেয়ারসাম নাপ, চ্যালেঞ্জের অংশ;)
ফ্রাইআম দ্য এজিগম্যান

1
@ ফেয়ারসাম মানে আপনি যদি পুরো ইনপুটটিকে স্ট্রিং হিসাবে নেন? তবে হ্যাঁ, তবে আপনি ধরে নিতে পারেন নামেরগুলির মধ্যে তাদের মধ্যে নতুন লাইন থাকবে না। (এখনই এটি সম্পাদনা করা)
FryAmTheEggman

1
শোয়ের ইনপুটটির জন্য আপনার সমাধান কাজ করে না। অ্যামি এবং বেন্ডার শেষে অদলবদল হয়। একটি সঠিক সমাধান হবে[('Nikolai', 'Phillip'), ('Nikolai', 'Hubert'), ('Nikolai', 'Turanga'), ('Nikolai', 'Bender'), ('Phillip', 'Amy'), ('John', 'Wash Bucket'), ('Nikolai', 'John'), ('Phillip', 'Wash Bucket'), ('Hubert', 'John'), ('Bender', 'Hermes')]
জাকুবে

1
@ জাকুব দুঃখিত, শোয়ের পরিস্থিতিটি প্রবেশ করার সময় দেখে মনে হচ্ছে যে আমি একটি টাইপো তৈরি করেছি। আমি বিশ্বাস করি এটি এখনই স্থির হয়েছে, এবং সমাধানটি ঠিক আছে।
FryAmTheEggman

উত্তর:


3

পাইথন 3: 328 অক্ষর (ধীর), 470 অক্ষর (দ্রুত)

গুরুতর উত্তরের জন্য সম্ভবত কিছুটা দীর্ঘ।

ধীর এবং সংক্ষিপ্ত কোড:

from itertools import*
def d(u,s):i,j=map(u.index,s);u[i],u[j]=u[j],u[i]
def f(Q):
 n=set()
 for s in Q:n|=set(s)
 n=list(n)
 while 1:
  for t in permutations(i for i in combinations(n,2)if not set((i,i[::-1]))&set(Q)):
   u=n[:];j=0
   for s in Q:d(u,s)
   for s in t:
    j+=1;d(u,s)
    if n==u:return t[:j]
  n+=[''.join(n)]

d(u,s)একটি অদলবদল প্রয়োগ sকরে u। মূল পদ্ধতিতে f(Q), আমি প্রথমে nসেট অপারেশন ব্যবহার করে এবং ফলটিকে একটি তালিকায় রূপান্তরিত করে সমস্ত ব্যক্তির তালিকা তৈরি করি । while 1-Loop অবশ্যই না একটি অনন্ত লুপ হয়। এটিতে আমি আমার মধ্যে থাকা ব্যক্তিদের ব্যবহার করে সমস্যাটি সমাধান করার চেষ্টা করি n। যদি এটি সফল না হয় তবে আমি সমস্ত নাম একত্রিত করে অন্য একজনকে যুক্ত করব n+=[''.join(n)]। অতএব while 1-লুপটি সর্বোচ্চ 3 বার কার্যকর করা হয় (প্রশ্নের প্রমাণ দেখুন)।

সমস্যার সমাধান ব্রুটফোর্স করা হয়। আমি আইনী যে সমস্ত স্ব্যাপগুলি তৈরি করি এবং সমস্ত আদেশের চেষ্টা করি for t in permutations(i for i in combinations(n,2)if not set((i,i[::-1]))&set(Q))। যদি প্রতিটি ব্যক্তি এর নিজস্ব শরীরে থাকে তবে আমি অদলবদলের ক্রমটি ফিরিয়ে দিই।

ব্যবহার:

print(f([('A','B'),('C','D')]))
print(f([('A','B')]))
print(f([('A','B'),('C','D'),('A','C'),('A','D')]))

ফিউটোরামার উদাহরণটি অনেক দীর্ঘ সময় নেয়। এখানে 9 জন ব্যক্তি রয়েছেন, সুতরাং 36 টি সম্ভাব্য অদলবদল রয়েছে এবং তাদের মধ্যে 28 টি বৈধ। সুতরাং 26 আছে! আইনী আদেশ।

দ্রুততম কোড

def w(u,s):i,j=map(u.index,s);u[i],u[j]=u[j],u[i]
def f(Q):
 n=set()
 for s in Q:n|=set(s)
 while 1:
  n=list(n);u=n[:];l=len(n)
  for s in Q:w(u,s)
  for d in range((l*l-l)//2-len(Q)+1):r(n,u,Q,[],d)
  n+=[''.join(n)]
def r(n,u,Q,t,d):
 m=0;v=u[:];l=len(u)
 for i in range(l):
  if n[i]!=v[i]:m+=1;w(v,(n[i],v[i]))
 if m<1:print(t);exit()
 for i in range(l*l):
  s=n[i//l],n[i%l]
  if m<=d and i//l<i%l and not set([s,s[::-1]])&set(Q+t):v=u[:];w(v,s);r(n,v,Q,t+[s],d-1)

ফাংশনটির f(Q)পুনরাবৃত্তিমূলক গভীরতর পদ্ধতির রয়েছে। এটি প্রথমে গভীরতা = 0, তারপরে গভীরতা = 1, গভীরতা = (l * ll) // 2-লেন (কিউ) অবধি চেষ্টা করে যা আইনী পদক্ষেপের সর্বাধিক সংখ্যা। ধীর কোডের মতো এটি এর পরে অন্য একজনকে যুক্ত করে আবার চেষ্টা করে।

পুনরাবৃত্তি ফাংশন অদলবদল দিয়ে r(n,u,Q,t,d)বর্তমান অবস্থানটি সমাধান করার চেষ্টা করে । সমাধান করা অবস্থান, ইনপুট সরানো এবং ইতিমধ্যে সম্পন্ন পদক্ষেপগুলি হয়। এটি প্রথমে প্রয়োজনীয় অদলবদলগুলির নিচে আবদ্ধ গণনা করে (আইনী এবং অবৈধ সোয়াপগুলি দিয়ে রাষ্ট্র সমাধান করে)। যদি == 0, সমস্ত ব্যক্তি সঠিক শরীরে থাকে, সুতরাং এটি সমাধানটি মুদ্রণ করে । অন্যথায় সব সম্ভব অদলবদল চেষ্টা করে যদি, (ছাঁটাই), (যা ইতিমধ্যে মধ্যে অন্তর্ভুক্ত করা হয় , (অনুমতি দেয় না মত অদলবদল বা এবং ) এবং ( এখনো সঞ্চালিত হয় নি)।udnQtmmtsm<dd>1m<di//l<i%l('A','A')('A','B')('B','A')not set([s,s[::-1]])&set(Q+t)s

ব্যবহার:

f([("Amy","Hubert"),("Bender","Amy"),("Hubert","Turanga"),("Amy","Wash Bucket"),("Wash Bucket","Nikolai"),("Philip","John"),("Hermes","Turanga")])

এটি পাইপি ব্যবহার করে আমার ল্যাপটপে প্রায় 17 সেকেন্ডে পাইপি এবং পাইপাই ছাড়াই প্রায় 2 মিনিটের মধ্যে ফিউচারামার সমস্যাটির জন্য অনুকূল অদলবদলগুলি খুঁজে পায়। লক্ষ্য করুন যে উভয় অ্যালগরিদম একই প্যারামিটার দিয়ে কল করার সময় বিভিন্ন সমাধান দেয়। এটি একটি অজগর- এর হ্যাশিং অ্যালগরিদমের কারণে setnপ্রতিটি সময় পৃথক ক্রমে ব্যক্তি সঞ্চয়। সুতরাং অ্যালগরিদম প্রতিটি রান দ্রুত বা ধীর হতে পারে।

সম্পাদনা করুন: আসল ফিউটুরমা পরীক্ষার কেসটি ভুল ছিল, সংশোধিত পরীক্ষার ক্ষেত্রে 10 এর পরিবর্তে 9 এর অনুকূল সমাধান রয়েছে এবং তাই এটি দ্রুত। পাইপি সহ 2 সেকেন্ড, 7 সেকেন্ড ছাড়াই।

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