এই তালিকা কি সমান?


19

আপনি যেমন খুব ভাল জানেন অজগর তালিকার আছে। আপনি জানেন না যেহেতু এই তালিকাগুলি সেগুলি ধারণ করতে পারে।

a = []
a.append(a)

পাইথন 2

পাইথন ঘ

এগুলি দুর্দান্ত এবং আপনি তাদের সাথে অনেক মজার কাজ করতে পারেন তবে আপনি সেগুলি তুলনা করতে পারবেন না।

a = []
a.append(a)
b = []
b.append(b)
a == b

পাইথন 2

পাইথন ঘ

কার্য

আপনার কাজটি হল পাইথনে একটি ফাংশন (বা যে কোনও ভাষা যা পাইথন অবজেক্টগুলি সরাসরি পরিচালনা করতে পারে) লিখতে পারে যেগুলি দুটি তালিকাগুলি নিতে পারে যা সেগুলি ধারণ করে এবং তাদের তুলনা করতে পারে।

দুটি তালিকাগুলি সমান হয় যদি সেগুলি একই দৈর্ঘ্য হয় এবং সংখ্যার ক্রমিকের অস্তিত্ব থাকে না যে সেই ক্রম অনুসারে তালিকাগুলি উভয়কেই সূচিত করে এমন দুটি বস্তুর ফলাফল করে যা সমান এই সংজ্ঞা অনুসারে সমান হয় না। তালিকায় থাকা সমস্ত নন-লিস্ট অবজেক্টগুলি সরলতার জন্য অজগর পূর্ণসংখ্যা হবে এবং পূর্ণসংখ্যার জন্য পাইথনের বিল্টিন সমতার সাথে তুলনা করা উচিত।

কোনও তালিকা অসীমভাবে গভীর কিনা তা নির্ধারণ করতে আপনার প্রোগ্রামটি অজগরটির পুনরাবৃত্তির গভীরতার উপর নির্ভর করবে না । এটাই:

def isInfinite(a,b):
 try:
  a==b
  return False
 except RunTimeError:
  return True

দুটি তালিকা স্ব-রেফারেন্সিয়াল কিনা তা নির্ধারণের একটি বৈধ উপায় নয়।

Testcases

ধরে নিন আপনি কোনও ফাংশন সংজ্ঞায়িত করেছেন equal

a = []
a.append(a)
b = []
b.append(b)
print(equal(a,b))

True

a = []
b = []
a.append(b)
b.append(a)
print(equal(a,b))

True

a = []
b = []
a.append(1)
a.append(b)
b.append(1)
b.append(a)
print(equal(a,b))

True

a = []
a.append(a)
b = [a]
print(equal(a,b))

True

a = []
b = []
c = []
a.append(b)
b.append(c)
c.append(a)
equal(a,b)

True

a=[1,[2]]
b=[1,[2,[1]]]
a[1].append(a)
b[1][1].append(b[1])

True

a = []
a.append(a)
b = [1]
b.append(a)
c = [1]
c.append([c])
print(equal(b,c))

False

a = []
b = []
a.append(1)
a.append(b)
b.append(a)
b.append(1)
print(equal(a,b))

False

a = []
b = []
a.append(a)
b.append(b)
b.append(b)
print f(a,b)

False

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

@ ওয়েট উইজার্ড এটি ঠিক যথেষ্ট নয় - নেস্টেড তালিকাগুলিও একই দৈর্ঘ্য হওয়া উচিত।
xnor

@ ওয়েট উইজার্ড আপনি আসলে তাদের তুলনা করতে পারেন। পাইথনে, তারা যদি সমান না হয় তবে কেবলমাত্র "পুনরাবৃত্তি সীমাবদ্ধ" পেয়ে যাবেন। tio.run/nexus/…
mbomb007

@ mbomb007 Thats কারণ অজগরটি ডিফল্টরূপে রেফারেন্সগুলির সাথে তুলনা করে। আপনার যদি দুটি অভিন্ন বস্তু থাকে তবে এর বিভিন্ন উল্লেখ রয়েছে এটি ব্যর্থ হয়, তাই চ্যালেঞ্জ।
গম উইজার্ড

