روش های جنگیدن با کدی که Accept نمی شه!

ارسال ها
143
لایک ها
79
امتیاز
0
#1
سلام .
از اونجایی که بعضی وقتها Accept کردن کد می تونه اشک آدم رو در بیاره و کلا باعث پیر شدن آدم بشه , باید یاد بگیرید که چطور می شه با کد کلنجار رفت و سرانجام پیروز شد !
انشاالله اگه این نکات رو رعایت کنید کد هاتون First time Ac می شن :D


1. نوشتن Debug info


نوشتن Debug info اولین کاری یه که باید بعد از Wrong خوردن برنامه تون بکنید . این کار به این صورت است که در قسمت های مختلف برنامه تون , مقادیر متغیر ها رو چک می کنید (بوسیله چاپ کردن اون ها) و می فهمید که برنامه تون تا اونجا درست کار کرده یا خیر .
برای اینکه این مقادیر چاپ شده از یه جریان (Stream) دیگه خارج بشن و با اطلاعاتی که برنامه تون چاپ می کنه ترکیب نشن , موقع نوشتن Debug info به جای cout << ..... می نویسیم cerr << .... که این cerr همون خروجی error ماست . (نوشتن cerr هزار تا خوبی داره , حتما برای نوشتن debug info , از cerr استفاده کنید)
مثلا این یه تیکه از یه برنامه ای بود که با نوشتن cerr مشکلش رفع شد و Accept شد
کد
int main() {
	cin >> n >> m;
	gen(1);
	
//	for (int i = 0; i < (1<<m); i++)
//		for (int j = 0; j < (1<<m); j++)
//			cerr << "s["<<B(i)<<"]["<<B(j)<<"] : " << s[I][j] << endl;
	
	d[0][(1<<m) - 1] = 1;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < (1<<m); j++)
			if (d[I][j])
			{
				int temp = j ^ ( (1<<m) - 1);
//				cerr << "HERE for j : " << B(j) << " and temp : " << B(temp) << endl;
				for (int k = 0; k < (1<<m); k++)
					d[i+1][k] += d[I][j] * s[temp][k];
			}
//	for (int i = 0; i <= n; i++)
//		for (int j = 0; j < (1<<m); j++)
//			if (d[I][j])
//				cerr << "d["<<i<<"]["<<B(j)<<"] : " << d[I][j] << endl;
	cout << d[n][(1<<m) - 1] << endl;
	return 0;
}
[/I][/I][/I][/I][/I]

 

Olympiad

New Member
ارسال ها
1,268
لایک ها
134
امتیاز
0
#2
دستتون درد نكنه !!! اون gen كه اول كد نوشتيد چي هست!!!!!!؟؟؟
بعدش اين كه
1<<m
يعني چي!!!!!!!؟؟؟؟
ممنون
 
ارسال ها
143
لایک ها
79
امتیاز
0
#3
gen یه تابعی بود که برای اون مسئله ازش استفاده می کردم :D (شما به cerr ها باید دقت می کردید !)


حالا برسیم به قسمت دوم
2. نوشتن Generator برای ساختن تست های تصادفی
خوب در این قسمت فرض می کنیم که شما یک برنامه a.exe دارید که مطمئن هستید درست کار می کنه و همچنین یه برنامه b.exe دارید که می خواهید آزمایشش کنید . برای ساختن تست های تصادفی نیاز به نوشتن یه کد کوچولو به نام Generator دارید .
چیز هایی که توی نوشتن generator مهم هستند رو می گم .
1. include کردن cstdlib برای استفاده از rand و ...
2. نوشتن srand(time(0)) در کد generator تون : این دستور باعث می شه که اعداد تولیدی برنامه شما در هر دفعه که اجرا می شن متفاوت باشند و اگر این دستور رو ننویسید , هر بار Generator شما یکسری عدد رو چاپ می کنه
یه مثال بزنم که کاملا واضح بشه :
می خواهیم یه برنامه بنویسیم که یه گراف کاملا random در خروجی چاپ کنه (مثلا طبق صورت سوال , تعداد راس ها (n) از 1000000 و تعداد یال ها از 1000 بیشتر نیست )
کد
#include <iostream>
#include <cstdlib>
using namespace std;

