Friday, January 19, 2018

Sample Input/Output (I/O) for Programming contest (for beginners)

Programming contest বা Online OJ তে প্রব্লেম সাবমিট করার জন্য কিছু নিয়ম আছে। তার কিছু এখানে তুলে ধরা হলঃ

১। Main function int main() দিয়ে শুরু করা ভালো, void main() ব্যবহার করার চেয়ে। কোনো কোনো কম্পাইলার error দেয় void main() ব্যবহার করলে। কাজেই যেহেতু আমরা জানি না আমাদের কোড কোন কম্পাইলার এ চালানো হবে, কাজেই void main() ব্যবহার না করাই ভালো। প্রতি প্রোগ্রাম শেষে return 0; লিখা ভালো অভ্যাস।

২। প্রগ্রামিং কন্টেস্ট এ শুধু #include<conio.h> ব্যবহার করা যাবেনা। কাজেই clrscr(), getch() এসব ব্যবহার করা যাবে না।
C তে কোড করলে C99 এ যেসব header file সাপোর্ট করে সেসব ব্যবহার করা যাবে, কিন্তু যেহেতু #include স্ট্যান্ডার্ড header file না, তাই এটা লিখা যাবে না। String reverse এর ক্ষেত্রে কেউ যদি strrev ব্যবহার করে তাহলেও CE ( Compilation Error ) হবে,কারন এটাও C99 স্ট্যান্ডার্ড header file এর ফাংশন না। এরকম আরও অনেক কিছু আছে, এসব প্রোগ্রাম করতে করতে শিখা হবে। আর একটা কথা হচ্ছে কোন key word এর নাম ভুলেও variable নাম হিসাবে ব্যবহার করা যাবেনা, এতে প্রোগ্রাম run ই করবে না।

৩। কন্টেস্টের প্রশ্নে ইনপুট নেয়ার ক্ষেত্রে যদি কতবার ইনপুট নিতে হবে তা না বলা থাকে তাহলে scanf ("%d", &a) এর বদলে while(scanf("%d",&a)!=EOF ) ব্যবহার করতে হবে।
exp: problem: find a+b.
solve:
#include
int main () {
int a, b, sum;
while (scanf ("%d %d", &a, &b) != EOF) {
sum = a + b;
printf ("%d", sum);
printf ("\n");
}
return 0;
}

৪। new line এর ব্যাপারে সতর্ক থাকতে হবে।ঠিকমত লাইন প্রিন্ট করতে নয়া পারলে PE ( Presentation Error ) দিবে এবং প্রব্লেম এর আউটপুট এ ঠিক যেভাবে প্রিন্ট করতে বলা হবে একদম সেভাবেই প্রিন্ট করতে হবে, একটা দাড়ি, কমা ও কমবেশি দেয়া যাবেনা।

৫। প্রগ্রামিং কন্টেস্ট এর প্রশ্নে sample ইনপুট আউটপুট দেয়া থাকে। কিন্তু ওটা দেখেও অনেক সময় কিভাবে আউটপুট দিতে হবে বোঝা যায়না। যেমনঃ

Problem Description: I have a very simple problem for you.
Given two integers A and B, your job is to calculate the Sum of A + B.

Input: The first line of the input contains an integer T(1<=100). Then T lines follow each having two integers A & B.

Output: For each test case, you should output two lines. The first line is "Case #:", # means the number of the test case.
The second line is the an equation "A + B = Sum", Sum means the result of A + B. Note there are some spaces in the equation.
Output a blank line between two test cases.

Sample Input:
2
1 2
3 10

Sample Output:
Case 1:
1 + 2 = 3
Case 2:
3 + 10 = 13

( এখানে Case 1: দেয়ার পরে কোন space না দিয়ে একটা new line ( '\n' ) দিতে হবে। পরবর্তী লাইন এ 1 + 2 = 3 দিতে হবে অবশ্যই অর্থ্যাত ঠিকমত space দিতে হবে যেভাবে আউটপুট এ চাওয়া হয়েছে। প্রত্যেকটা আউটপুট এর পরে একটা করে new line দেয়া লাগবে। যদি বলা থাকে পরপর test case এর মাঝে blank line or new line দিতে হবে, তাহলে আরও একটা new line প্রিন্ট করতে হবে। আর সবার শেষ test case এর জন্য কোন blank line or extra new line প্রিন্ট করা যাবেনা )
কোড ঃ

#include
int main () {
int tc, t;
scanf ("%d", &t);
for (tc = 1; tc <= t; tc++){
int a, b;
scanf ("%d %d", &a, &b);
printf ("Case %d:\n%d + %d= %d\n", tc, a, b, (a + b));
if (tc < t) printf ("\n");   // Output a blank line between two test cases
}
return 0;
}


কিছু verdict সম্পর্কে লিখা হল। এগুলা UVA থেকে কপি পেস্ট করা :)


Accepted (AC) (and the CPU time & memory used): OK! Your program is correct!. Note that during true contest perhaps only 1 CPU minute will be allowed If your program spends a reasonable time, it may be ok, but this depends on the judge power in comparison with the true contest computers.

Presentation Error (PE): Your program outputs are correct but are not presented in the correct way. Check for spaces, justify, line feeds...

Accepted (P.E.): Same as above, but the Presentation Error is intended only for contests. The 24-hours judge takes it only as a warning. Don't worry a lot, since many of our problems have the output specification not very fine.

