سؤال

لدي ثلاثة قيم منطقية A، B و C. أحتاج إلى كتابة بيان إذا كان سيتم تنفيذه إذا وفقط إذا لم يكن هناك أكثر من واحدة من هذه القيم صحيحة. وبعبارة أخرى، ها هي جدول الحقيقة:

 A | B | C | Result
---+---+---+--------
 0 | 0 | 0 |   1
 0 | 0 | 1 |   1
 0 | 1 | 0 |   1
 0 | 1 | 1 |   0
 1 | 0 | 0 |   1
 1 | 0 | 1 |   0
 1 | 1 | 0 |   0
 1 | 1 | 1 |   0

ما هي أفضل طريقة لكتابة هذا؟ أعلم أنني أستطيع تعداد جميع الاحتمالات، ولكن هذا يبدو ... Verbose للغاية. : P.

وأضاف: كان لديه فكرة واحدة فقط:

! (A && B) &&! (B && C) &&! (A && C)

هذه الشيكات أنه لم يتم تعيين قيمتين. الاقتراح حول المبالغ على ما يرام أيضا. حتى أكثر قراءة ربما ...

(أ؟ 1: 0) + (ب؟ 1: 0) + (ج؟ 1: 0) <= 1

PS هذا هو لرمز الإنتاج، لذلك أنا ذاهب لقراءة التعليمات البرمجية أكثر من الأداء.

وأضاف 2: الإجابة المقبولة بالفعل، ولكن بالنسبة للفضولين - إنه ج #. :) السؤال هو الكثير من اللغات غير الملحد على الرغم من.

هل كانت مفيدة؟

المحلول

ماذا عن علاجها كعدد صحيح و 0، والتحقق من أن مجموعهم يساوي 1؟

تعديل:

الآن بعد أن نعرف أنه C # .NET، أعتقد أن الحل الأكثر قراءة سيبدو إلى حد ما

public static class Extensions
{
    public static int ToInt(this bool b)
    {
        return b ? 1 : 0;
    }
}

ما سبق مدسوس بعيدا في مكتبة فئة (appcode؟) حيث لا يتعين علينا رؤيته، ومع ذلك يمكن الوصول إليه بسهولة (CTRL + انقر في R #، على سبيل المثال) ثم يكون التنفيذ ببساطة:

public bool noMoreThanOne(params bool[] bools) 
{ 
    return bools.ToList().Sum(b => b.ToInt()) <= 1; 
}

...

bool check = noMoreThanOne(true, true, false, any, amount, of, bools);

نصائح أخرى

أنت شلب تعرف نفسك خرائط كارنو. وبعد غالبا ما يتم تطبيق المفهوم على الإلكترونيات ولكنه مفيد للغاية هنا أيضا. إنه سهل للغاية (يعتقد تفسير ويكيبيديا لا يبدو طويلا - إنه دقيق).

(XOR B XOR C) أو لا (A أو B أو C)

تحرير: كما هو مدبب به Vilx، هذا ليس صحيحا.

إذا كانت أ و ب كلاهما 1، و C هو 0، فإن XOR B سيكون 0، ستكون النتيجة الإجمالية 0.

ماذا عن: ليس (A و B) وليس (A و C) وليس (B و C)

إذا قمت بتحويل المنطق، فأنت تريد أن تكون الشرط كاذبة إذا كان لديك أي زوج من المنطمنون الذين أصبحوا صحيحين:

if (! ((a && b) || (a && c) || (b && c))) { ... }

لشيء مختلف تماما، يمكنك وضع المنطمنون في صفيف وعدد عدد القيم الحقيقية الموجودة:

if ((new bool[] { a, b, c }).Where(x => x).Count() <= 1) { ... }

سأذهب لأقصى قدر من إمكانية الصيانة والقراءة.

static bool ZeroOrOneAreTrue(params bool[] bools)
{
    return NumThatAreTrue(bools) <= 1;
}

static int NumThatAreTrue(params bool[] bools)
{
    return bools.Where(b => b).Count();
}

هناك العديد من الإجابات هنا، ولكن لدي واحدة أخرى!

a ^ b ^ c ^ (a == b && b == c)

طريقة عامة للعثور على الحد الأدنى من التعبير منطقية للحصول على جدول الحقيقة المعطى هو استخدام خريطة كارنو:

http://babbage.cs.qc.cc.edu/courses/minimize/

هناك العديد من الحد الأدنى عبر الإنترنت على الويب. يجد الواحد هنا (مرتبطا من المقالة، إنه باللغة الألمانية، على الرغم من) التعبير التالي:

(! A &&! B) || (! A &&! C) || (! B &&! ج)

إذا كنت تسير لقراءة التعليمات البرمجية، فمن المحتمل أن أذهب مع فكرة "المبلغ <= 1". احرص على أنه ليس كل اللغات ضمان كاذبة == 0 وحقيقي == 1 - ولكن من المحتمل أن تكون على دراية بهذا منذ العناية به في حلك الخاص.

جيد ol 'منطق:

+ = OR
. = AND

R = Abar.Bbar.Cbar + Abar.Bbar.C + Abar.B.Cbar + A.Bbar.Cbar
  = Abar.Bbar.(Cbar + C) + Abar.B.Cbar + A.Bbar.Cbar
  = Abar.Bbar + Abar.B.Cbar + A.Bbar.Cbar
  = Abar.Bbar + CBar(A XOR B)
  = NOT(A OR B) OR (NOT C AND (A XOR B))

خذ التلميح وتبسيط المزيد إذا كنت تريد.

و نعم، احصل على نفسك على دراية بخرائط كارنو

يعتمد ما إذا كنت تريد شيئا من السهل فهم ما تحاول القيام به، أو أي شيء بسيط منطقيا كما يمكن أن يكون. يقوم أشخاص آخرون بنشر إجابات بسيطة منطقية، لذلك هنا واحد حيث يكون أكثر وضوحا ما يحدث (وما ستكون هذه النتيجة لمختلف المدخلات):

  def only1st(a, b, c):
    return a and not b and not c

  if only1st(a, b, c) or only1st(b, a, c) or only1st(c, a, b):
    print "Yes"
  else:
    print "No"

أحب حل الإضافة، لكن إليك الاختراق للقيام بذلك مع حقول بت أيضا.

inline bool OnlyOneBitSet(int x)
{
    // removes the leftmost bit, if zero, there was only one set.
    return x & (x-1) == 0;
}

// macro for int conversion
#define BOOLASINT(x) ((x)?1:0)

// turn bools a, b, c into the bit field cba
int i = (BOOLASINT(a) << 0) | BOOLASINT(b) << 1 | BOOLASINT(c) << 2;

if (OnlyOneBitSet(i)) { /* tada */ }

عرض رمز محلول D'S:

int total=0;
if (A) total++;
if (B) total++;
if (C) total++;

if (total<=1) // iff no more than one is true.
{
    // execute

}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top