যুক্তিযুক্তভাবে "বা" কীভাবে সংজ্ঞায়িত করবেন


36

সম্প্রতি, আমি একটি সমস্যার মুখোমুখি হয়েছি যার জন্য আমাকে লজিক্যাল "ওআর" অপারেটরটিকে প্রোগ্রামগতভাবে সংজ্ঞায়িত করতে হবে, তবে অপারেটরটি নিজেই ব্যবহার না করেই করতে হবে।

আমি যা নিয়ে এসেছি তা হ'ল:

OR(arg1, arg2)
  if arg1 = True and arg2 = True
     return True

  else if arg1 = True and arg2 = False
     return True

  else if arg1 = False and arg2 = True
     return True

  else:
     return False

এই যুক্তিটি সঠিক, না আমি কিছু মিস করেছি?


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

6
@ user3687688 আপনি দয়া করে আমাদের যে আদিম ব্যবহারের অনুমতি দিয়েছেন তা স্পষ্ট করে বলতে পারেন?
ফ্রেডওভারফ্লো

4
এই প্রশ্নটি মাইক্রো-অপ্টিমাইজেশনের সম্মিলিতভাবে ছড়িয়ে পড়া শুরু করেছে;)
রব

8
আপনি টার্নারি অপারেটরটি ব্যবহার করতে পারেনreturn arg1 ? arg1 : arg2;
ম্যাথু

4
orঅপারেটরটির পুনরায় সংজ্ঞা দেওয়ার জন্য আপনার প্রয়োজন কেন তা আমি জানতে পেরেছি ।
কাইল স্ট্র্যান্ড

উত্তর:


102

আমি বলব যে এটি সঠিক, তবে আপনি কি এটির মতো কোনও কিছুকে ঘৃণা করতে পারবেন না?

or(arg1, arg2)
    if arg1 == true
        return true
    if arg2 == true
        return true

    return false

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

আপনি যদি কম ভার্বোস সংক্ষিপ্ত সংস্করণ খুঁজছেন, এটিও কাজ করবে:

or(arg1, arg2)
    if arg1
        return arg1
    return arg2

6
আপনি 4 টি লাইনে "অন্য "টিকেও সরিয়ে ফেলতে পারেন (কেবল ছেড়ে যাচ্ছেন if arg2 == true)।
ডসন টোথ

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

@ ব্লুহ্যাট এটি অন্য কোনওটি ব্যবহার করা সামান্য অসঙ্গত বলে মনে হচ্ছে তবে শেষ পর্যন্ত অন্যটি নয়।
এসবস

1
@ মেহরদাদ ধন্যবাদ! আমি পুরানো উত্তরটি কেবলমাত্র অন্তর্ভুক্ত করেছি কারণ আমি মনে করি এটি কিছুটা ভার্জোজ এবং সমাধানটিকে একটি সামান্য বিট পরিষ্কার করে ব্যাখ্যা করে। তবে আপনার সমাধানটি অনেক ছোট এবং একই কাজ করে।
ইলিয়ট ব্ল্যাকবার্ন

1
আরও ভাল (আরও খারাপ):or(a, b): a ? a : b
সারা

149

তুলনা এবং বুলিয়ান আক্ষরিক ছাড়া বা এখানে এবং এর সমাধান রয়েছে:

or(arg1, arg2)
  if arg1
    return arg1
  else
    return arg2

এটি সম্ভবত এর চেয়ে বেশি মৌলিকতা পায় না;)


32
আমার চেয়ে সামান্য সংক্ষিপ্ত উত্তরের জন্য +1। তবে আমি "অন্য" বাদ দিয়ে কেবল কমনীয়তার জন্য প্রলুব্ধ হব।
ইলিয়ট ব্ল্যাকবার্ন

10
@ ব্লুহ্যাট তবে তারপরে দুটি রিটার্ন আলাদাভাবে ইন্ডেন্ট করা হবে;)
ফ্রেডওভারফ্লো

5
আমি একজন ইউরো প্রতিটি সময় কেউ বিরুদ্ধে কিছু তুলনা পেতে চাই trueবা false
জেনসজ

1
@ জেনসজি ওয়েল, আপনি কী ভাবেন বিল গেটসের আয় কোথা থেকে এসেছে?
Kroltan

1
||সংক্ষেপে জাভাস্ক্রিপ্ট অপারেটর (যখন ডায়নামিকভাবে টাইপ করা ভাষায় প্রয়োগ করা হয়)।
গন্ডার

108

কোডের একটি লাইন:

return not (not arg1 and not arg2)

কোন শাখা নেই, নেই।

সি-ভিত্তিক ভাষায়, এটি হবে:

return !(!arg1 && !arg2);

