সংক্ষিপ্ত লেখার উপায় (a + b == c বা a + c == b বা b + c == a)


136

বুলিয়ান এক্সপ্রেশন লিখতে আরও কমপ্যাক্ট বা পাইথোনিক উপায় আছে কি?

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

আমি সাথে এসেছি

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

তবে এটি কিছুটা অদ্ভুত।


16
আরও কমপ্যাক্ট? সম্ভবত। আরও পাইথোনিক? অসম্ভাব্য।
চিপনার

126
আপনার ভবিষ্যতকে একটি অনুগ্রহ করুন এবং এটিকে মূল আকারে রাখুন: এটি কেবলমাত্র এটি যা অবিলম্বে এর উদ্দেশ্যটি জানিয়ে দেয়। এটি সংশোধন করবেন না। "জটিল থেকে সহজ ভাল।", "পঠনযোগ্যতা গণনা।" "যদি বাস্তবায়নটি ব্যাখ্যা করা শক্ত হয় তবে এটি একটি খারাপ ধারণা।"
অকর্মা

21
পাইথোনিক == অপঠনযোগ্য?
nhaarman

3
@wwii তারা পারস্পরিক একচেটিয়া নয়। দেখুন a = 0, b = 0, c = 0;)
হুনজা ব্রাবেক

1
@ ফ্রেসনেল যা বলেছে। অভিব্যক্তিটি "সরলকরণ" করার চেষ্টা করার পরিবর্তে বর্ণনামূলক নামের সাথে একটি ফাংশনে এটি মোড়ানো rap
সেফালপড

উত্তর:


206

যদি আমরা পাইথনের জেনটি দেখি তবে জোর দেওয়া আমার:

টিম পিটার্স দ্বারা নির্মিত পাইথনের জেন

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

সর্বাধিক পাইথোনিক দ্রবণটি হ'ল এটি পরিষ্কার, সহজতম এবং সহজ ব্যাখ্যা:

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

আরও ভাল, এই কোডটি বুঝতে আপনার পাইথনও জানতে হবে না! এটা এত সহজ। এটি হল রিজার্ভেশন ছাড়াই সেরা সমাধান best আর কিছু হ'ল বৌদ্ধিক হস্তমৈথুন।

তদ্ব্যতীত, এটি সম্ভবত সেরা পারফরম্যান্স সমাধানও হ'ল শর্ট সার্কিটগুলির সমস্ত প্রস্তাবগুলির মধ্যে এটি কেবলমাত্র একটি। যদি a + b == c, শুধুমাত্র একটি সংযোজন এবং তুলনা করা হয়।


11
আরও ভাল, অভিপ্রায় স্ফটিক পরিষ্কার করার জন্য কিছু বন্ধনী ফেলে দিন।
ব্রায়ান ওকলে

3
উদ্দেশ্যটি ইতিমধ্যে বন্ধনী ছাড়াই স্ফটিক পরিষ্কার। প্যারেন্টিহেসগুলি এটি পড়া আরও শক্ত করে তুলবে - যখন অগ্রাধিকারটি ইতিমধ্যে এটি আবৃত করে তখন লেখক কেন বন্ধনী ব্যবহার করছেন?
মাইলস রাউথ

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

এটি সূত্রটি কীসের উপর নির্ভর করে। 'স্পষ্টিকর চেয়ে ভাল ভাল অন্তর্নিহিত' এর দিকে তাকান, এটি হতে পারে যে 'প্রথমে বাছাই করা' পদ্ধতির প্রোগ্রামটি কী করছে, বা অন্য কোনওটির দ্বারা আরও পরিষ্কারভাবে প্রকাশ করা হয়েছে। আমি মনে করি না যে আমরা প্রশ্নটি থেকে বিচার করতে পারি।
থমাস আহলে

101

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

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

4
এর একমাত্র সমস্যাটি হচ্ছে পার্শ্ব প্রতিক্রিয়া। যদি খ বা সি আরও জটিল এক্সপ্রেশন হয় তবে সেগুলি একাধিকবার চালানো হবে।
সিলভিও মায়োলো

