اولین باره که به کاهو میای؟ راهنمای سایت رو حتما بخون!

ورود ثبت‌نام راهنما درباره‌ی کاهو
پرسش‌ها برچسب‌ها کاربر‌ها سوال بپرسید!

آمار پرسش:

  • پرسیده شده: 2017-04-21 03:35:59 -0500
  • مشاهده شده: 1,397 بار
  • بروز شده: 2017-04-21 04:35:23 -0500

پرسش‌های مشابه:

سوال ۱ روز دوم مرحله ۲ دوره ۲۳: رشته‌ی نزدیک

بازی رنگی - سوال ۱ - مرحله ۲ - ۱۳۹۳

وزنه‌ها و ماشین جادویی - سوال ۲ - مرحله ۲ - ۱۳۹۳

گاوی خسیس - سوال ۳ - مرحله ۲ - ۱۳۹۳

انتقال مهره‌های گاوی - سوال ۴ - مرحله ۲ - ۱۳۹۳

یافتن کوچکترین پیچ و مهره با مقایسه آنها

دنباله و جادوگر - دوره ی 24 - مرحله ی 2

دوربین های عکاسی

مسئله ی مسیر و شبکه - مرحله ی 2 – دوره ی 23

بازی خاموش کردن چراغ ها

نکاتی در مورد نوشتن پاسخ:

در این قسمت می‌تونی به یک پرسش پاسخ بدی. اگه می‌خوای در مورد پرسش بحث و اظهار نظر کنی از قسمت «ثبت نظر» استفاده کن.
پاسخت رو دقیق و کامل بنویس، از عکس استفاده کن و اگه لازمه به منابع (کتاب یا سایت) ارجاع بده.
اگه پرسش یا پاسخ‌ها مفید هستند حتما بهشون رای بده تا پرسش‌ها و پاسخ‌های خوب مشخص بشن.

استفاده از ویرایشگر:

توی قسمت پیش‌نمایش می‌تونی ببینی متنی که نوشتی چجوری روی سایت دیده میشه.
خیلی مهم: برای اینکه به خط بعد بری باید دوتا Enter بزنی.
می‌تونی از تگ‌های معمولی و ساده‌ی html هم استفاده کنی.
با دکمه‌هایی که بالای ویرایش‌گر قرار دارند کلی کار می‌شه کرد. از عکس‌گذاشتن بگیر تا لیست شماره‌دار. حتما امتحان‌شون کن.

علائم ریاضی:

برای نوشتن علائم ریاضی می‌تونی از Mathjax استفاده کنی. راهنمای Mathjax رو از سایت math.stackexchange بخون.
برای نوشتن عبارت ریاضی وسط جمله، اون عبارت رو بین دوتا $ قرار بده.
برای نوشتن عبارت ریاضی تو یه خط جدید اون رو بین دوتا $$ قرار بده.

پیاده‌سازی توابع - مرحله ۲ سال ۱۳۹۶ - روز دوم - سوال دوم

6

متن سوال: ۱

۲

۳

۴

۵

۱۳۹۶ مرحله۲
2017-04-21 03:35:59 -0500
توفیقی 1621 ● 17 ● 21 ● 42
پاک‌کردن   ویرایش سوال

1 پاسخ

7

در واقع در این سوال ما دو تابع داریم، یکی مینیمم گرفتن و دیگری ++ کردن یک عدد.

قبل از حل دو قسمت سوال، چند تابع تعریف می‌کنیم:

min که در صورت سوال تعریف شده‌است.

plus1، که یک وروی میگیرد و سپس مقدار آن را در پیمانه‌ی ۳ به اضافه‌ی یک می‌کند:

plus1:
x
ans
t
t <- branko(x, x)
ans <- t

به همین طریق plus2 را نیز می‌سازیم:

plus2:
x
ans
t
t <- branko(x, x)
t <- branko(x, x)
ans <- t

تابع is1 که ایک ورودی می‌گیرد، اگر ورودی یک بود مقدار ۱ و در غیر اینصورت ۰ را بر‌می‌گرداند:

is1:
x
ans
t
t <- plus1(x)
ans <= min(x, t)

به همین طریق is2 و is0 را نیز تعریف می‌کنیم:

is0:
x
ans
t
t <- plus1(x)
ans <- is1(t)
is2:
x
ans
t
t <- plus2(x)
ans <- is1(t)

حال تابع and(x, y) را می‌سازیم، بدین صورت که دو عدد x,y که ۰ و ۱ هستند میگیرد و اگر هردوی آنها ۱ بودند ۱ را برگردانده و در غیر اینصورت ۰ را بر میگرداند:

and:
x y
ans

ans <- min(x, y)

همچنین تابع or(x,y) را می‌سازیم که دو عدد ۰ یا ۱ می‌گیرد و اگر حداقل یکی ۱ بود مقدار ۱ و در غیراینصورت ۰ را بر می‌گرداند:

or:
x y
ans
notx noty notans
notx <- is0(x)
noty <- is0(y)
notans <- and(notx, noty)
asn <- is0(notans)

دقت کنید که در دو تابع آخر، برای ورودی مقدار ۲ نمی‌دهیم...

الف) اگر حداقل یکی از دو ورودی ۲ بودند، باید جواب ۲ شود. در غیراینصورت اگر حداقل یکی از دو ورودی ۱ بودند باید جواب ۱ شود. و در غیر اینصورت ۰: پس کد آن به صورت زیر می‌شود:

max:
x y
ans
check2 x1 x2 y1 y2 check2 ans1

x2 <- is2(x)
y2 <- is2(y)
check2 <- or(x2, y2)
check2 <- plus2(check2)

x1 <- is1(x)
y1 <- is1(y)
check1 <- or(x1, y1)
check1 <- plus1(check1)

ans1 <- min(check2, check1)
ans <- plus2(ans1)

ب) پیاده‌سازی d1 به کمک is‌ها و and و or بسیار ساده‌است:

$ d1(x,y) = or(and(is1(x), is2(y)), or(and(is2(x), is1(y)), and(is2(x), is2(y)))) $

همین عبارت بالا را با زبان پیاده‌می‌کنیم:

d1:
x y
ans
a b a1 a2 b2 check1
a = min(x, y)
b = max(x, y)

a1 <- is1(a)
a2 <- is2(a)
b2 <- is2(b)
check1 <- and(a1, b2)
ans <- or(check1, a2)

و حال می‌رسیم سراغ پیاده‌سازی d3، مثل پیاده‌سازی max، ابتدا اگر جواب ۲ می‌شود را بررسی می‌کنیم و سپس بررسی ۰ یا ۱ بودن جواب را می‌کنیم:

d3:
x y
ans
a b check11 check12 check21 check22 ans1 ans2 ans3 a0 a1 a2 b0 b1 b2
a = min(x, y)
b = max(x, y)

a0 <- is0(a)
a1 <- is1(a)
a2 <- is2(a)
b0 <- is0(b)
b1 <- is1(b)
b2 <- is2(b)

check11 <- and(a0, b2)
check12 <- and(a1, b1)
ans1 <- or(check11, check12)
ans1 <- plus2(ans1)

check21 <- and(a0, b1)
check22 <- and(a2, b2)
ans2 <- or(check21, check22)
ans2 <- plus2(ans2)

ans3 <- min(ans1, ans2)
ans <- plus2(ans3)

نکته‌ی جالب: در این زبان هر نوع تابعی از ورودی‌ها با خروجی‌ی ۰ و ۱ و ۲ رو میشه پیاده سازی کرد... فک کنم فک کردن اینکه چجوری بد نباشه :-)

2017-04-21 04:05:43 -0500
توفیقی 1621 ● 17 ● 21 ● 42
پاک‌کردن   ویرایش پاسخ
نظرات

ای بابا! اگه این جمله آخر رو اونجا اثبات میکردیم! به نظر راحت تر بود :)!!! حالا جدا ازینا کلا امتحان جالبی نبود! :)

2017-04-22 08:53:06 -0500 سجاد ولایی

@سجاد ولایی درکل به نظرم مهم‌ترین مشکل مرحله ۲ امسال داشتن دو سوال تکراری بوده* درسته که عمدی در کار نبوده ولی باعث ضایع شدن حق تعداد زیادی از دانش‌آموزان مخصوصا شهرستانی‌ها میشه که اکثرا تلاش بسیار بیشتری نسبت به تهرانی‌ها و نتیجه‌ی بدتری میگیرن :-(

2017-04-23 05:51:26 -0500 توفیقی

پاسخ شما

فقط در صورتی که پاسخی برای این پرسش دارید، آن را اینجا بنویسید و برای بحث کردن از قسمت «ثبت‌ نظر» استفاده کنید. شما می‌توانید قبل از وارد شدن به سایت پاسخ خود را بنویسید. این پاسخ ذخیره می‌شود و زمانی که شما وارد سایت شدید یا ثبت‌نام کردید منتشر می‌شود.

پیش‌نمایش:

کلیه‌ی حقوق این سایت متعلق به کمیته‌ی ملی المپیاد کامپیوتر است.