এটি কেবল ডি মরগানের আইনগুলির প্রয়োগ :(A || B) == !(!A && !B)


6
আমি মনে করি এই পদ্ধতির সেরা সমাধান কারণ (আমার মতে) একটি if/elseকনস্ট্রাক্ট হ'ল ভিন্ন নামের সাথে ওআর ব্যবহার করার মতো।
নিক

2
@ নিক ব্যবহার ifকরা সমতার সমতুল্য। সাধারণত মেশিন কোডে একটি ifগাণিতিক হিসাবে প্রয়োগ করা হয় যার পরে শূন্যের সাথে জাম্পের সাথে তুলনা করা হয়।

6
জন্য রেফারেন্স: en.wikipedia.org/wiki/De_Morgan%27s_laws
Mephy

1
আমি এই পদ্ধতির পছন্দ করি কারণ এটি শর্ট সার্কিট আইএফএফ andশর্ট সার্কিট, এভাবে অপারেটরগুলির মধ্যে ধারাবাহিকতা সরবরাহ করে।
কাইল স্ট্র্যান্ড

1
@ স্নোম্যান এটি সত্য। আমি বোঝাতে চেয়েছিলাম যে if (a) return true; else if (b) return true;কমবেশি নৈতিকতার সমতুল্য বলে মনে হচ্ছে if (a OR b) return true;, তবে এই মতামতটি বিতর্কিত হতে পারে।
নিক

13

আপনার যদি কেবলমাত্র থাকে andএবং not, আপনি প্রায় ফ্লিপ করতে ডিমরগানের আইন ব্যবহার করতে পারেন and:

if not (arg1 = False and arg2 = False)
  return True
else
  return False

... বা (আরও সহজভাবে)

if arg1 = False and arg2 = False
  return false
else
  return true

...

এবং যেহেতু আমরা সকলেই যে কোনও উপায়ে মেশিনের নির্দেশ হিসাবে প্রায় সর্বদা পাওয়া যায় এমন কিছু অনুকূল করার জন্য আপাতদৃষ্টিতে স্থির হয়ে পড়েছি, যা এতে ফোটে:

return not(not arg1 and not arg2)

return arg1 ? true : arg2

ইত্যাদি ইত্যাদি ইত্যাদি ইত্যাদি

যেহেতু বেশিরভাগ ভাষাগুলি শর্তসাপেক্ষে সরবরাহ করে এবং, বৈষম্য হ'ল "এবং" অপারেটর যাইহোক একটি শাখা বোঝায়।

...

যদি আপনার সমস্ত কিছু থাকে nand( উইকিপিডিয়া দেখুন ):

রিটার্ন ন্যান্ড (নান্ড (আরজি 1, আরজি 1), নান্ড (আরজি 2, আরজি 2)


7
return not (not arg1 and not arg2)

@ স্বামী আপনি সত্যিই একটি উত্তর করা উচিত যাতে আমি এটি upvote করতে পারেন। আপনি (বর্তমানে) এখানে একমাত্র যিনি শাখা নিয়ে যাননি।
Lawtonfogle

4
ন্যান্ড সলিউশন যোগ করতে যাচ্ছিল, তবে আপনি আমাকে এতে মারধর করেছেন। ন্যানডের শর্তে সবকিছু কার্যকর করা উচিত।
অ্যান্ডি

2
@ অ্যান্ডি: আসলে, সবকিছুই এনওআর এর শর্তে সংজ্ঞায়িত করা উচিত। ;-)
পিটার জেরকেন্স

1
শুদ্ধ nandসমাধান সঙ্গে ভাল কাজ ।
এ্যাট

13

ফাংশন (ECMAScript)

আপনার যা দরকার তা হ'ল ফাংশন সংজ্ঞা এবং ফাংশন কল। আপনার কোনও শাখা-প্রশাখা, শর্তসাপেক্ষ, অপারেটর বা বিল্টিন ফাংশন দরকার নেই। আমি ECMAScript ব্যবহার করে একটি বাস্তবায়ন প্রদর্শন করব।

প্রথমে, বলা হয় দুটি ফাংশন সংজ্ঞায়িত করি trueএবং false। আমরা তাদের যেভাবে চাই সেগুলি সংজ্ঞায়িত করতে পারি, তারা সম্পূর্ণ স্বেচ্ছাচারী, তবে আমরা তাদের একটি বিশেষ পদ্ধতিতে সংজ্ঞায়িত করব যার কিছু সুবিধা রয়েছে যা আমরা পরে দেখব:

const tru = (thn, _  ) => thn,
      fls = (_  , els) => els;