Wrong Answer (WA): Correct solution not reached for the inputs. The inputs and outputs that we use to test the programs are not public (it is recommendable to get accustomed to a true contest dynamic.

Crash - Run time Error (RTE): Your program failed during the execution (segmentation fault, floating point exception...). The exact cause is reported to the user.

Time Limit Exceeded (TLE): Your program tried to run during too much time; this error don't allows you to know if your program would reach the correct solution to the problem.

Memory Limit Exceeded (MLE): Your program tried to use more memory than the judge default settings. If you are sure that such problem needs more memory, please contact us.

Output Limit Exceeded (OLE): Your program tried to write too much information. This usually occurs if it goes into a infinite loop.

Restricted Function (RF): Your source program tried to use a not allowed function (such as fork(), fopen(), ...)

Compile Error (CE): The compiler (gcc/g++/gpc) could not compile your ANSI program. Of course, warning messages are not error messages. The compiler output messages are reported you by E-Mail.

Submission Error (SE): You don't specified correctly the @JUDGE_ID fields (a incorrect User ID, number of problem...).

Can't Be Judged (CJ): The judge hasn't test input and outputs for the selected problem. While choosing a problem be careful to ensure that the judge will be able to judge it!.

Access Denied (AD): Your Internet address is not allowed to submit problems. Maybe you have setup to accept programs only from your E-Mail address: edit and update your personal information in the Web. Otherwise, contact us.

Non Authenticated (NA): Your E-Mail is not authenticated or the submit tool did not sent authentication information. If you aren't a hacker, please contact us.

Out Of Contest Time (OC): this message can only appear during a contest, if a program is submitted out of contest time.

Delayed (DL): if the judge host is too busy, the execution of programs which spent too much resources (inside the allowed limits) is delayed by some seconds or minutes. Don't re-submit again your program (the judge would spent even more time before replying).

শেষ কথা ঃ
 কন্টেস্ট এ participate করলে অনেক কিছু শিখা হয়ে যাবে আপনাআপনি। প্রথম প্রথম অনেক ভুল হবে, কিন্তু আস্তে আস্তে সবকিছু ঠিক হয়ে যাবে। আমার একটা experience শেয়ার করি ঃ
আমি যখন ভার্সিটির ১.১ এ ছিলাম তখন আই ইউ টি ( IUT ) তে national ict fest এ আমার ২ বন্ধু নিয়ে কন্টেস্ট করতে যাই, পারতাম না কিছুই, খালি ভার্সিটি স্লট পাইছে, তাই গিয়েছিলাম -_- । যাহোক, ওইখানে গিয়ে ৫ ঘন্টা আমরা খালি সেলফি তুলছি, বাঁকা করে কী-বোর্ড এর পিক ও তুলছি,  ওইটা আবার অনেকদিন ফেইসবুক এর কভার পিক ও দিয়ে রাখছিলাম, যাহক, কন্টেস্ট এর টাইম এ একটা প্রব্লেম, যেইটা give away টাইপ প্রব্লেম ছিল ( give away : একদম বিগিনারদের পারার জন্য সবচেয়ে easy যেই প্রব্লেম দেয় ওইটা )। তো, ওইটা আমরা সুন্দর সল্ভ করলাম, সাবমিট দিলাম ,verdict আসলো RTE -_- । এরপরে আমরা আরও অনেকভাবে কোড করলাম, সবকিছু ওকে, কিন্তু সাবমিট দিলেই RTE। আসলে ভুল টা ছিল যে array এর সাইজ ১০^৭ পর্যন্ত হতে পারবে, আমরা main () ফাংশন এর ভিতরে ১০^৭ সাইজ এর অ্যাারে ডিক্লার করেছিলাম, কিন্তু এটা যদি গ্লোবালি ডিক্লার করতাম, তাইলেই AC পাইতো :( । তখন ও ক্লাস এ লোকাল গ্লোবাল ভ্যারিয়েবল ডিক্লার পড়ায় নাই,তাই ব্যাপারটা আসলে জানতাম না। পরে কন্টেস্ট শেষে শাকিল ভাইয়ার কাছে শুনার পরে নিজেকে বড় মাপের ছাগল মনে হইতেছিল। সবচেয়ে মজার ব্যাপার হল, আমরা প্রব্লেমটা সাবমিট দিছিলাম মোট ৩৯ বার এবং প্রত্যেকবার verdict ছিল RTE। আর সন্ধ্যায় পুরষ্কার দেবার সময় ( may be কায়কোবাদ স্যার ছিলেন, ঠিক মনে নাই ) আমাদের কথা উনি বলছিলেন যে "একটা টীম A নম্বর প্রব্লেমটা ৩৯ বার সাবমিট দিছে, তারা একদম শেষ পর্যন্ত সাবমিট দিয়ে গেছে, কন্টেস্ট এর মাঝে তাই হাল ছাড়তে নেই।" ( আমি তো লজ্জায় শক্ত হয়ে বসে ছিলাম না জানি টীম এর নাম বলেন , যাহোক উনি ভালো মানুষ, নাম বলেন নাই, আরো অনেক inspirational কথাবার্তা বলেছেন, ওইগুলা এখন আর মনে নাই :( )
কাজেই, আজকে ভুল করা মানে এই না যে আগামীতেও ভুল করবা, আমি ফাঁকিবাজ মানুষ, তাই ঠিকমত কন্টেস্ট continue করিনাই, কিন্তু তোমরা যারা নতুন, তারা আশা করি আমার মত ভুল করবা না :) ।

Best of luck and happy programming <3.

No comments:

Post a Comment