python ইথন লেখার কম্প্যাক্ট উপায়(a+b== c অথবা a+c== b বা b+c== a)




পাইথন কেন শিখব (13)

বুলিয়ান অভিব্যক্তি লিখতে আরো কমপ্যাক্ট বা পাইথনিক উপায় আছে

a + b == c or a + c == b or b + c == a

আমি সঙ্গে এসেছিলেন

a + b + c in (2*a, 2*b, 2*c)

কিন্তু যে একটু অদ্ভুত।


যদি আপনি শুধুমাত্র তিনটি ভেরিয়েবল ব্যবহার করেন তবে আপনার প্রাথমিক পদ্ধতিটি:

a + b == c or a + c == b or b + c == a

ইতিমধ্যে খুব Pythonic হয়।

আপনি যদি আরো ভেরিয়েবলগুলি ব্যবহার করার পরিকল্পনা করেন তবে তার সাথে যুক্তিযুক্ত পদ্ধতি:

a + b + c in (2*a, 2*b, 2*c)

খুব স্মার্ট কিন্তু কেন সম্পর্কে চিন্তা করতে দেয়। কেন এই কাজ করে?
ওয়েল কিছু সহজ গাণিতিক মাধ্যমে আমরা দেখতে যে:

a + b = c
c = c
a + b + c == c + c == 2*c
a + b + c == 2*c

এবং এটিকে একটি, বি, বা সি উভয়ের জন্য সত্য রাখা উচিত, অর্থাত্ এটি 2*a , 2*b , অথবা 2*c সমান হবে। এই ভেরিয়েবল কোন সংখ্যা জন্য সত্য হবে।

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

values = [a,b,c,d,e,...]
any(sum(values) in [2*x for x in values])

এইভাবে, সমীকরণের মধ্যে আরও ভেরিয়েবল যোগ করার জন্য আপনাকে যা করতে হবে তা হল 'n' নতুন ভেরিয়েবল দ্বারা আপনার মান তালিকাটি সম্পাদনা করুন, 'n' সমীকরণ লিখুন না


(a+b-c)*(a+c-b)*(b+c-a) == 0

যদি কোনও দুইটি পদের সমষ্টি তৃতীয় মেয়াদের সমান হয় তবে তারপরেও কোনটি শূন্য হবে, সমগ্র পণ্যটিকে শূন্য করে দেবে।


একটি জন্য তিনটি সমতা সমাধান:

a in (b+c, b-c, c-b)

Python একটি ক্রম যে একটি ক্রম or সমস্ত উপাদান উপর আছে। এখানে আমি আপনার বিবৃতি একটি 3-উপাদান টুপলে রূপান্তর করেছি।

any((a + b == c, a + c == b, b + c == a))

উল্লেখ্য যে or ছোট সার্কিটিং হয়, তাই যদি পৃথক অবস্থার হিসাব করা ব্যয়বহুল তবে এটি আপনার মূল নির্মাণকে আরও ভাল রাখতে পারে।


আমার প্রোগ্রামিংয়ের পুরানো অভ্যাস হিসাবে, আমি মনে করি জটিল উপায়ে কোনও উপায়ে সঠিক অভিব্যক্তি স্থাপন করা এটিকে আরও পাঠযোগ্য করে তুলতে পারে:

a == b+c or b == a+c or c == a+b

প্লাস () :

((a == b+c) or (b == a+c) or (c == a+b))

এবং আমি মনে করি মাল্টি লাইনগুলি ব্যবহার করে আরও বেশি ইন্দ্রিয় তৈরি করতে পারে:

((a == b+c) or 
 (b == a+c) or 
 (c == a+b))

কিভাবে ঠিক সম্পর্কে:

a == b + c or abs(a) == abs(b - c)

ভেরিয়েবলগুলি স্বাক্ষরিত হলে এটি কাজ করবে না।

কোড অপ্টিমাইজেশনের দৃষ্টিকোণ থেকে (অন্তত x86 প্ল্যাটফর্মে) এটি সবচেয়ে কার্যকরী সমাধান বলে মনে হয়।

আধুনিক কম্পাইলারগুলি সিডিকিউ, এক্সওআর এবং এসবিবি নির্দেশাবলীর একটি চতুর ক্রম ব্যবহার করে AB () ফাংশন কলগুলি এবং সাইন টেস্টিং এবং পরবর্তী শর্তাধীন শাখা এনে দেবে । উপরের উচ্চ স্তরের কোডটি শুধুমাত্র নিম্ন-প্রবণতা, উচ্চ-থ্রুপুট ALU নির্দেশাবলী এবং কেবলমাত্র দুটি শর্তাবলী দ্বারা উপস্থাপিত হবে।