truদুটি পরামিতি সহ একটি ফাংশন যা কেবল এটির দ্বিতীয় যুক্তি উপেক্ষা করে এবং প্রথমটি প্রদান করে। flsএটি দুটি পরামিতি সহ একটি ফাংশন যা কেবল তার প্রথম যুক্তি উপেক্ষা করে এবং দ্বিতীয়টি প্রদান করে।

কেন আমরা এনকোড হয়নি truএবং flsএই ভাবে? ভাল, এইভাবে, দুটি ফাংশন কেবল দুটি ধারণারই প্রতিনিধিত্ব করে না trueএবং falseনা, একই সাথে তারা "পছন্দ" ধারণাটিও উপস্থাপন করে, অন্য কথায়, তারাও একটি if/ then/ elseঅভিব্যক্তি! আমরা ifশর্তটি মূল্যায়ন করি এবং এটি thenব্লক এবং elseব্লকটিকে আর্গুমেন্ট হিসাবে পাস করি । যদি শর্তটি মূল্যায়ন করে তবে এটি ব্লকটি truফিরিয়ে দেবে then, যদি এটি মূল্যায়ন করে তবে এটি ব্লকটি flsফিরিয়ে দেবে else। এখানে একটি উদাহরণ:

tru(23, 42);
// => 23

এটি ফিরে আসে 23এবং এটি:

fls(23, 42);
// => 42

42আপনি প্রত্যাশা যেমন প্রত্যাবর্তন ।

একটি বলি আছে তবে:

tru(console.log("then branch"), console.log("else branch"));
// then branch
// else branch

এই ছাপে উভয় then branch এবং else branch! কেন?

ওয়েল, এটা ফেরৎ প্রথম আর্গুমেন্ট ফেরত মান, কিন্তু এটা মূল্যায়ন উভয় আর্গুমেন্ট, যেহেতু এর নাম ECMAScript কঠোর এবং সবসময় ফাংশন কল করার আগে ফাংশন সব আর্গুমেন্ট মূল্যায়ন করে। আইওডাব্লু: এটি প্রথম যুক্তির মূল্যায়ন করে যা কোনটি console.log("then branch"), যা সহজেই ফিরে আসে undefinedএবং then branchকনসোলে মুদ্রণের পার্শ্ব-প্রতিক্রিয়া রাখে এবং এটি দ্বিতীয় যুক্তির মূল্যায়ন করে, যা undefinedপার্শ্ব-প্রতিক্রিয়া হিসাবে কনসোলটিতে ফিরে আসে এবং মুদ্রণ করে। তারপরে, এটি প্রথমটি ফেরত দেয় undefined

Λ-ক্যালকুলাসে, যেখানে এই এনকোডিংটি আবিষ্কার হয়েছিল, এটি কোনও সমস্যা নয়: λ-ক্যালকুলাস খাঁটি , যার অর্থ এটির কোনও পার্শ্ব-প্রতিক্রিয়া নেই; সুতরাং আপনি কখনই লক্ষ্য করবেন না যে দ্বিতীয় তর্কটিও মূল্যায়ন হয় gets এছাড়াও, λ-ক্যালকুলাসটি অলস (বা কমপক্ষে, এটি প্রায়শই সাধারণ ক্রমের অধীনে মূল্যায়ন করা হয়), অর্থাত্ এটি আসলে যুক্তিগুলির মূল্যায়ন করে না যা প্রয়োজন হয় না। সুতরাং, আইওডাব্লু: λ-ক্যালকুলাসে দ্বিতীয় তর্কটি কখনই মূল্যায়ন করা হবে না এবং যদি এটি হয় তবে আমরা লক্ষ্য করব না।

ECMAScript অবশ্য কঠোর , অর্থাত্ এটি সর্বদা সমস্ত যুক্তির মূল্যায়ন করে। ভাল, আসলে, সর্বদা নয়: উদাহরণস্বরূপ, if/ then/ else, শুধুমাত্র thenশর্তটি থাকলে শাখার মূল্যায়ন করে এবং শর্তটি থাকলে trueকেবল elseশাখার মূল্যায়ন করে false। এবং আমরা আমাদের সাথে এই আচরণটি প্রতিলিপি করতে চাই iff। ধন্যবাদ, যদিও ECMAScript অলস নয়, কোডের একটি অংশের মূল্যায়ন বিলম্ব করার একটি উপায় রয়েছে, প্রায় প্রতিটি ভাষা প্রায় একইভাবে করে: একটি ফাংশন এ এটিকে মোড়ানো, এবং আপনি যদি সেই ফাংশনটিকে কখনও কল করেন না, কোডটি হবে কখনও মৃত্যুদন্ড কার্যকর করা হবে না।

সুতরাং, আমরা একটি ফাংশন উভয় ব্লক মোড়ানো, এবং শেষে ফাংশন ফিরে যে কল:

tru(() => console.log("then branch"), () => console.log("else branch"))();
// then branch

প্রিন্ট then branchএবং

fls(() => console.log("then branch"), () => console.log("else branch"))();
// else branch

কপি করে প্রিন্ট else branch

আমরা traditionalতিহ্যগত if/ then/ elseএইভাবে প্রয়োগ করতে পারি :

const iff = (cnd, thn, els) => cnd(thn, els);

iff(tru, 23, 42);
// => 23

iff(fls, 23, 42);
// => 42

আবার, উপরে যেমন একই কারণে iffফাংশন এবং অতিরিক্ত ফাংশন কল বন্ধনীগুলির সংজ্ঞায় কল করার সময় আমাদের কিছু অতিরিক্ত ফাংশন মোড়ানো প্রয়োজন iff:

const iff = (cnd, thn, els) => cnd(thn, els)();

iff(tru, () => console.log("then branch"), () => console.log("else branch"));
// then branch

iff(fls, () => console.log("then branch"), () => console.log("else branch"));
// else branch

এখন যে আমাদের দুটি সংজ্ঞা রয়েছে, আমরা তা প্রয়োগ করতে পারি or। প্রথমত, আমরা এর জন্য সত্যের টেবিলটি দেখি or: যদি প্রথম অপারেন্ড সত্যবাদী হয়, তবে প্রকাশের ফলাফলটি প্রথম অপারেন্ডের মতোই। অন্যথায়, প্রকাশের ফলাফলটি দ্বিতীয় অপারেন্ডের ফলাফল। সংক্ষেপে: প্রথম অপারেন্ডটি যদি হয় তবে trueআমরা প্রথম অপারেন্ডটি ফিরিয়ে দেব, অন্যথায় আমরা দ্বিতীয় অপারেন্ডটি ফিরিয়ে দিই:

const orr = (a, b) => iff(a, () => a, () => b);

আসুন এটি পরীক্ষা করে দেখুন:

orr(tru,tru);
// => tru(thn, _) {}

orr(tru,fls);
// => tru(thn, _) {}

orr(fls,tru);
// => tru(thn, _) {}

orr(fls,fls);
// => fls(_, els) {}

গ্রেট! তবে, এই সংজ্ঞাটি দেখতে কিছুটা কুৎসিত দেখাচ্ছে। মনে রাখবেন, truএবং flsইতিমধ্যে সমস্ত নিজেরাই কন্ডিশনার মতো কাজ করুন, সুতরাং সত্যই প্রয়োজন নেই iffএবং এইভাবে সমস্ত ফাংশন মোড়ানো:

const orr = (a, b) => a(a, b);

সেখানে আপনার এটি রয়েছে: or(প্লাস অন্যান্য বুলিয়ান অপারেটর) কেবলমাত্র কয়েকটি মুখ্য লাইনে ফাংশন সংজ্ঞা এবং ফাংশন কল ছাড়া কিছুই সংজ্ঞায়িত:

const tru = (thn, _  ) => thn,
      fls = (_  , els) => els,
      orr = (a  , b  ) => a(a, b),
      nnd = (a  , b  ) => a(b, a),
      ntt = a          => a(fls, tru),
      xor = (a  , b  ) => a(ntt(b), b),
      iff = (cnd, thn, els) => cnd(thn, els)();

দুর্ভাগ্যক্রমে, এই বাস্তবায়নটি বরং অকেজো: ECMAScript তে কোনও ফাংশন বা অপারেটর নেই যা ফিরে আসে truবা fls, তারা সবাই ফিরে আসে trueবা false, সুতরাং আমরা এগুলিকে আমাদের ফাংশন দিয়ে ব্যবহার করতে পারি না। তবে এখনও আমরা অনেক কিছু করতে পারি। উদাহরণস্বরূপ, এটি একক সংযুক্ত তালিকার একটি বাস্তবায়ন:

const cons = (hd, tl) => which => which(hd, tl),
      car  = l => l(tru),
      cdr  = l => l(fls);

অবজেক্টস (স্কেলা)

আপনি অদ্ভুত কিছু লক্ষ্য করেছেন: truএবং flsএকটি দ্বিগুণ ভূমিকা পালন করুন, তারা উভয়ই ডেটা মান হিসাবে trueএবং falseএকই সাথে, তারা শর্তযুক্ত অভিব্যক্তি হিসাবেও কাজ করে। এগুলি হ'ল ডেটা এবং আচরণ , একের মধ্যে একত্রিত হয়ে ... উহম… "জিনিস" ... বা (আমি সাহস করে বলতে পারি) অবজেক্ট !

