راه
۶ کیو· متوسطمتوسطPYTHON۴ ثانیه · ۲۵۶ مگابایت

رنگ‌آمیزی مکعب

فرض کنید یک ساختار سه‌بعدی داریم که از واحدهای کوچک‌تری (مانند مکعب‌های کوچک) تشکیل شده‌است. این ساختار می‌تواند ابعاد مختلفی داشته باشد (یعنی لزوماً یک مکعب مربع نیست و می‌تواند مکعب مستطیل باشد). هدف این است که واحدهای کوچکی را که در سطح خارجی این ساختار قرار دارند، شناسایی کنیم؛ یعنی ببینیم اگر بخواهیم روی این ساختار را رنگ کنیم، چندتا از این واحدهای کوچک رنگ می‌شوند.

برای شبیه‌سازی این ساختار، از یک لیست تودرتوی سه‌بعدی در پایتون استفاده می‌کنیم. هر عنصر در این لیست نماینده‌ی یک واحد کوچک است.


تابع coloring

وظیفه شما پیاده‌سازی تابعی به نام coloring است که این لیست سه‌بعدی را به‌عنوان ورودی دریافت می‌کند. این تابع باید مقدار عناصر مربوط به واحدهای سطحی (آن‌هایی که حداقل در یکی از وجوه خارجی ساختار قرار دارند) را به 1 و مقدار عناصر مربوط به واحدهای داخلی را به 0 تغییر دهد. این تغییرات باید روی خود لیست ورودی اعمال شوند.

ورودی این تابع یک لیست تودرتوی سه‌بعدی با ابعاد دلخواه است. مقادیر اولیه‌ی عناصر لیست مهم نیستند و ممکن است هر عددی باشند. تابع coloring باید لیست ورودی را مستقیماً به‌صورت زیر تغییر دهد:

  • عناصری که در لایه‌ی اول یا آخر هر بعد قرار دارند، خارجی محسوب شده و مقدارشان 1 می‌شود.
  • سایر عناصر (داخلی) مقدارشان 0 می‌شود.

تابع coloring هیچ مقداری را برنمی‌گرداند و تنها مقادیر لیست ورودی را تغییر می‌دهد.


💡 راهنمایی

یک ساختار سه‌بعدی (مانند مکعب یا مکعب مستطیل) را تصور کنید که از قطعات کوچک‌تر تشکیل شده‌است. قطعاتی که روی سطح خارجی (وجوه بیرونی) قرار دارند، مانند پوسته‌ی ساختار هستند. قطعاتی که کاملاً در داخل ساختار محصور شده‌اند، بخش داخلی آن را تشکیل می‌دهند.

این تمرین از شما می‌خواهد با استفاده از اندیس‌های هر عنصر در لیست سه‌بعدی، تشخیص دهید که آیا آن عنصر در لبه‌ها یا وجوه بیرونی ساختار قرار دارد یا خیر. اگر در سطح خارجی بود، مقدارش را 1 و اگر در داخل بود، مقدارش را 0 قرار دهید.

به ابعاد لیست (تعداد لایه‌ها، تعداد ردیف‌ها در هر لایه، و تعداد عناصر در هر ردیف) توجه کنید تا بتوانید اندیس‌های مربوط به عناصر سطحی را به‌درستی شناسایی کنید.


🎯 مثال

فرض کنید تابع coloring را به شکل گفته‌شده پیاده‌سازی کرده‌اید. در این کد، از این تابع استفاده می‌کنیم و نتیجه‌ی آن را به شکلی چاپ می‌کنیم که قابل‌خواندن باشد.

python
# تعریف یک ساختار سه‌بعدی
sample_cube = [
    [
        [5, 5, 5],
        [5, 5, 5],
        [5, 5, 5]
    ],
    [
        [5, 5, 5],
        [5, 5, 5],
        [5, 5, 5]
    ],
    [
        [5, 5, 5],
        [5, 5, 5],
        [5, 5, 5]
    ]
]

coloring(sample_cube)

# نمایش ساختار جدید
for i in range(len(sample_cube)):
    print(f"Layer {i + 1}:")
    for plane in sample_cube[i]:
        for element in plane:
            print(element, end=' ')
        print()

کد شما باید فقط متشکل از تابع coloring باشد و قطعه کد بالا تنها یک مثال برای دیدن عملکرد تابع است.


📤 خروجی

text
Layer 1:
1 1 1
1 1 1
1 1 1
Layer 2:
1 1 1
1 0 1
1 1 1
Layer 3:
1 1 1
1 1 1
1 1 1

📖 توضیح مثال