int main() {
	srand(time(0));
	int n, m;
	n = rand() % 1000000 + 1;
	m = rand() % 1000;
	cout << n << " " << m << endl;
	for (int i = 0; i < m; i++)
		cout << rand() % n + 1 << " " << rand() % n + 1 << endl;
	return 0;
}
حالا هر دفعه که gen.exe رو اجرا کنید , ابتدا تعداد راس ها و یال ها و در خط های بعدی دو راس که دو سر یک یال هستند رو این برنامه چاپ می کنه .
حالا می مونه توضیح این مطلب که چطوری می شه خروجی یه برنامه رو توی یه فایل ریخت و یا ورودی رو از یه فایل خوند و ... که انشاالله توضیح خواهم داد
 

Goharshady

New Member
ارسال ها
2,239
لایک ها
166
امتیاز
0
#4
آقای جلال منش من کاملا به این امضای زیبای شما معتقدم ولی هیچ وقت حوصله ی نوشتن generator را نداشته ام. همیشه چند تا test case خودم درست می کنم چند تا هم که سوال داده و به همین ها اکتفا می کنم. درسته که برای اطمینان از درست بودن کد باید generator نوشت ولی واقعا سر جلسه ی آزمون وقت ـ بخوانید حال و حوصله ـ این کار را ندارم.
 
ارسال ها
143
لایک ها
79
امتیاز
0
#5
دقیقا ! من خودم سر فاینال یه دونه تستر ننوشتم (ولی حالا که فکر می کنم باید می نوشتم) , نباید توی این امتحان ها بخاطر تنبلی انقدر ریسک کرد .

حالا شما هم برای امتحان های بعدی یه تستر کوچیک بنویسید (البته بعید می دونم بنویسید!) ولی کلا کار خوبیه دیگه . لااقل کد رو با دقت بخونید دوباره .

سر همین خوندن دوباره کد من نجات یافتم از از دست دادن 60 یا 70 نمره :D
 

rezashiri

Well-Known Member
ارسال ها
1,458
لایک ها
325
امتیاز
83
#6
navidjalalmanesh گفت
دقیقا ! من خودم سر فاینال یه دونه تستر ننوشتم (ولی حالا که فکر می کنم باید می نوشتم) , نباید توی این امتحان ها بخاطر تنبلی انقدر ریسک کرد .

حالا شما هم برای امتحان های بعدی یه تستر کوچیک بنویسید (البته بعید می دونم بنویسید!) ولی کلا کار خوبیه دیگه . لااقل کد رو با دقت بخونید دوباره .

سر همین خوندن دوباره کد من نجات یافتم از از دست دادن 60 یا 70 نمره :D
مگه سر جلسه هم میشه تستر نوشت!؟!

مگه جواب های درستو می دونید با چه برنامه ای بدست می آد؟!؟
 

Goharshady

New Member
ارسال ها
2,239
لایک ها
166
امتیاز
0
#7
navidjalalmanesh گفت
دقیقا ! من خودم سر فاینال یه دونه تستر ننوشتم (ولی حالا که فکر می کنم باید می نوشتم) , نباید توی این امتحان ها بخاطر تنبلی انقدر ریسک کرد .

حالا شما هم برای امتحان های بعدی یه تستر کوچیک بنویسید (البته بعید می دونم بنویسید!) ولی کلا کار خوبیه دیگه . لااقل کد رو با دقت بخونید دوباره .

سر همین خوندن دوباره کد من نجات یافتم از از دست دادن 60 یا 70 نمره :D

می دونم که حق با شماست ولی واقعا حسش نیست
 

Goharshady

New Member
ارسال ها
2,239
لایک ها
166
امتیاز
0
#8
rezashiri گفت
navidjalalmanesh گفت
دقیقا ! من خودم سر فاینال یه دونه تستر ننوشتم (ولی حالا که فکر می کنم باید می نوشتم) , نباید توی این امتحان ها بخاطر تنبلی انقدر ریسک کرد .

حالا شما هم برای امتحان های بعدی یه تستر کوچیک بنویسید (البته بعید می دونم بنویسید!) ولی کلا کار خوبیه دیگه . لااقل کد رو با دقت بخونید دوباره .

سر همین خوندن دوباره کد من نجات یافتم از از دست دادن 60 یا 70 نمره :D
مگه سر جلسه هم میشه تستر نوشت!؟!

مگه جواب های درستو می دونید با چه برنامه ای بدست می آد؟!؟