3
@ ক্রল্টান আমার বক্তব্যটি ছিল যে আমি আসলে তার প্রশ্নের উত্তর দিয়েছি, যা "আরও কমপ্যাক্ট" প্রতিনিধিত্ব চেয়েছিল। দেখুন: en.m.wikipedia.org/wiki/Short-circuit_evaluation
অ্যালেক্স Varga

24
এই কোডটি পড়ে যে কেউ সম্ভবত "চালাক" বলে আপনাকে অভিশাপ দেবে।
করলি হরভাথ

5
@ সিলভিওমায়োলো একই কথাটি আসল
ইজকাটা

1
@ অ্যালেক্স ভার্গা, "আমার বক্তব্যটি ছিল আমি আসলে তার প্রশ্নের উত্তর দিয়েছি"। তুমি করেছ; এটি 30% কম অক্ষর ব্যবহার করে (অপারেটরদের মধ্যে ফাঁক রেখে)। আমি আপনার উত্তরটি ভুল বলে বলার চেষ্টা করছিলাম না, কেবল এটি কতটা মূর্তিমান (অজগর) তা নিয়ে মন্তব্য করছি। চমৎকার উত্তর.
পল ড্রাগন

54

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

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

নোটটি orসংক্ষিপ্ত সার্কিট, সুতরাং স্বতন্ত্র অবস্থার গণনা করা যদি ব্যয়বহুল হয় তবে আপনার মূল রচনাটি রাখা ভাল।


2
any()এবং all()শর্ট সার্কিট।
টাইগারহকটি 3

42
@ টাইগারহকটি 3 যদিও এই ক্ষেত্রে নয়; টিপলটি উপস্থিত হওয়ার আগে তিনটি এক্সপ্রেশনকে মূল্যায়ন করা হবে এবং টিপল anyএমনকি রান হওয়ার আগেই উপস্থিত থাকবে ।
অকর্মা

13
আহ আমি দেখি. আমার ধারণা কেবল তখনই যখন সেখানে কোনও জেনারেটর বা অনুরূপ অলস পুনরুদ্ধার হয়।
টাইগারহকটি 3

4
anyএবং all"শর্ট সার্কিট" তাদের দেওয়া পুনরাবৃত্তির পরীক্ষা করার প্রক্রিয়া ; তবে যদি সেই পুনরাবৃত্তিযোগ্য জেনারেটরের পরিবর্তে একটি ক্রম হয় তবে ফাংশন কলটি হওয়ার আগেই এটি ইতিমধ্যে সম্পূর্ণ মূল্যায়ন করা হয়েছে ।
কার্ল নচেটেল

এই সুবিধা এটি একাধিক লাইনের (ডাবল-ইন্ডেন্ট আর্গুমেন্ট উপর বিভক্ত করা সহজ হয়েছে any, একক ইন্ডেন্ট ):মধ্যে ifবিবৃতি), যা পাঠযোগ্যতা জন্য প্রচুর সাহায্য করে যখন গণিত জড়িত
Izkata

40

আপনি যদি জানেন যে আপনি কেবল ইতিবাচক সংখ্যার সাথেই কাজ করছেন, এটি কার্যকর হবে এবং বেশ পরিষ্কার:

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 ধরে নিতে পারি তবে এটি সমস্ত নেতিবাচক।
সিএফলেউইস

আমি "সবসময় কাজ করে না" এই বাক্যাংশটি কিছুটা বিভ্রান্তিকর খুঁজে পাই। প্রথম সমাধানটি কেবল তখনই কাজ করে যদি আপনি নিশ্চিত হন যে আপনার সংখ্যাটি নেতিবাচক। উদাহরণস্বরূপ (a, b, c) = (-3, -2, -1) এর সাথে আপনার একটি + বি! = সি কিন্তু বি + সি = এ রয়েছে। (-1, 1, 2) এবং (-2, -1, 1) এর সাথে একই রকম ঘটনা।
ব্যবহারকারীর সংখ্যা

@ ব্যবহারকারী, আপনি জানেন, আমি এটি আগে লক্ষ্য করেছি; আমি কেন এটি ঠিক করিনি তা নিশ্চিত নয়।
সাইফেজ

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

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

17

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

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' নতুন ভেরিয়েবল দ্বারা আপনার মান তালিকাটি সম্পাদনা করতে হবে, 'এন' সমীকরণগুলি লিখবেন না


