-
Notifications
You must be signed in to change notification settings - Fork 0
/
pc00.ms
115 lines (110 loc) · 4.84 KB
/
pc00.ms
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
.\" PSTITLE: NIT Wednesday Programming Problem \- PC00
.so pc__.ms
.nr fa.pg 0
.ds fa.cl "#3a8
.TL "مسئلهی برنامهنویسی \m[#8f4]چهارشنبه\&" "رقابت جدیدی با همکاری تیم فنی صد و یک نفرهی پنجشنبههای سخت\&" "میخواهیم بهترین باشیم..."
.sp 1
.LP
هیچ کس، حتی خوشبینترین عضو تیم فنی این رقابت هم تصور نمیکرد که
پنجشنبههای سخت در مدت پنج ماه تا این حد در جهان مطرح شود و
علاقمندان آن هر هفته را با انتظار برای فرا رسیدن پنجشنبه سپری کنند.
اما با توجه به هدفهای فصل یکم پنجشنبههای سخت، در ماههای
اخیر جای خالی رقابت دیگری
حس میشد تا در نهایت تیم فنی تصمیم گرفت که رقابت جدیدی را
برای پاسخ به این نیاز در کنار پنجشنبههای سخت پایهگذاری کند.
بنابراین، همزمان با شروع نیمسال جدید، مفتخر هستیم تا رقابت جدیدی
را با نام »مسئلهی برنامهنویسی چهارشنبه« معرفی کنیم؛
رقابتی که، با استناد بر پیشبینیها، بسیار پرشکوه برگزار میشود.
یکی از تفاوتهای این رقابت نسبت به پنجشنبههای سخت این است که
هر کسی میتواند مسئلههای این رقابت را طرح کند.
.PP
طرح سؤال در چهارشنبهها سه گام اصلی دارد:
گام اول فرستادن متن سؤال به سردبیر چهارشنبهها )\*[en [email protected]](،
گام دوم نوشتن برنامهای که نمونههای ورودی را تولید کند
و گام سوم نوشتن برنامهای که به خروجی مسئله امتیاز دهد.
در ادامهی این مستند، این سه گام برای یک مسئلهی نمونه نشان
داده میشوند.
.bp 1
.nr fa.pg 1
.SH "گام اول بیان مسئله
هر روز سردبیر پنجشنبههای سخت، از دو صندوق پست الکترونیکی
نامه دریافت میکند. با گرفتن تعداد نامههای هر یک از این
دو صندوق، تعداد کل نامهها را چاپ کنید. فرض کنید حداکثر یک
میلیون نامه در هر صندوق دریافت میشود و ممکن است تعداد نامهها
منفی باشد! یک نمونهی ورودی و خروجی این مسئله در جدول زیر نمایش
داده شده است.
.iobeg
1 2
.iocut
3
.ioend
.bp
.SH "گام دوم تولید نمونهها
برنامهی تولید نمونهها یک عدد را به عنوان ورودی دریافت میکند
و نمونهی ورودی مربوط به آن را تولید میکند. این برنامه
میتواند به زبان \*[un C]، \*[en C++] یا \*[en Python] نوشته
شود.
.boxbeg
.ccbeg
#include <stdio.h>
#include <stdlib.h>
.sp
int main(int argc, char *argv[])
{
int n;
if (argc < 2)
return 1;
n = atoi(argv[1]);
if (n == 0) /* case 0: testing zeros */
printf("0 0\\n");
if (n == 1) /* case 1: normal operands */
printf("1 2\\n");
if (n == 2) /* case 2: negative numbers */
printf("-1 2\\n");
if (n == 3) /* case 3: negative results */
printf("1 -2\\n");
if (n == 4) { /* case 4: random input */
srand(4);
printf("%d %d\\n", rand() % 1000 - 500,
rand() % 1000 - 500);
}
if (n > 4)
return 1;
return 0;
}
.ccend
.boxend
.bp
.SH "گام سوم بررسی خروجی
برنامهی داور، آدرس فایل ورودی )پارامتر اول(
و آدرس فایل خروجی یک برنامه )پارامتر دوم( را دریافت میکند
و امتیاز برنامه را به صورت یک عدد در خروجی چاپ میکند.
برنامهی زیر این کار را برای مسئلهی نمونهی این مستند
انجام میدهد. در صورتی که جمع درست محاسبه شده باشد،
امتیاز یک چاپ میشود و در غیر این صورت، با برگشت مقدار یک از تابع \*[en main]
خطا گزارش میشود.
.boxbeg
.ccbeg
#include <stdio.h>
.sp
int main(int argc, char *argv[])
{
FILE *ifp, *ofp;
int a, b, c;
if (argc < 3)
return 1;
ifp = fopen(argv[1], "r");
ofp = fopen(argv[2], "r");
if (!ifp || !ofp)
return 1;
if (fscanf(ifp, "%d %d", &a, &b) != 2)
return 1; /* bad input */
if (fscanf(ofp, "%d", &c) != 1)
return 1; /* bad output */
if (a + b != c)
return 1; /* wrong answer */
printf("%d\\n", 1); /* print the score */
return 0;
}
.ccend
.boxend