অ্যালেক্স ভার্গা দ্বারা প্রদত্ত সমাধানটি "একটি ইন (বি + সি, বিসি, সিবি)" কম্প্যাক্ট এবং গাণিতিকভাবে সুন্দর, তবে আমি আসলেই সেই কোডটি লিখতে চাই না কারণ পরবর্তী ডেভেলপার আসছে কোডটির উদ্দেশ্য অবিলম্বে বুঝতে পারবে না ।

মার্ক Ransom এর সমাধান

any((a + b == c, a + c == b, b + c == a))

আরো পরিষ্কার কিন্তু তুলনায় অনেক বেশি সংক্ষিপ্ত

a + b == c or a + c == b or b + c == a

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


পাইথন 3:

(a+b+c)/2 in (a,b,c)
(a+b+c+d)/2 in (a,b,c,d)
...

এটি কোনও ভেরিয়েবলের স্কেলে

arr = [a,b,c,d,...]
sum(arr)/2 in arr

যাইহোক, সাধারণভাবে আমি সম্মত হচ্ছি যে যদি আপনার কাছে তিনটি ভেরিয়েবল না থাকে তবে মূল সংস্করণটি আরও পঠনযোগ্য।


def any_sum_of_others (*nums):
    num_elements = len(nums)
    for i in range(num_elements):
        discriminating_map = map(lambda j: -1 if j == i else 1, range(num_elements))
        if sum(n * u for n, u in zip(nums, discriminating_map)) == 0:
            return True
    return False

print(any_sum_of_others(0, 0, 0)) # True
print(any_sum_of_others(1, 2, 3)) # True
print(any_sum_of_others(7, 12, 5)) # True
print(any_sum_of_others(4, 2, 2)) # True
print(any_sum_of_others(1, -1, 0)) # True
print(any_sum_of_others(9, 8, -4)) # False
print(any_sum_of_others(4, 3, 2)) # False
print(any_sum_of_others(1, 1, 1, 1, 4)) # True
print(any_sum_of_others(0)) # True
print(any_sum_of_others(1)) # False

অনুরোধ আরো কমপ্যাক্ট বা আরো পাইথনিক জন্য - আমি আরো কম্প্যাক্ট আমার হাত চেষ্টা।

প্রদত্ত

import functools, itertools
f = functools.partial(itertools.permutations, r = 3)
def g(x,y,z):
    return x + y == z

এই 2 অক্ষর মূল চেয়ে কম

any(g(*args) for args in f((a,b,c)))

সঙ্গে পরীক্ষা:

assert any(g(*args) for args in f((a,b,c))) == (a + b == c or a + c == b or b + c == a)

উপরন্তু, প্রদত্ত:

h = functools.partial(itertools.starmap, g)

এই সমতুল্য

any(h(f((a,b,c))))

নিম্নোক্ত কোডটি অন্যের সমষ্টিগতভাবে প্রতিটি উপাদানটির সাথে তুলনা করার জন্য ব্যবহার করা যেতে পারে, যা সেই উপাদানটিকে বাদ দিয়ে সমগ্র তালিকাটির সমষ্টি থেকে গণনা করা হয়।

 l = [a,b,c]
 any(sum(l)-e == e for e in l)

চেষ্টা এবং এটি সহজ না। পরিবর্তে, একটি ফাংশন দিয়ে আপনি যা করছেন তা নাম করুন :

def any_two_sum_to_third(a, b, c):
  return a + b == c or a + c == b or b + c == a

if any_two_sum_to_third(foo, bar, baz):
  ...

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

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


একটি সাধারণ ভাবে,

m = a+b-c;
if (m == 0 || m == 2*a || m == 2*b) do_stuff ();

যদি, একটি ইনপুট পরিবর্তনশীল manipulating আপনার জন্য ঠিক আছে,

c = a+b-c;
if (c==0 || c == 2*a || c == 2*b) do_stuff ();

আপনি বিট হ্যাক ব্যবহার করে শোষণ করতে চান, আপনি "!", ">> 1" এবং "<< 1" ব্যবহার করতে পারেন

আমি বিভেদ এড়াতে দুটি গুণ এড়ানোর জন্য ব্যবহার করতে সক্ষম যদিও বিভাগ ভাগ্য। যাইহোক, overflows জন্য চেক করুন







boolean