প্রকৃতপক্ষে, truএবং flsবস্তু হয়। এবং আপনি যদি কখনও স্মলটালক, সেল্ফ, নিউজপেইক বা অন্যান্য অবজেক্ট-ভিত্তিক ভাষা ব্যবহার করেন তবে আপনি খেয়াল করবেন যে তারা বুলিয়ানগুলি ঠিক একইভাবে প্রয়োগ করে। আমি এখানে স্কালায় এ জাতীয় বাস্তবায়ন প্রদর্শন করব:

sealed abstract trait Buul {
  def apply[T, U <: T, V <: T](thn: ⇒ U)(els: ⇒ V): T
  def &&&(other:Buul): Buul
  def |||(other:Buul): Buul
  def ntt: Buul
}

case object Tru extends Buul {
  override def apply[T, U <: T, V <: T](thn: ⇒ U)(els: ⇒ V): U = thn
  override def &&&(other:Buul) = other
  override def |||(other:Buul): this.type = this
  override def ntt = Fls
}

case object Fls extends Buul {
  override def apply[T, U <: T, V <: T](thn: ⇒ U)(els: ⇒ V): V = els
  override def &&&(other:Buul): this.type = this
  override def |||(other:Buul) = other
  override def ntt = Tru
}

object BuulExtension {
  import scala.language.implicitConversions
  implicit def boolean2Buul(b:Boolean) = if (b) Tru else Fls
}

import BuulExtension._

(2 < 3) { println("2 is less than 3") } { println("2 is greater than 3") }
// 2 is less than 3

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


প্যাটার্ন ম্যাচিং (হাস্কেল)

আপনি orপ্যাটার্ন ম্যাচিং বা হাস্কেলের আংশিক ফাংশন সংজ্ঞার মতো কিছু ব্যবহার করে সংজ্ঞাও দিতে পারেন:

True ||| _ = True
_    ||| b = b

অবশ্যই, প্যাটার্ন ম্যাচিং শর্তসাপেক্ষ কার্যকরকরণের একটি রূপ, তবে আবার, অবজেক্ট-ভিত্তিক বার্তা প্রেরণ।


2
কিভাবে False ||| False = Falseএবং _ ||| _ = Trueপরিবর্তে? :)
ফ্রেডওভারফ্লো

3
@ ফ্রেড ওভারফ্লো: এর জন্য সর্বদা সঠিক অপারেণ্ডের মূল্যায়ন করা প্রয়োজন। সাধারণত বুলিয়ান অপারেটররা তাদের ডান আর্গুমেন্ট ওরফে "শর্ট সার্কিট" -এ অ-কঠোর হতে পারে বলে আশা করা যায়।
Jörg ডব্লু মিট্টাগ

আহ, অবশ্যই আমি জানতাম যে এর আরও গভীর কারণ থাকতে হবে :)
ফ্রেডওভারফ্লো

প্রথম অংশটি ধারাবাহিকতা পাস করার শৈলীর সম্পর্কে এরিক লিপার্টের দুর্দান্ত সিরিজের সাথে সাথে আমাকে স্মরণ করিয়ে দিয়েছে । খাঁটি কাকতালীয় তবে এখনও মজাদার :)
ভু

1
@ জার্গডব্লিউমিটাগ ফ্রেডওভারফ্লো এর সংজ্ঞাটি যথাযথভাবে সংক্ষিপ্তসার্কিটেড। True ||| undefinedনিজেকে দেখার চেষ্টা করুন ci
ড্যানিয়েল ওয়াগনার

3

এটি সংজ্ঞায়নের সর্বাধিক'sতিহ্যবাহী পদ্ধতি ব্যবহার করে ওআর বা প্রকৃতপক্ষে কোনও লজিকাল অপারেটর সংজ্ঞায়নের আরেকটি উপায়: একটি সত্য টেবিল ব্যবহার করুন।

এটি অবশ্যই জাভাস্ক্রিপ্ট বা পার্লের মতো উচ্চ স্তরের ভাষাগুলিতে করা বেশ তুচ্ছ তবে আমি প্রযুক্তিটি উচ্চ স্তরের ভাষার বৈশিষ্ট্যগুলির উপর নির্ভর করে না তা দেখানোর জন্য সিতে এই উদাহরণটি লিখছি:

#include <stdio.h>

int main (void) {
    // Define truth table for OR:
    int OR[2][2] = {
        {0,   // false, false
         1},  // false, true
        {1,   // true, false
         1}   // true, true
    }

    // Let's test the definition
    printf("false || false = %d\n",OR[1==2]['b'=='a']);
    printf("true || false = %d\n",OR[10==10]['b'=='a']);

    // Usage:
    if (OR[ 1==2 ][ 3==4 ]) {
        printf("at least one is true\n");
    }
    else {
        printf("both are false\n");
    }
}