4
কি a=-1, b=-1, c=-2, তারপর a+b=cকিন্তু a+b+c = -42*max(a,b,c)হয়-2
এরিক Renouf

আপনাকে ধন্যবাদ যে সত্য, আমার অ্যাবস ব্যবহার করা দরকার। এখনই সমন্বয় করা।
ThatGuyRselll

2
আধা ডজন abs()কল দিয়ে এটি ঝাঁকুনির পরে, এটি ওপি'র স্নিপেটের চেয়ে পাইথোনিক (আমি আসলে এটিকে উল্লেখযোগ্যভাবে কম পঠনযোগ্য বলব)।
টাইগারহকটি 3

এটি খুব সত্য, আমি এখনই এটি সামঞ্জস্য করব
ThatGuyRussell

1
@ থ্যাটগ্যুরসেল শর্ট সার্কিট করার জন্য, আপনি একটি জেনারেটর ব্যবহার করতে চাইবেন ... এর মতো কিছু any(sum(values) == 2*x for x in values), আপনাকে যেমন প্রয়োজন ঠিক তেমন সমস্ত দ্বিগুণ করতে হবে না।
ব্যারি

12

নীচের কোডটি প্রতিটি উপাদানকে অন্যের যোগফলের সাথে পুনরাবৃত্তভাবে তুলনা করতে ব্যবহার করা যেতে পারে, যা উপাদানটিকে বাদ দিয়ে পুরো তালিকার যোগফল থেকে গণনা করা হয়।

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

2
ভাল []লাগল :) আমি মনে করি আপনি যদি দ্বিতীয় লাইনের বন্ধনীগুলি সরিয়ে ফেলেন তবে এটি এমনকি মূলটির মতো শর্ট সার্কিট হবে or...
গীতসংহিতা

1
যা মূলত any(a + b + c == 2*x for x in [a, b, c]),
ওপির

এটি একই রকম, তবে এই পদ্ধতিটি কোনও ভেরিয়েবলের বিস্তৃত। আমি শর্ট সার্কিটের বিষয়ে @psmears দ্বারা পরামর্শটি সংযুক্ত করেছি।
আরকানুম

10

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

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 এবং সর্বদা পরিমাপ করুন, যেহেতু কিছু চতুর বাস্তবায়ন কিছু পরিস্থিতিতে কিছু ফাংশন কলকে অনুকূলকরণ এবং ইনলাইন করতে সক্ষম।


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

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

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

9

পাইথন 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

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


3
ভাসমান পয়েন্ট রাউন্ডিং ত্রুটির কারণে এটি কিছু ইনপুটগুলির জন্য ভুল ফলাফল দেয়।
পিটিএস

পারফরম্যান্স এবং নির্ভুলতার কারণে বিভাগকে এড়ানো উচিত।
ইগোর লেভিকি

1
@ পিটিএস কি ভাসমান পয়েন্টের বৃত্তাকার কারণে কোনও বাস্তবায়নই ভুল ফলাফল ফিরে পাবে না? এমনকি একটি + বি == সি
ওসুন্ডব্ল্যাড

@osundblad: যদি a, b এবং c ints হয় তবে (a + b + c) / 2 গোল করে (এবং ভুল ফলাফলগুলি ফিরিয়ে দিতে পারে), তবে a + b == c সঠিক।
pts

3
2 দ্বারা বিভাজন কেবল একের সাথে ঘনিষ্ঠভাবে হ্রাস পাচ্ছে, সুতরাং এটি কোনও পূর্ণসংখ্যার জন্য 2 on 53 (পাইথনের ভাসানের ভগ্নাংশের অংশ) এর কম এবং বড় সংখ্যার জন্য আপনি দশমিক ব্যবহার করতে পারেন । উদাহরণস্বরূপ, 2 ^ 30 রানের কম সংখ্যক পূর্ণসংখ্যা পরীক্ষা করতে[x for x in range(pow(2,30)) if x != ((x * 2)/ pow(2,1))]
ভিটালি ফিডোরেনকো

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

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