فرض کنید یک الگوریتم کاملا درست با O(n[SUP]4[/SUP]) دارید و یک الگوریتم دیگه که پیاده سازی سخت تری داره و امکان جوب خوردنش بیشتره ولی خطیه. اونوقت می تونید برای تست دومی از اولی استفاده کنید.
 

Olympiad

New Member
ارسال ها
1,268
لایک ها
134
امتیاز
0
#9
O(n^4) يعني چي؟؟؟؟راجع به زمان الگوريتم هست!!!؟؟؟؟
 
ارسال ها
143
لایک ها
79
امتیاز
0
#10
rezashiri گفت
navidjalalmanesh گفت
دقیقا ! من خودم سر فاینال یه دونه تستر ننوشتم (ولی حالا که فکر می کنم باید می نوشتم) , نباید توی این امتحان ها بخاطر تنبلی انقدر ریسک کرد .

حالا شما هم برای امتحان های بعدی یه تستر کوچیک بنویسید (البته بعید می دونم بنویسید!) ولی کلا کار خوبیه دیگه . لااقل کد رو با دقت بخونید دوباره .

سر همین خوندن دوباره کد من نجات یافتم از از دست دادن 60 یا 70 نمره :D
مگه سر جلسه هم میشه تستر نوشت!؟!

مگه جواب های درستو می دونید با چه برنامه ای بدست می آد؟!؟


ببینید , سوال های المپیاد معمولا یه الگوریتم بدیهی دارند که توی
به دست می یاد ولی اگه همون رو بفرستید مثلا 30 نمره بیشتر نمی گیرید (محدود زمان رو نقض می کنه) . حالا کد جدیدتون که
هست (و خوب Accept می شه اگه درست باشه!) رو با اون قدیمی یه تست می کنید .

یه حالتم اینه که یه کد دیگه به نام Judge می نویسید که خروجی برنامه رو چک کنه (مثلا سوال گفته بزرگترین مجموعه مستقل رو چاپ کنید , بعد Judge شما می یاد ورودی سوال و جواب شما رو می خونه و اگه خروجی تون مجموعه مستقل نبود Wrong می ده) .
 
ارسال ها
143
لایک ها
79
امتیاز
0
#11
سلام علیکم !
خوب می رسیم به این موضوع که چطوری در cmd خروجی رو تو فایل بریزیم یا ورودی رو از فایل بخونیم ؟

3. دستورات CMD