আপনি ও, NOR, ন্যানড, নোট এবং এক্সওর দিয়ে একই কাজ করতে পারেন। কোডটি সিনট্যাক্সের মতো দেখতে যথেষ্ট পরিষ্কার যে আপনি এই জাতীয় জিনিসগুলি করতে পারেন:

if (OR[ a ][ AND[ b ][ c ] ]) { /* ... */ }

আমি মনে করি এটি নির্দিষ্ট গাণিতিক অর্থে "বিশুদ্ধতম" পদ্ধতি। ওআর-অপারেটর সর্বোপরি একটি ফাংশন এবং সত্য টেবিলটি আসলে একটি সম্পর্ক এবং সেট হিসাবে সেই ফাংশনের মূল অংশ। অবশ্যই এটি একটি মজাদার ওও পদ্ধতিতেও রচনা করা যেতে পারে:BinaryOperator or = new TruthTableBasedBinaryOperator(new TruthTable(false, true, true, true));
থেকে

3

লজিকাল অপারেটরদের একটি পূর্ণসংখ্যার গাণিতিক এক্সপ্রেশন (যেখানে সম্ভব) সেখানে প্রকাশ করার অন্য উপায়। এই উপায়ে অনেক পূর্বাভাসের বৃহত্তর প্রকাশের জন্য প্রচুর শাখাগুলি এড়াতে পারে ..

সত্য হতে দাও 1 টি মিথ্যা হোক 0

উভয়ের যোগফল যদি 1 এর চেয়ে বেশি হয় তবে এটি ফেরত দেওয়া সত্য বা মিথ্যা।

boolean isOR(boolean arg1, boolean arg2){

   int L = arg1 ? 1 : 0;
   int R = arg2 ? 1 : 0;

   return (L+R) > 0;

}

6
booleanExpression ? true : falseতুচ্ছ সমান booleanExpression
আগ্রহী

আমি আপনার পদ্ধতিটি পছন্দ করি তবে একটি সহজ ভুলটি হ'ল উভয় যুক্তির যোগফল অবশ্যই জেরোর চেয়ে বড় হতে হবে, একের চেয়ে বেশি নয়।
মঞ্জুরি

1
return (arga+argb)>0
অনুদান 1

1
আমি কেবল আপনার পাঠ্য সংশোধন করছিলাম। আপনার কোডটি নিখুঁত, তবে এটি একটি লাইনে থাকতে পারে: return (((arg1 ? 1 : 0)+(arg2 ? 1 : 0)) > 0); :)
গ্র্যান্টলি

1
@ সেন্থুসিভসম্বু আপনার ব্যবহার সম্পর্কে আমার কোনও আপত্তি নেই arg1 ? 1 : 0;। এটি একটি বুলিয়ানকে একটি সংখ্যায় রূপান্তর করার জন্য নির্ভরযোগ্য অভিব্যক্তি। এটি কেবলমাত্র রিটার্নের বিবৃতি যা তুচ্ছভাবে রিফেক্টর করা যায়।
আগ্রহী

1

দুটি রূপ:

OR(arg1, arg2)
  if arg1
     return True
  else:
     return arg2

অথবা

OR(arg1, arg2)
  if arg1
     return arg1
  else:
     return arg2

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

এর জাভাস্ক্রিপ্ট সংজ্ঞা ||এই, যা তার আলগা টাইপিং উপায়ে অভিব্যক্তি সঙ্গে মিলিত সদৃশ হয় false || "abc"মান আছে "abc"এবং 42 || "abc"মূল্য আছে 42

যদিও আপনার যদি ইতিমধ্যে অন্যান্য লজিকাল অপারেটর থাকে তবে পছন্দগুলি পছন্দ nand(not(arg1), not(arg2))না করে কোনও শাখা ছাড়াই সুবিধা পাবেন।


পূর্বের উত্তরটি পুনরাবৃত্তি করার কী লাভ ( আপনি যেমন স্বীকার করেছেন )?
gnat

@ জাগান এটি এতটা কাছে যে আমি উত্তরটি দেখলে মাথা ঘামাই না।
জন হান্না

@ জাগান, আসলে বিবেচনা করে "আমরা দীর্ঘ উত্তর খুঁজছি যা কিছু ব্যাখ্যা এবং প্রসঙ্গ সরবরাহ করে।" আমি এই উত্তর এখন খুশি।
জন হান্না

1

আইটি কনস্ট্রাক্ট ব্যবহার করে সমস্ত প্রোগ্রামযুক্ত সমাধান ছাড়াও তিনটি ন্যান্ড গেটের সমন্বয় করে একটি ওআর গেটটি নির্মাণ করা সম্ভব। আপনি যদি উইকিপিডিয়ায় এটি কীভাবে দেখতে চান তা এখানে ক্লিক করুন