আমি ঠিক একই জিনিসটি ভাবছিলাম তবে আমি অস্বীকার করতে পারি না যে তার আসল প্রস্তাবটি বেশ পরিষ্কার উপায় ...
ব্যবহারকারীর 4115686

@ মেহরদাদ - অবশ্যই এটি সত্যিই আলাদা নয়(a+b<>c) && (a+c<>b) && (b+c<>a) == false
এমবিকেশ

এটি কেবলমাত্র লজিক্যাল এক্সপ্রেশন এবং মৌলিক গাণিতিকের চেয়ে গুণ বেশি ব্যয়বহুল।
ইগর লেভিকি

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

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

6

কীভাবে ঠিক:

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

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

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

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


এবং আমি মনে করি প্রকারের fabs()জন্য ব্যবহার করা যেতে পারে float;)।
shA.t

4

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

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

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

আরও স্পষ্ট তবে এর চেয়ে বেশি সাফল্য নয়

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

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


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

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

2

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

প্রদত্ত

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()করার জন্য আপনাকে ফাংশনটির ছোট বিষয়ও নির্ধারণ করতে হবে। সব দেওয়া, আমি বলতে চাই এটি উল্লেখযোগ্যভাবে বড়।
টাইগারহকটি 3

@ টাইগারহকটি 3, আমি এটির সংক্ষিপ্ত ভাব / রেখার অনুরোধ হিসাবে ব্যাখ্যা করেছি। আরও উন্নতির জন্য সম্পাদনা দেখুন ।
wwii

4
খুব খারাপ ফাংশনের নাম, কেবল একটি কোড গল্ফের জন্য উপযুক্ত।
0xc0de

@ 0xc0de - দুঃখিত আমি খেলি না। উপযুক্ত হতে পারে বেশ সাপেক্ষিক এবং পরিস্থিতির উপর নির্ভরশীল - তবে আমি সম্প্রদায়কে পিছিয়ে দেব।
wwii

মূল কোডের চেয়ে বেশি অক্ষর থাকলে এটি কীভাবে আরও কমপ্যাক্ট তা আমি দেখতে পাই না।
ইগোর লেভিকি

1

আমি যা দেখি সেটিকে সর্বাধিক পাইথোনিক উত্তর হিসাবে উপস্থাপন করতে চাই :

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
যদিও কখনও কখনও এর চেয়ে ভাল হয় নাঅধিকার এখন।
যদি বাস্তবায়নটি ব্যাখ্যা করা শক্ত হয় তবে এটি একটি খারাপ ধারণা।
বাস্তবায়নটি যদি ব্যাখ্যা করা সহজ হয় তবে এটি একটি ভাল ধারণা হতে পারে।
নেমস্পেসগুলি হ'ল একটি দুর্দান্ত ধারণা - আসুন আমরা তাদের আরও কিছু করি!


1

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

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))

0

সাধারণ পদ্ধতিতে,

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" ব্যবহার করতে পারেন

আমি বিভাজন এড়াতে পেরেছি যদিও এটি গোলাকার ত্রুটিগুলি এড়াতে দুটি গুণগুলি এড়ানোর জন্য সক্ষম করে। তবে ওভারফ্লো পরীক্ষা করে দেখুন


0
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

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

আমি দ্বিমত পোষণ করি যে এটি পাঠযোগ্যতা বাধা দেয়; আপনি যদি উপযুক্ত নাম চয়ন করেন তবে এটি পঠনযোগ্যতার উন্নতি করতে পারে (তবে আমি এই উত্তরে যে নামটি বেছে নিয়েছি তার গুণগত মান হিসাবে আমি কোনও প্রতিনিধিত্ব করি না)। তদতিরিক্ত, একটি ধারণার নাম দেওয়ার জন্য এটি সহায়ক হতে পারে, যা আপনি নিজের ফাংশনটিতে একটি ভাল নাম দেওয়ার জন্য নিজেকে চাপ দিন ততক্ষণ আপনাকে করতে হবে। ফাংশন ভাল। কার্যকারিতাটি কোনও ফাংশনে আবদ্ধ হয়ে থাকা থেকে উপকৃত হওয়ার পক্ষে যথেষ্ট জটিল কিনা, এটি একটি বিষয়গত রায়।
হামারাইট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.