2
তালিকাগুলি থাকতে পারে এমন সমস্ত ভাষায় আপনি কি এই চ্যালেঞ্জটি বাড়িয়ে দিতে পারেন?
ক্যালকুলেটরফলাইন

উত্তর:


9

পাইথন 2 , 94 বাইট

g=lambda c,*p:lambda a,b:c in p or all(map(g((id(a),id(b)),c,*p),a,b))if a>[]<b else a==b
g(0)

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

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

পুনরাবৃত্তিমূলক পদক্ষেপটি all(map(...,a,b))বলে যে aএবং bএগুলির মধ্যে সমস্ত সম্পর্কিত জোড় উপাদান সমান হলে সমান। এটি অসম দৈর্ঘ্য প্রত্যাখ্যান করার জন্য দুর্দান্তভাবে কাজ করে কারণ mapসংক্ষিপ্ত তালিকার সাথে সংক্ষিপ্ত তালিকার প্যাডগুলি কেটে যায় Noneunlike zipযেহেতু প্রকৃত তালিকার Noneকোনওটিই অন্তর্ভুক্ত নয় , এই প্যাডযুক্ত তালিকাগুলি সর্বদা প্রত্যাখাত হবে।


উদ্দেশ্য কি ,পরে c?
গম উইজার্ড

এটি একটি tuple করে তোলে।
mbomb007

a=[];a+=[a,1];b=[];b+=[b,2];f(a,b)স্ট্যাকটিকে উপচে a=[1];b=[2];f(a,b);f(a,b)ফেলেছে এবং আবার ব্যবহারযোগ্যতার সমস্যার মতো দেখায়।
অ্যান্ডারস ক্যাসরগ

@ অ্যান্ডারস ক্যাসরগ আমি দেখতে পাচ্ছি, তালিকাটি পরিবর্তন করে সমস্যার জন্য জিজ্ঞাসা করা হচ্ছে। আমি মনে করি এটি এটি ঠিক করে দেয়।
xnor

1
@ অ্যান্ডারস ক্যাসরগ এবং আমি দেখতে পাচ্ছি আপনি মূলত একই ফাংশন-ইন-এ-ফাংশন সমাধান লিখেছেন। সেখানে যে ছাড়া একটি 95-বাইট সমাধান আছে: f=lambda a,b,p=[0]:p[0]in p[1:]or all(map(f,a,b,[[(id(a),id(b))]+p]*len(a)))if a>[]<b else a==b। সম্ভবত এটি পরিচালনা করার একটি দুর্দান্ত উপায় আছে map
xnor

5

পাইথন, 233 218 197 217 বাইট

d=id
def q(a,b,w):
 w[(d(a),d(b))]=0
 if d(a)==d(b):return 1
 if(a>[]and[]<b)-1:return a==b
 if len(a)!=len(b):return 0
 for x,y in zip(a,b):
  if((d(x),d(y))in w or q(x,y,w))-1:return 0
 return 1
lambda a,b:q(a,b,{})

শেষ লাইনে বেনাম ফাংশন পছন্দসই ফাংশন সম্পাদন করে।

এটি এখনও গল্ফ হওয়ার প্রক্রিয়াতে রয়েছে, আমি কেবল এটিই সম্ভব তা দেখাতে চেয়েছিলাম।

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


আপনি কি a>[]পরিবর্তে ব্যবহার করতে পারবেন না i(a,list)?
mbomb007

@ mbomb007 "সবকিছুই তালিকাগুলি বা ইনটস" নিয়ম যুক্ত হওয়ার আগে এটি লেখা হয়েছিল। আপডেট হবে।
isaacg

আপনি ব্যবহার করতে পারেন a>[]<bএবংlen(a)-len(b)
mbomb007

@ ইথ প্রডাকশনস ওহ, তার বাইট গণনা ভুল is সে কারণেই
mbomb007

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