এটি থেকে, অভিব্যক্তি,

না [না (একটি এবং ক) এবং না (বি এবং বি)]

যা না এবং ব্যবহার করে এবং ওআর হিসাবে একই উত্তর দেয়। লক্ষ্য করুন যে নন এবং এন্ড উভয়ের ব্যবহার নান্দকে প্রকাশের একটি অস্পষ্ট উপায়।


না (এএন্ড এ) == নয় (এ)?
চার্লি

হ্যাঁ অবশ্যই. একই উইকিপিডিয়া নিবন্ধে, আপনি দেখতে পাবেন কীভাবে তারা ন্যানড গেটগুলির একটি নট গেট হ্রাস করে। একটি ও গেটের জন্য একই। ওআর গেটের জন্য তারা যে সূত্রটি উপস্থাপন করেছে তা সম্পাদনা না করার জন্য আমি বেছে নিয়েছি।
ওয়াল্টার মিট্টি

1

সমস্ত ভাল উত্তর ইতিমধ্যে দেওয়া হয়েছে। তবে আমি তা আমাকে থামাতে দেব না।

// This will break when the arguments are additive inverses.
// It is "cleverness" like this that's behind all the most amazing program errors.
or(arg1, arg2)
    return arg1 + arg2
    // Or if you need explicit conversions:
    // return (bool)((short)arg1 + (short)arg2)

বিকল্পভাবে:

// Since `0 > -1`, negative numbers will cause weirdness.
or(arg1, arg2)
    return max(arg1, arg2)

আমি আশা করি বাস্তবে কেউ এ জাতীয় পদ্ধতির ব্যবহার করবে না। তারা এখানে কেবল বিকল্পের সচেতনতা প্রচারের জন্য।

হালনাগাদ:

যেহেতু নেতিবাচক সংখ্যাগুলি উপরের উভয় পন্থাকেই ভেঙে ফেলতে পারে, তাই এখানে আরও একটি ভয়ংকর পরামর্শ দেওয়া হল:

or(arg1, arg2)
    return !(!arg1 * !arg2)

এই কেবল ব্যবহার DeMorgan আইন এবং নির্যাতনের যে *অনুরূপ &&যখন trueএবং falseমত চিকিত্সা করা হয় 1এবং 0যথাক্রমে। (অপেক্ষা করুন, তুমি বলতে চাচ্ছ এই নয় কোড গলফ?)

এখানে একটি শালীন উত্তর:

or(arg1, arg2)
    return arg1 ? arg1 : arg2

তবে এটি ইতিমধ্যে দেওয়া অন্যান্য উত্তরগুলির সাথে মূলত অভিন্ন।


3
এই পদ্ধতির মূলত ত্রুটিযুক্ত। -1 + 1 এর জন্য arg1+arg2, -1 এবং 0 এর জন্য max(arg1,arg2)ইত্যাদি বিবেচনা করুন
17:34

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

আপনি বিশুদ্ধ 1-বিট বুলিয়ান মান করছেন, তাহলে উপরন্তু এখনও কাজ, করে করার পর থেকে 1 + 1 টি = 0. :)
ফুঁয়োফুঁয়ো

@ ফ্লাফি এখানেই স্পষ্ট রূপান্তরগুলি আসবে needed তাদের প্রয়োজন হবে কিনা তা বাস্তবায়নের বিশদর উপর নির্ভর করে (এ কারণেই এটি নির্বোধ ধারণা)।
আগ্রহী

0

সংজ্ঞা দেওয়ার একটি উপায় orহ'ল লুক টেবিলের মাধ্যমে। আমরা এটি সুস্পষ্ট করতে পারি:

bool Or( bool a, bool b } {
  bool retval[] = {b,true}; // or {b,a};
  return retval[a];
}

আমরা মানগুলি সহ একটি অ্যারে তৈরি করি যা কিসের উপর নির্ভর করে ফেরতের মান হওয়া উচিত a। তারপরে আমরা একটি অনুসন্ধান করি। সি ++ ভাষার মত সালে boolএকটি মান যে সঙ্গে, একটি বিন্যাস সূচক হিসেবে ব্যবহার করা যেতে পারে প্রচার trueহচ্ছে 1এবং falseহচ্ছে 0

এরপরে আমরা এটি অন্যান্য যৌক্তিক ক্রিয়ায় প্রসারিত করতে পারি:

bool And( bool a, bool b } {
  bool retval[] = {false,b}; // or {a,b};
  return retval[a];
}
bool Xor( bool a, bool b } {
  bool retval[] = {b,!b};
  return retval[a];
}

