টি এল: ডিআর; আপনার কোডটি ইতিমধ্যে সঠিক এবং "পরিষ্কার"।
আমি দেখতে পেয়েছি প্রচুর লোক উত্তরের চারপাশে ঝাঁপিয়ে পড়েছে তবে প্রত্যেকে গাছের মধ্যে দিয়ে বন মিস করছে। আসুন এই প্রশ্নটি সম্পূর্ণরূপে বুঝতে সম্পূর্ণ কম্পিউটার বিজ্ঞান এবং গাণিতিক বিশ্লেষণ করি।
প্রথমত, আমরা নোট করি যে আমাদের 3 টি ভেরিয়েবল রয়েছে, প্রতিটিতে 3 টি রাষ্ট্র রয়েছে: <, =, বা>। আদেশের মোট সংখ্যা 3 ^ 3 = 27 টি রাজ্য, যা আমি প্রতিটি রাজ্যের জন্য একটি অনন্য সংখ্যা, পি # হিসাবে চিহ্নিত করব assign এই পি # নম্বরটি একটি ফ্যাকটোরিয়াল নম্বর সিস্টেম ।
আমাদের কাছে থাকা সমস্ত অনুমতি গণনা করা:
a ? b | a ? c | b ? c |P#| State
------+-------+-------+--+------------
a < b | a < c | b < c | 0| C
a = b | a < c | b < c | 1| C
a > b | a < c | b < c | 2| C
a < b | a = c | b < c | 3| impossible a<b b<a
a = b | a = c | b < c | 4| impossible a<a
a > b | a = c | b < c | 5| A=C > B
a < b | a > c | b < c | 6| impossible a<c a>c
a = b | a > c | b < c | 7| impossible a<c a>c
a > b | a > c | b < c | 8| A
a < b | a < c | b = c | 9| B=C > A
a = b | a < c | b = c |10| impossible a<a
a > b | a < c | b = c |11| impossible a<c a>c
a < b | a = c | b = c |12| impossible a<a
a = b | a = c | b = c |13| A=B=C
a > b | a = c | b = c |14| impossible a>a
a < b | a > c | b = c |15| impossible a<c a>c
a = b | a > c | b = c |16| impossible a>a
a > b | a > c | b = c |17| A
a < b | a < c | b > c |18| B
a = b | a < c | b > c |19| impossible b<c b>c
a > b | a < c | b > c |20| impossible a<c a>c
a < b | a = c | b > c |21| B
a = b | a = c | b > c |22| impossible a>a
a > b | a = c | b > c |23| impossible c>b b>c
a < b | a > c | b > c |24| B
a = b | a > c | b > c |25| A=B > C
a > b | a > c | b > c |26| A
পরিদর্শন দ্বারা আমরা দেখতে পেয়েছি:
- 3 রাষ্ট্র যেখানে A সর্বাধিক,
- 3 রাজ্য যেখানে বি সর্বোচ্চ,
- 3 রাজ্য যেখানে সি সর্বোচ্চ, এবং
- ৪ টি রাজ্য যেখানে A = B, বা B = C হয়।
আস, এ, বি এবং সি এর মান সহ এই সমস্ত অনুমিতি গণনা করতে একটি প্রোগ্রাম লিখি (পাদটীকা দেখুন) পি # দ্বারা স্থিতিশীল বাছাই:
a ?? b | a ?? c | b ?? c |P#| State
1 < 2 | 1 < 3 | 2 < 3 | 0| C
1 == 1 | 1 < 2 | 1 < 2 | 1| C
1 == 1 | 1 < 3 | 1 < 3 | 1| C
2 == 2 | 2 < 3 | 2 < 3 | 1| C
2 > 1 | 2 < 3 | 1 < 3 | 2| C
2 > 1 | 2 == 2 | 1 < 2 | 5| ??
3 > 1 | 3 == 3 | 1 < 3 | 5| ??
3 > 2 | 3 == 3 | 2 < 3 | 5| ??
3 > 1 | 3 > 2 | 1 < 2 | 8| A
1 < 2 | 1 < 2 | 2 == 2 | 9| ??
1 < 3 | 1 < 3 | 3 == 3 | 9| ??
2 < 3 | 2 < 3 | 3 == 3 | 9| ??
1 == 1 | 1 == 1 | 1 == 1 |13| ??
2 == 2 | 2 == 2 | 2 == 2 |13| ??
3 == 3 | 3 == 3 | 3 == 3 |13| ??
2 > 1 | 2 > 1 | 1 == 1 |17| A
3 > 1 | 3 > 1 | 1 == 1 |17| A
3 > 2 | 3 > 2 | 2 == 2 |17| A
1 < 3 | 1 < 2 | 3 > 2 |18| B
1 < 2 | 1 == 1 | 2 > 1 |21| B
1 < 3 | 1 == 1 | 3 > 1 |21| B
2 < 3 | 2 == 2 | 3 > 2 |21| B
2 < 3 | 2 > 1 | 3 > 1 |24| B
2 == 2 | 2 > 1 | 2 > 1 |25| ??
3 == 3 | 3 > 1 | 3 > 1 |25| ??
3 == 3 | 3 > 2 | 3 > 2 |25| ??
3 > 2 | 3 > 1 | 2 > 1 |26| A
আপনি যদি ভাবছিলেন যে আমি কীভাবে জানি যে কোন # রাজ্যগুলি অসম্ভব, এখন আপনি জানেন। :-)
অর্ডার নির্ধারণের জন্য সর্বনিম্ন তুলনার সংখ্যা:
লগ 2 (27) = লগ (27) / লগ (2) = ~ 4.75 = 5 তুলনা
অর্থাত্ coredump সঠিক 5 ন্যূনতম সংখ্যার তুলনা করেছে। আমি তার কোডটি ফর্ম্যাট করব:
status_t index_of_max_3(a,b,c)
{
if (a > b) {
if (a == c) return DONT_KNOW; // max a or c
if (a > c) return MOSTLY_A ;
else return MOSTLY_C ;
} else {
if (a == b) return DONT_KNOW; // max a or b
if (b > c) return MOSTLY_B ;
else return MOSTLY_C ;
}
}
আপনার সমস্যার জন্য আমরা সমতার জন্য পরীক্ষার বিষয়ে চিন্তা করি না তাই আমরা 2 টি পরীক্ষা বাদ দিতে পারি।
কোডটি যদি খুব পরিষ্কার / খারাপ হয় তবে এটির ভুল উত্তর না পেলে এটি একটি ভাল লক্ষণ যে আপনি সমস্ত মামলা সঠিকভাবে পরিচালনা করছেন!
পরবর্তী, সরলতার জন্য, লোকেরা উত্তরটি "উন্নত" করার চেষ্টা চালিয়ে যায়, যেখানে তারা মনে করে উন্নতির অর্থ তুলনা সংখ্যার "অনুকূলকরণ", তবে এটি আপনি যা জিজ্ঞাসা করছেন তা কঠোর নয়। আপনি যেখানে জিজ্ঞাসা করেছেন "সবাইকে আরও ভাল হতে পারে" বলে আপনি বিভ্রান্ত করেছেন কিন্তু 'আরও ভাল' অর্থ কী তা ব্যাখ্যা করেননি। কম তুলনা? কম কোড? সর্বোত্তম তুলনা?
আপনি যেহেতু কোড পাঠযোগ্যতার বিষয়ে জিজ্ঞাসা করছেন (যথাযথতা দেওয়া হয়েছে) আমি কেবল আপনার পাঠযোগ্যতার জন্য আপনার কোডে একটি পরিবর্তন করব: অন্যদের সাথে প্রথম পরীক্ষাটি সারিবদ্ধ করুন।
if (a > b && a > c)
status = MOSTLY_A;
else if (b > a && b > c)
status = MOSTLY_B;
else if (c > a && c > b)
status = MOSTLY_C;
else
status = DONT_KNOW; // a=b or b=c, we don't care
ব্যক্তিগতভাবে আমি এটি নিম্নলিখিত পদ্ধতিতে লিখতে চাই তবে এটি আপনার কোডিং মানগুলির জন্য খুব অপ্রচলিত হতে পারে:
if (a > b && a > c) status = MOSTLY_A ;
else if (b > a && b > c) status = MOSTLY_B ;
else if (c > a && c > b) status = MOSTLY_C ;
else /* a==b || b ==c*/status = DONT_KNOW; // a=b or b=c, we don't care
পাদটীকা: ক্রমানুসারে উত্পন্ন করার জন্য এখানে সি ++ কোড রয়েছে:
#include <stdio.h>
char txt[] = "< == > ";
enum cmp { LESS, EQUAL, GREATER };
int val[3] = { 1, 2, 3 };
enum state { DONT_KNOW, MOSTLY_A, MOSTLY_B, MOSTLY_C };
char descr[]= "??A B C ";
cmp Compare( int x, int y ) {
if( x < y ) return LESS;
if( x > y ) return GREATER;
/* x==y */ return EQUAL;
}
int main() {
int i, j, k;
int a, b, c;
printf( "a ?? b | a ?? c | b ?? c |P#| State\n" );
for( i = 0; i < 3; i++ ) {
a = val[ i ];
for( j = 0; j < 3; j++ ) {
b = val[ j ];
for( k = 0; k < 3; k++ ) {
c = val[ k ];
int cmpAB = Compare( a, b );
int cmpAC = Compare( a, c );
int cmpBC = Compare( b, c );
int n = (cmpBC * 9) + (cmpAC * 3) + cmpAB; // Reconstruct unique P#
printf( "%d %c%c %d | %d %c%c %d | %d %c%c %d |%2d| "
, a, txt[cmpAB*2+0], txt[cmpAB*2+1], b
, a, txt[cmpAC*2+0], txt[cmpAC*2+1], c
, b, txt[cmpBC*2+0], txt[cmpBC*2+1], c
, n
);
int status;
if (a > b && a > c) status = MOSTLY_A;
else if (b > a && b > c) status = MOSTLY_B;
else if (c > a && c > b) status = MOSTLY_C;
else /* a ==b || b== c*/status = DONT_KNOW; // a=b, or b=c
printf( "%c%c\n", descr[status*2+0], descr[status*2+1] );
}
}
}
return 0;
}
সম্পাদনাগুলি: প্রতিক্রিয়ার উপর ভিত্তি করে, টিএল: ডিআর শীর্ষে স্থানান্তরিত, অরক্ষিত টেবিল সরানো, 27 সাফ, কোড ক্লিন আপ, অসম্ভব অবস্থার বর্ণিত।