در کد نمونه، ابتدا یک لیست سه‌بعدی (matrix) با مقادیر اولیه‌ی دلخواه (در این‌جا 5) تعریف شده است. سپس تابع coloring فراخوانی می‌شود که مستقیماً روی matrix کار کرده و مقادیر آن را بر اساس سطحی یا داخلی بودن به 1 یا 0 تغییر می‌دهد. در نهایت، محتوای تغییریافته‌ی matrix لایه‌به‌لایه چاپ می‌شود تا صحت عملکرد تابع بررسی شود.

در این ساختار ۳×۳×۳، تنها عنصر داخلی، عنصر وسط لایه‌ی دوم است که مقدار آن به 0 تغییر کرده است.


💡 راهنمایی نهایی

ساختار کلی تابع به این شکل است:

python
def coloring(cube):
    depth = len(cube)
    if depth == 0:
        return
    rows = len(cube[0])
    cols = len(cube[0][0])

    for i in range(depth):
        for j in range(rows):
            for k in range(cols):
                if i == 0 or i == depth - 1 or j == 0 or j == rows - 1 or k == 0 or k == cols - 1:
                    cube[i][j][k] = 1
                else:
                    cube[i][j][k] = 0
  • depth ← تعداد لایه‌ها (بعد اول)
  • rows ← تعداد ردیف‌ها در هر لایه (بعد دوم)
  • cols ← تعداد ستون‌ها در هر ردیف (بعد سوم)
  • عنصر سطحی ← اگر در لایه‌ی اول یا آخر (i) یا ردیف اول/آخر (j) یا ستون اول/آخر (k) باشد
  • عنصر داخلی ← در غیر این صورت
  • در این تمرین، نیازی به دریافت ورودی از کاربر یا چاپ خروجی در کنسول ندارید.
  • شما فقط باید تابع coloring را پیاده‌سازی کنید.
  • ورودی تابع از طریق آرگومان آن دریافت می‌شود.
  • تابع هیچ مقداری را return نمی‌کند و فقط لیست ورودی را تغییر می‌دهد.
  • نیازی به فراخوانی تابع در کد ارسالی نیست. سیستم به‌طور خودکار تابع شما را با ورودی‌های مختلف تست خواهد کرد.

✅ این تمرین را در ویرایشگر خود پیاده‌سازی کنید. به یاد داشته باشید که تابع باید لیست ورودی را مستقیماً تغییر دهد و مقداری را برگرداند.

نمونه‌ها

ورودی نمونه ۱
cube = [[[5] * 3 for _ in range(3)] for _ in range(3)]
coloring(cube)
cube
خروجی نمونه ۱
[[[1, 1, 1], [1, 1, 1], [1, 1, 1]], [[1, 1, 1], [1, 0, 1], [1, 1, 1]], [[1, 1, 1], [1, 1, 1], [1, 1, 1]]]
ورودی نمونه ۲
cube = [[[7] * 4 for _ in range(3)] for _ in range(2)]
coloring(cube)
cube
خروجی نمونه ۲
[[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]], [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]]
ورودی نمونه ۳
cube = [[[0] * 5 for _ in range(5)] for _ in range(5)]
coloring(cube)
cube
خروجی نمونه ۳
[[[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]], [[1, 1, 1, 1, 1], [1, 0, 0, 0, 1], [1, 0, 0, 0, 1], [1, 0, 0, 0, 1], [1, 1, 1, 1, 1]], [[1, 1, 1, 1, 1], [1, 0, 0, 0, 1], [1, 0, 0, 0, 1], [1, 0, 0, 0, 1], [1, 1, 1, 1, 1]], [[1, 1, 1, 1, 1], [1, 0, 0, 0, 1], [1, 0, 0, 0, 1], [1, 0, 0, 0, 1], [1, 1, 1, 1, 1]], [[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]]]
ورودی نمونه ۴
cube = [[[2] * 3 for _ in range(4)] for _ in range(5)]
coloring(cube)
cube
خروجی نمونه ۴
[[[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]], [[1, 1, 1], [1, 0, 1], [1, 0, 1], [1, 1, 1]], [[1, 1, 1], [1, 0, 1], [1, 0, 1], [1, 1, 1]], [[1, 1, 1], [1, 0, 1], [1, 0, 1], [1, 1, 1]], [[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]]]
ورودی نمونه ۵
cube = [[[9]]]
coloring(cube)
cube
خروجی نمونه ۵
[[[1]]]
ورودی نمونه ۶
coloring([[[1, 1], [1, 1]], [[1, 1], [1, 1]]]) is None
خروجی نمونه ۶
True

برای نوشتن پاسخ و دریافت امتیاز، ابتدا وارد حساب شوید.

ورود