এখন এই সমস্তগুলির একটি খারাপ দিক এটির জন্য উপসর্গের স্বরলিপি প্রয়োজন।

namespace operators {
  namespace details {
    template<class T> struct is_operator {};
    template<class Lhs, Op> struct half_expression { Lhs&& lhs; };
    template<class Lhs, class Op>
    half_expression< Lhs, Op > operator*( Lhs&&lhs, is_operator<Op> ) {
      return {std::forward<Lhs>(lhs)};
    }
    template<class Lhs, class Op, class Rhs>
    auto operator*( half_expression<Lhs, Op>&& lhs, Rhs&& rhs ) {
    return invoke( std::forward<Lhs>(lhs.lhs), Op{}, std::forward<Rhs>(rhs) );
    }
  }
  using details::is_operator;
}

struct or_tag {};
static const operators::is_operator<or_tag> OR;

bool invoke( bool a, or_tag, bool b ) {
  bool retval[] = {b,true};
  return retval[a];
}

এবং এখন আপনি টাইপ করতে পারেন true *OR* falseএবং এটি কাজ করে।

উপরের কৌশলটিতে এমন একটি ভাষা প্রয়োজন যা আর্গুমেন্ট নির্ভর নির্ভরতা এবং টেমপ্লেট সমর্থন করে। আপনি সম্ভবত জেনারিকস এবং এডিএল দিয়ে কোনও ভাষায় এটি করতে পারেন।

একদিকে যেমন আপনি *OR*সেটগুলি নিয়ে কাজ করতে উপরেরটি প্রসারিত করতে পারেন । কেবল invokeএকই নেমস্পেসে একটি ফ্রি ফাংশন তৈরি করুন or_tag:

template<class...Ts>
std::set<Ts...> invoke( std::set<Ts...> lhs, or_tag, std::set<Ts...> const& rhs ) {
  lhs.insert( rhs.begin(), rhs.end() );
  return lhs;
}

এবং এখন set *OR* setদুজনের মিলন ফিরিয়ে দেয়।


0

এটি আমার চরিত্রবাদী কার্যাদি স্মরণ করে:

or(a, b)
    return a + b - a*b

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

False::or(a)
    return a

True::or(a)
    return self

এবং এর জন্য দ্বৈত পদ্ধতি বিদ্যমান:

False::and(a)
    return self

True::and(a)
    return a

সুতরাং "যুক্তি" অপার বিবৃতিতে পুরোপুরি বৈধ, ভেবেছি এটি ভার্জোজ। সাবধান, এটি খারাপ নয়। আপনার যদি এমন কোনও ফাংশন প্রয়োজন হয় যা গাণিতিক অপারেটরের মতো কাজ করে, বলুন, এক ধরণের ম্যাট্রিক্সের উপর ভিত্তি করে কাজ করে। অন্যরা একটি আসল কিউব বাস্তবায়িত করবে (যেমন একটি কুইন-ম্যাকক্লাসকি বিবৃতি):

or = array[2][2] {
    {0, 1},
    {1, 1}
}

এবং আপনি মূল্যায়ন করবেন বা [এ] [খ]

সুতরাং হ্যাঁ, এখানে প্রতিটি যুক্তিই বৈধ (ইন-ল্যাঙ্গুয়েজ বা অপারেটর এক্সডিডিডিডিডিডিডিডি ব্যবহার করে পোস্ট করা ব্যতীত)।

তবে আমার প্রিয়টি হ'ল ডি মরগানের আইন: !(!a && !b)


0

সুইফট মান গ্রন্থাগার তাকান এবং শর্টকাট এবং শর্টকাট এবং অপারেশন, যার মধ্যে তাদের বাস্তবায়ন খুঁজে বার করো না প্রয়োজনে দ্বিতীয় operands মূল্যায়ন / অনুমোদিত।


-2

যুক্তি পুরোপুরি সঠিক, তবে সরলীকৃত করা যেতে পারে:

or(arg1, arg2)
  if arg1 = True
     return True
  else if arg2 = True
     return True
  else
     return False

এবং সম্ভবত আপনার ভাষার একটি ওআর অপারেটর রয়েছে - যদি না এটি প্রশ্নের চেতনাবিরোধী হয় - কেন না

or(arg1, arg2)
  if arg1 = True or arg2 = True
     return True
  else
     return False

if arg1 = True or arg2 = True { return true } else { return false }আরও ভাল return arg1 = True or arg2 = True,। if condition then true else falseঅপ্রয়োজনীয়।
ডোভাল

4
প্রশ্নকর্তা বিশেষভাবে উল্লেখ করেছিলেন যে তাদের প্রয়োজনীয়তা "অপারেটর নিজেই ব্যবহার না করেই"
gnat

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