اولا اگه نمی دونید cmd کلا چیه که خیلی بده! توی run کامپیوترتون بنویسید cmd بعدش یه صفحه سیاه می یاد که می تونید توش دستورات خاصی رو بنویسید (فرض می کنم که کار کردن با cmd را در حد ابتدایی بلد باشید! , اگه بلد نیستید توی CMD یه help بنویسید و یه سری توضیحات می یاد براتون . کلا اولین دستوری که باید یاد بگیرید و من بهتون می گم دستور cd به معنی Change directory است که برای عوض کردن پوشه و رفتن به پوشه های مختلف ازش استفاده می کنید . دیگه اگه بخوام زیاد توضیح بدم طولانی می شه و از حوصله بحث خارج! )
خوب حالا وارد پوشه برنامه تون شدید , فرض کنید که می خواهید خروجی برنامه تون رو توی فایل output.txt بریزید .
اگه توی cmd به صورت عادی بنویسید a.exe (فرض کنیم اسم برنامه تون a باشه) . اونوقت بعد از خوندن ورودی , خروجی رو نیز تو همون صفحه چاپ می کنه .
اما اگه این رو بنویسید , بعد از وارد کردن ورودی , خروجی رو توی فایل output.txt می ریزه (فقط جریان cout توی فایل output.txt ریخته می شه)
کد
a.exe >output.txt
خوب حالا چون خروجی ریختن توی فایل به اون صورت بود , پس به نظرتون ورودی خوندن از فایل چطوره؟ آفرین! درسته!
کد
a.exe <input.txt
خوب . حالا پیچیده تر می کنیم قضیه رو ! ورودی خوندن از فایل input.txt و خروجی نوشتن در output.txt .
کد
a.exe <input.txt >output.txt
برای چاپ کردن خروجی error توی یه فایل می تونید از دستور زیر استفاده کنید :
کد
a.exe 2>error.txt
برای مقایسه بین دو فایل متنی هم می تونید از دستور fc استفاده کنید , به این صورت که اگر دو فایل 1.txt , 2.txt بخوان با هم مقاسیه بشن می نویسید :
کد
fc 1.txt 2.txt
و در صورتی که مشابه بودند خروجی fc اینه :
کد
Comparing files 1.txt and 2.txt
FC: no differences encountered
. همچنین برای اجرای چند دستور در یک خط از دستور && استفاده کنید (دیگه مثال نمی خواد!)
حالا فرض کنید برنامه هامون gen.exe (سازنده تست های تصادفی) , a.exe (برنامه که می دونیم درسته) , b.exe (برنامه ای که می خواهیم آزمایش کنیم( باشند .
در این صورت با این دستور ساده(!) می توانید برنامه تون رو Judge کنید :
کد
gen.exe >test.txt && a.exe <test.txt > ans_a.txt && b.exe <test.txt >ans_b.txt && fc ans_a.txt ans_b.txt
فکر کنم کافی باشه دیگه, اگه سوالی بود بفرمایید .
 

Goharshady

New Member
ارسال ها
2,239
لایک ها
166
امتیاز
0
#12
دستت درد نکنه! من واقعا اینها رو نمی دونستم. البته من همه ی این کارها را با bash در linux انجام می دادم. خیلی شبیه به هم هستند. فقط به جای fc باید بنویسیم diff بقیه اش دقیقا مثل لینوکسه
 

rezashiri

Well-Known Member
ارسال ها
1,458
لایک ها
325
امتیاز
83
#13
navidjalalmanesh گفت
output.txt .
کد
a.exe <input.txt >output.txt
توی این قسمت فقط تست اولی رو چاپ می کنه که... .

چی کار کنم؟!؟
 

rezashiri

Well-Known Member
ارسال ها
1,458
لایک ها
325
امتیاز
83
#15

Goharshady

New Member
ارسال ها
2,239
لایک ها
166
امتیاز
0
#17
rezashiri گفت
navidjalalmanesh گفت
output.txt .
کد
a.exe <input.txt >output.txt
توی این قسمت فقط تست اولی رو چاپ می کنه که... .

چی کار کنم؟!؟

یه فایل .bat بساز بعد با notepad ادیتش کن و دستورات رو به ترتیب توش بنویس. مثلا همون دستور بالا با چندتا فایل ورودی ــ برای هر تست یکی ـــ
بعد تو cmd به جایی برو که فایل bat رو ساختی ــمعمولا همون جایی که بقیه ی فایلها هست ـــ و اون فایل bat رو اجرا کن. اجرا کردنش هم که کاری نداره. فقط اسمشو می نویسی!
 

Goharshady

New Member
ارسال ها
2,239
لایک ها
166
امتیاز
0
#18

rezashiri

Well-Known Member
ارسال ها
1,458
لایک ها
325
امتیاز
83
#19
Goharshady گفت
rezashiri گفت
navidjalalmanesh گفت
output.txt .
کد
a.exe <input.txt >output.txt
توی این قسمت فقط تست اولی رو چاپ می کنه که... .

چی کار کنم؟!؟

یه فایل .bat بساز بعد با notepad ادیتش کن و دستورات رو به ترتیب توش بنویس. مثلا همون دستور بالا با چندتا فایل ورودی ــ برای هر تست یکی ـــ
بعد تو cmd به جایی برو که فایل bat رو ساختی ــمعمولا همون جایی که بقیه ی فایلها هست ـــ و اون فایل bat رو اجرا کن. اجرا کردنش هم که کاری نداره. فقط اسمشو می نویسی!
میشه با مثال توضیح بدید
 

Goharshady

New Member
ارسال ها
2,239
لایک ها
166
امتیاز
0
#20
مثلا برای ۲ تا تست یک فایل bat بسازید و توش بنویسید:
کد
@echo off
echo Test1
a.exe<input1.txt>output1.txt
fc output1.txt ok1.txt
echo Test2
a.exe<input2.txt>output2.txt
fc output2.txt ok2.txt
echo end of testing
echo یک متن می نویسد.
فرض کنید فایل های input و ok که به ترتیب شامل ورودی ها و خروجی مورد نظر هستند قبلا ساخته شده اند!
حالا کافیه این فایل رو اجرا کنید.
 
بالا