Напишіть програму або функцію, яка займає три цілі числа, ширину w
, висоту h
та кількість кроківs
. Ви будете малювати непересічні кроки випадкових прогулянок s
довгими зображеннями 5*w
на 5*h
піксель, де кожні 5 на 5 піксельних комірок або порожні (чисто бежевий), або одна з цих дванадцяти простих «труб»:
Зображення вгорі збільшується для деталізації. Ось труби фактичного розміру:
(Сірі лінії призначені лише для розділення типів труб.)
Випадкова прогулянка буде єдиним безперервним контуром труби, який починається в одній кінцевій точці труби (одній із чотирьох нижніх типів труб) і закінчується в іншій кінцевій точці труби.
Почніть з порожнього w
за h
сіткою і випадковим чином виберіть одну клітинку для початкової точки. Потім випадковим чином виберіть один із чотирьох напрямків для початку та намалюйте відповідну кінцеву точку труби. Ця початкова комірка означає перший крок у вашій прогулянці, і кожен раз, коли ви малюєте нову клітинку або перезаписуєте існуючу, вона вважається ще одним кроком.
Тепер, неодноразово, випадковим чином вибирайте, щоб рухатись праворуч, ліворуч або прямо, малюючи відповідну комірку труби, якщо обраний напрямок є дійсним. Зворотній s
шлях і повторно вибирайте, якщо напрямок недійсний, поки не буде сформований повний шлях кроку. Шлях повинен закінчуватися кінцевою точкою труби, яка може бути в будь-якій точці сітки, залежно від курсу, який пройшов шлях.
Дуже важливо відзначити, що можуть бути перезаписані лише дві прямі комірки труби, і лише пряма комірка труби протилежної орієнтації, результатом чого є клітина перетину. В іншому випадку всі труби повинні бути розміщені в порожніх осередках.
Коли проведено перетин, частина шляху, яка знаходиться далі від вихідної комірки, повинна бути намальована зверху.
Від вас залежить, чи має сітка періодичні граничні умови (PBC), тобто, чи буде виходити труба, що виходить з однієї сторони сітки з іншого боку. Без PBC межа сітки вважається бар'єром, на який можна зіткнутися так само, як і в інших трубах.
Спеціальні справи
- Коли
s
0, жодних труб не слід малювати, а вихід має бути порожнім5*w
по5*h
зображенню (тобто всі бежеві). Коли
s
1 заглушка на одній трубіслід намалювати у випадково вибраній вихідній комірці.
Інші подробиці
- Ви можете припустити, що
s
це максимум,w*h
тому шлях завжди буде можливим. (Хоча можливі довші шляхи через перехрестя.) w
іh
завжди буде позитивним.- Всі випадкові вибори повинні бути однаково випадковими. наприклад, ви не повинні уникати перехресть, коли вони можливі, навіть якщо це полегшує проблему. Генератори псевдовипадкових чисел дозволені.
- Будь-які три візуально чіткі кольори можуть використовуватися замість чорного, синього та бежевого.
- Ваші вихідні зображення можуть бути збільшені таким чином , що вони на насправді
5*w*k
від5*h*k
точок , деk
є позитивним цілим числом. (Розширення будь-яких прикладів, які ви публікуєте, рекомендується, навіть якщо вашk
належить 1.) - Може використовуватися будь-який загальний формат файлу зображень без втрат, і зображення може бути збережено у файл, відображатися або промальовуватися в режимі stdout.
Виграє найкоротший код у байтах.
Приклади
(Усі збільшені на 500%.)
Якщо вхід є, w=2, h=1, s=0
то вихід завжди буде:
Якщо вхід є, w=2, h=1, s=1
то на виході буде одне із цих зображень з рівним шансом:
Якщо вхід є, w=2, h=1, s=2
то вихід буде
чи, можливо,
якщо сітка передбачається мати PBC.
(Зауважте, що почати шлях так, як зробити другий крок неможливо.)
Ось кілька можливих результатів для w=3, h=2, s=6
, якщо припустити PBC:
Ось можливий вихід для w=3, h=3, s=9
, якщо припустити PBC:
Зауважте, що шляху не потрібно було охоплювати всі комірки через перетин, рахуючи два кроки. Крім того, ми можемо зробити висновок, що кутова кінцева точка була вихідною коміркою, оскільки шляхопровід перетину повинен бути намальований згодом. Таким чином, ми можемо зробити висновок про послідовність випадкових виборів:
start at top left, facing east
go straight
go right
go right
go right
go straight
go left
go right
end
Нарешті, ось приклади w=4, h=5, s=20
та w=4, h=5, s=16
:
You will be drawing a non-self-intersecting random walk
... це самопересічення чи ні?