বুলিয়ান এক্সপ্রেশন লিখতে আরও কমপ্যাক্ট বা পাইথোনিক উপায় আছে কি?
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
আমি সাথে এসেছি
a + b + c in (2*a, 2*b, 2*c)
তবে এটি কিছুটা অদ্ভুত।
উত্তর:
যদি আমরা পাইথনের জেনটি দেখি তবে জোর দেওয়া আমার:
টিম পিটার্স দ্বারা নির্মিত পাইথনের জেন
কদর্য চেয়ে সুন্দর।
সুস্পষ্ট বর্ণিত চেয়ে ভাল।
সহজ জটিল চেয়ে ভাল।
জটিল জটিল চেয়ে ভাল।
নেস্টেড থেকে ফ্ল্যাট ভাল।
গা Sp়ের চেয়ে বিরাগই ভাল।
পঠনযোগ্যতা গণনা।
বিশেষ কেসগুলি নিয়ম ভাঙার পক্ষে যথেষ্ট বিশেষ নয়।
যদিও ব্যবহারিকতা বিশুদ্ধতা বীট।
ত্রুটিগুলি কখনই নিঃশব্দে কাটানো উচিত নয়।
স্পষ্টভাবে নিরব না হলে।
অস্পষ্টতার মুখে অনুমান করার প্রলোভনটিকে অস্বীকার করুন।
এটির জন্য একটি - এবং অগ্রাধিকার কেবল একটিই - প্রকাশ্য উপায় থাকতে হবে।
যদিও আপনি ডাচ না হলে প্রথমে সেই উপায়টি স্পষ্ট নাও হতে পারে।
এখন আগের চেয়ে ভাল is
যদিও কখনও কখনও এর চেয়ে ভাল হয় নাঅধিকার এখন।
যদি বাস্তবায়নটি ব্যাখ্যা করা শক্ত হয় তবে এটি একটি খারাপ ধারণা।
বাস্তবায়নটি যদি ব্যাখ্যা করা সহজ হয় তবে এটি একটি ভাল ধারণা হতে পারে।
নেমস্পেসগুলি হ'ল একটি দুর্দান্ত ধারণা - আসুন আমরা তাদের আরও কিছু করি!
সর্বাধিক পাইথোনিক দ্রবণটি হ'ল এটি পরিষ্কার, সহজতম এবং সহজ ব্যাখ্যা:
a + b == c or a + c == b or b + c == a
আরও ভাল, এই কোডটি বুঝতে আপনার পাইথনও জানতে হবে না! এটা এত সহজ। এটি হল রিজার্ভেশন ছাড়াই সেরা সমাধান best আর কিছু হ'ল বৌদ্ধিক হস্তমৈথুন।
তদ্ব্যতীত, এটি সম্ভবত সেরা পারফরম্যান্স সমাধানও হ'ল শর্ট সার্কিটগুলির সমস্ত প্রস্তাবগুলির মধ্যে এটি কেবলমাত্র একটি। যদি a + b == c
, শুধুমাত্র একটি সংযোজন এবং তুলনা করা হয়।
একটি জন্য তিনটি সমতা সমাধান:
a in (b+c, b-c, c-b)
পাইথনের একটি any
ক্রিয়াকলাপ রয়েছে যা or
একটি অনুক্রমের সমস্ত উপাদানের উপর কাজ করে । এখানে আমি আপনার বিবৃতিটিকে 3-উপাদান টিউপলে রূপান্তর করেছি।
any((a + b == c, a + c == b, b + c == a))
নোটটি or
সংক্ষিপ্ত সার্কিট, সুতরাং স্বতন্ত্র অবস্থার গণনা করা যদি ব্যয়বহুল হয় তবে আপনার মূল রচনাটি রাখা ভাল।
any()
এবং all()
শর্ট সার্কিট।
any
এমনকি রান হওয়ার আগেই উপস্থিত থাকবে ।
any
এবং all
"শর্ট সার্কিট" তাদের দেওয়া পুনরাবৃত্তির পরীক্ষা করার প্রক্রিয়া ; তবে যদি সেই পুনরাবৃত্তিযোগ্য জেনারেটরের পরিবর্তে একটি ক্রম হয় তবে ফাংশন কলটি হওয়ার আগেই এটি ইতিমধ্যে সম্পূর্ণ মূল্যায়ন করা হয়েছে ।
any
, একক ইন্ডেন্ট ):
মধ্যে if
বিবৃতি), যা পাঠযোগ্যতা জন্য প্রচুর সাহায্য করে যখন গণিত জড়িত
আপনি যদি জানেন যে আপনি কেবল ইতিবাচক সংখ্যার সাথেই কাজ করছেন, এটি কার্যকর হবে এবং বেশ পরিষ্কার:
a, b, c = sorted((a, b, c))
if a + b == c:
do_stuff()
আমি যেমন বলেছি, এটি কেবল ধনাত্মক সংখ্যার জন্যই কাজ করে; তবে যদি আপনি জানেন যে তারা ইতিবাচক হতে চলেছেন তবে এটি একটি খুব পঠনযোগ্য সমাধান আইএমও, এমনকি কোনও কার্যের বিপরীতে সরাসরি কোডে।
আপনি এটি করতে পারেন, যা কিছুটা পুনরাবৃত্তি গণনা করতে পারে; তবে আপনি আপনার লক্ষ্য হিসাবে কর্মক্ষমতা নির্দিষ্ট করেন নি:
from itertools import permutations
if any(x + y == z for x, y, z in permutations((a, b, c), 3)):
do_stuff()
বা ছাড়া permutations()
এবং পুনরাবৃত্তি গণনার সম্ভাবনা:
if any(x + y == z for x, y, z in [(a, b, c), (a, c, b), (b, c, a)]:
do_stuff()
আমি সম্ভবত এটি বা অন্য কোনও সমাধান একটি ফাংশনে রেখে দেব। তারপরে আপনি কেবল আপনার কোডটিতে পরিষ্কারভাবে ফাংশনটি কল করতে পারেন।
ব্যক্তিগতভাবে, কোডটি থেকে আমার আরও নমনীয়তার প্রয়োজন না হলে আমি আপনার প্রশ্নের প্রথম পদ্ধতিটি ব্যবহার করব। এটি সহজ এবং দক্ষ। আমি এখনও এটি একটি ফাংশনে রাখতে পারি:
def two_add_to_third(a, b, c):
return a + b == c or a + c == b or b + c == a
if two_add_to_third(a, b, c):
do_stuff()
এটি সুন্দর পাইথোনিক, এবং এটি করার সম্ভবত সবচেয়ে কার্যকর উপায় (অতিরিক্ত ফাংশন কল একপাশে); যদিও আপনার কার্য সম্পাদন সম্পর্কে খুব বেশি চিন্তা করা উচিত নয়, যদি না এটি প্রকৃতপক্ষে কোনও সমস্যা তৈরি করে।
আপনি যদি কেবল তিনটি ভেরিয়েবল ব্যবহার করেন তবে আপনার প্রাথমিক পদ্ধতি:
a + b == c or a + c == b or b + c == a
ইতিমধ্যে খুব অজগর।
আপনি যদি আরও ভেরিয়েবল ব্যবহার করার পরিকল্পনা করে থাকেন তবে আপনার যুক্তির পদ্ধতিটি এর সাথে:
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
আর এই পারেন A, B, বা গ জন্য সত্য রাখা আছে, যার মানে হল হ্যাঁ এটা সমান হবে 2*a
, 2*b
বা 2*c
। যেকোন সংখ্যক ভেরিয়েবলের ক্ষেত্রে এটি সত্য হবে।
সুতরাং দ্রুত এটি লেখার একটি ভাল উপায় হ'ল আপনার ভেরিয়েবলগুলির একটি তালিকা রাখা এবং দ্বিগুণ মানগুলির তালিকার বিপরীতে তাদের যোগফল পরীক্ষা করা।
values = [a,b,c,d,e,...]
any(sum(values) in [2*x for x in values])
এইভাবে সমীকরণে আরও ভেরিয়েবল যুক্ত করতে আপনাকে যা করতে হবে তা হ'ল 'n' নতুন ভেরিয়েবল দ্বারা আপনার মান তালিকাটি সম্পাদনা করতে হবে, 'এন' সমীকরণগুলি লিখবেন না
a=-1
, b=-1
, c=-2
, তারপর a+b=c
কিন্তু a+b+c = -4
ও 2*max(a,b,c)
হয়-2
abs()
কল দিয়ে এটি ঝাঁকুনির পরে, এটি ওপি'র স্নিপেটের চেয়ে পাইথোনিক (আমি আসলে এটিকে উল্লেখযোগ্যভাবে কম পঠনযোগ্য বলব)।
any(sum(values) == 2*x for x in values)
, আপনাকে যেমন প্রয়োজন ঠিক তেমন সমস্ত দ্বিগুণ করতে হবে না।
নীচের কোডটি প্রতিটি উপাদানকে অন্যের যোগফলের সাথে পুনরাবৃত্তভাবে তুলনা করতে ব্যবহার করা যেতে পারে, যা উপাদানটিকে বাদ দিয়ে পুরো তালিকার যোগফল থেকে গণনা করা হয়।
l = [a,b,c]
any(sum(l)-e == e for e in l)
[]
লাগল :) আমি মনে করি আপনি যদি দ্বিতীয় লাইনের বন্ধনীগুলি সরিয়ে ফেলেন তবে এটি এমনকি মূলটির মতো শর্ট সার্কিট হবে or
...
any(a + b + c == 2*x for x in [a, b, c])
,
এটি চেষ্টা করুন এবং সরল করুন না। পরিবর্তে, আপনি একটি ফাংশন দিয়ে কি করছেন নাম দিন :
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):
...
"চালাক" এমন কিছু দিয়ে শর্তটি প্রতিস্থাপন করুন যা এটি সংক্ষিপ্ত করে তুলতে পারে তবে এটি এটিকে আরও পঠনযোগ্য করে তুলবে না। এটি তবে খুব পঠনযোগ্য নয় তবে এটি ছেড়ে দেওয়া, কারণ আপনি কেন তিনটি শর্তটি এক নজরে পরীক্ষা করছেন তা জানা মুশকিল। এটি আপনি যা যা পরীক্ষা করছেন তা একেবারে স্ফটিক করে তোলে।
পারফরম্যান্স সম্পর্কে, এই পদ্ধতির কোনও ফাংশন কলের ওভারহেড যুক্ত করে, তবে আপনি যদি কোনও বাধা না পেয়ে থাকেন তবে অবশ্যই পারফরম্যান্সের জন্য পড়ার যোগ্যতা ত্যাগ করবেন না absolutely এবং সর্বদা পরিমাপ করুন, যেহেতু কিছু চতুর বাস্তবায়ন কিছু পরিস্থিতিতে কিছু ফাংশন কলকে অনুকূলকরণ এবং ইনলাইন করতে সক্ষম।
পাইথন 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
তবে, সাধারণভাবে আমি সম্মত হই যে আপনার যদি তিনটির বেশি ভেরিয়েবল না থাকে তবে মূল সংস্করণটি আরও পঠনযোগ্য।
[x for x in range(pow(2,30)) if x != ((x * 2)/ pow(2,1))]
(a+b-c)*(a+c-b)*(b+c-a) == 0
যদি কোনও দুটি পদগুলির যোগফল তৃতীয় পদের সমান হয়, তবে এর একটি কারণ শূন্য হবে, পুরো পণ্যকে শূন্য করে তুলবে।
(a+b<>c) && (a+c<>b) && (b+c<>a) == false
কীভাবে ঠিক:
a == b + c or abs(a) == abs(b - c)
নোট করুন যে ভেরিয়েবলগুলি স্বাক্ষর না করা থাকলে এটি কাজ করবে না।
কোড অপ্টিমাইজেশনের দৃষ্টিকোণ থেকে (কমপক্ষে x86 প্ল্যাটফর্মে) এটি সর্বাধিক দক্ষ সমাধান বলে মনে হচ্ছে।
আধুনিক কম্পাইলার উভয় ABS () ফাংশন কল ও এড়ানোর চিহ্ন টেস্টিং এবং একটি ব্যবহার করে পরবর্তী শর্তসাপেক্ষ শাখা ইনলাইন হবে CDQ, XOR যাও এর চালাক ক্রম এবং উপ নির্দেশাবলী । উপরের উচ্চ-স্তরের কোডটি কেবলমাত্র নিম্ন-স্বল্পতা, উচ্চ-থ্রুপুট ALU নির্দেশাবলী এবং মাত্র দুটি শর্তসাপেক্ষে প্রতিনিধিত্ব করা হবে।
fabs()
জন্য ব্যবহার করা যেতে পারে float
;)।
অ্যালেক্স ভার্গা "এ ইন (বি + সি, বিসি, সিবি)" প্রদত্ত সমাধানটি কমপ্যাক্ট এবং গাণিতিকভাবে সুন্দর, তবে আমি আসলে কোডটি লিখব না কারণ পরবর্তী বিকাশকারী সাথে সাথে কোডটির উদ্দেশ্য বুঝতে পারে না ।
মার্ক রান্সম এর সমাধান
any((a + b == c, a + c == b, b + c == a))
আরও স্পষ্ট তবে এর চেয়ে বেশি সাফল্য নয়
a + b == c or a + c == b or b + c == a
কোড লেখার সময় অন্য কারও দিকে নজর রাখতে হবে বা আমাকে অনেক পরে দেখতে হবে যখন আমি যখন লিখছিলাম তখন আমি কী ভাবছিলাম তা ভুলে গিয়েছি, খুব ছোট বা চতুর হওয়ার চেয়ে ভাল করার চেয়ে বেশি ক্ষতি করা যায়। কোড পাঠযোগ্য হবে। সুতরাং সংশ্লেষ ভাল, তবে এতটা সংক্ষিপ্ত নয় যে পরবর্তী প্রোগ্রামার এটি বুঝতে পারে না।
অনুরোধটি আরও কমপ্যাক্ট বা আরও বেশি পাইথোনিকের জন্য - আমি আরও কমপ্যাক্টে আমার হাতটি চেষ্টা করেছিলাম।
প্রদত্ত
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))))
g()
করার জন্য আপনাকে ফাংশনটির ছোট বিষয়ও নির্ধারণ করতে হবে। সব দেওয়া, আমি বলতে চাই এটি উল্লেখযোগ্যভাবে বড়।
আমি যা দেখি সেটিকে সর্বাধিক পাইথোনিক উত্তর হিসাবে উপস্থাপন করতে চাই :
def one_number_is_the_sum_of_the_others(a, b, c):
return any((a == b + c, b == a + c, c == a + b))
সাধারণ ক্ষেত্রে, অপ্টিমাইজড:
def one_number_is_the_sum_of_the_others(numbers):
for idx in range(len(numbers)):
remaining_numbers = numbers[:]
sum_candidate = remaining_numbers.pop(idx)
if sum_candidate == sum(remaining_numbers):
return True
return False
পাইথনের জেনের দিক থেকে আমি মনে করি জোর দেওয়া বক্তব্যগুলি অন্যান্য উত্তরের চেয়ে বেশি অনুসরণ করা হয়:
টিম পিটার্স দ্বারা নির্মিত পাইথনের জেন
কদর্য চেয়ে সুন্দর।
সুস্পষ্ট বর্ণিত চেয়ে ভাল।
সহজ জটিল চেয়ে ভাল।
জটিল জটিল চেয়ে ভাল।
নেস্টেড থেকে ফ্ল্যাট ভাল।
গা Sp়ের চেয়ে বিরাগই ভাল।
পঠনযোগ্যতা গণনা।
বিশেষ কেসগুলি নিয়ম ভাঙার পক্ষে যথেষ্ট বিশেষ নয়।
যদিও ব্যবহারিকতা বিশুদ্ধতা বীট।
ত্রুটিগুলি কখনই নিঃশব্দে কাটানো উচিত নয়।
স্পষ্টভাবে নিরব না হলে।
অস্পষ্টতার মুখে অনুমান করার প্রলোভনটিকে অস্বীকার করুন।
এটির জন্য একটি - এবং অগ্রাধিকার কেবল একটিই - প্রকাশ্য উপায় থাকতে হবে।
যদিও আপনি ডাচ না হলে এই উপায়টি প্রথমে সুস্পষ্ট নাও হতে পারে।
এখন আগের চেয়ে ভাল is
যদিও কখনও কখনও এর চেয়ে ভাল হয় নাঅধিকার এখন।
যদি বাস্তবায়নটি ব্যাখ্যা করা শক্ত হয় তবে এটি একটি খারাপ ধারণা।
বাস্তবায়নটি যদি ব্যাখ্যা করা সহজ হয় তবে এটি একটি ভাল ধারণা হতে পারে।
নেমস্পেসগুলি হ'ল একটি দুর্দান্ত ধারণা - আসুন আমরা তাদের আরও কিছু করি!
আমার প্রোগ্রামিংয়ের একটি পুরানো অভ্যাস হিসাবে, আমি মনে করি কোনও অনুচ্ছেদে ডানদিকে জটিল ভাব প্রকাশ করা এটিকে আরও পাঠযোগ্য করে তুলতে পারে:
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))
সাধারণ পদ্ধতিতে,
m = a+b-c;
if (m == 0 || m == 2*a || m == 2*b) do_stuff ();
যদি, একটি ইনপুট ভেরিয়েবল পরিচালনা করা আপনার জন্য ঠিক থাকে,
c = a+b-c;
if (c==0 || c == 2*a || c == 2*b) do_stuff ();
আপনি যদি বিট হ্যাক ব্যবহার করে শোষণ করতে চান তবে আপনি "!", ">> 1" এবং "<< 1" ব্যবহার করতে পারেন
আমি বিভাজন এড়াতে পেরেছি যদিও এটি গোলাকার ত্রুটিগুলি এড়াতে দুটি গুণগুলি এড়ানোর জন্য সক্ষম করে। তবে ওভারফ্লো পরীক্ষা করে দেখুন
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