Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 17, 2019 12:53:21

Axwts
Зарегистрирован: 2019-01-17
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Задача на движение

Помогите пожалуйста написать код к задаче. В прикрепленном файле изображено два пути по которым двигаются стрелочки.Они состоят из прямых ( | ) и (-), кривых ( /и \) и пересечений ( +). Пересечения происходят, когда пересекаются два перпендикулярных пути. На перекрестке стрелочка может поворачивать налево, поворачивать направо или продолжать движение прямо.Каждый раз, когда у стрелочки есть возможность повернуть (достигнув любого перекрестка), она поворачивает влево в первый раз, идет прямо во второй раз, поворачивает направо в третий раз, а затем повторяет эти указания, начиная снова с левого четвертого раза, прямо в пятый раз и тд. Этот процесс не зависит от конкретного пересечения, к которому прибыла стрелочка, то есть стрелочка не имеет памяти для каждого пересечения.Стрелочки движутся с одинаковой скоростью. они по очереди двигаются по одному шагу за раз. Они делают это в зависимости от своего текущего местоположения : сначала перемещаются стрелочки в верхнем ряду (действуя слева направо), затем перемещаются стрелочки во втором ряду (снова слева направо), затем стрелочки в третьем ряду и так далее.
Если стрелочки сталкиваются, то ничего не происходит и они дальше продолжают движение.Учитель сказал что мы должны будем писать в коде количество шагов и этот код должен показывать на каких местах расположены стрелочки.

Отредактировано Axwts (Янв. 17, 2019 14:11:13)

Прикреплённый файлы:
attachment ZpoHOoKZGdQ.jpg (6,4 KБ)

Офлайн

#2 Янв. 17, 2019 14:05:39

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

Задача на движение

Нужно сделать двумерный массив символов, в котором есть все занятые клетки и все пустоты. Для каждой стрелочки надо сделать память последнего прохода через перекрёсток в виде числа. Также надо сделать память для символа под каждой стрелкой, чтобы при перемещении стрелки этот символ вставлялся в освободившееся место.

И дальше на каждом шаге ты проверяешь положение стрелки и что у неё впереди. Она может поворачиваться, доходя до края, она может видеть перекрёсток и требовать переключения числа прохода перекрёстка.



Отредактировано py.user.next (Янв. 17, 2019 14:07:03)

Офлайн

#3 Янв. 17, 2019 20:09:18

uf4JaiD5
Зарегистрирован: 2018-12-28
Сообщения: 76
Репутация: +  4  -
Профиль   Отправить e-mail  

Задача на движение

Axwts
В прикрепленном файле изображено два пути по которым двигаются стрелочки.Они состоят из прямых ( | ) и (-), кривых ( /и \)

Лучше, конечно, реализовать не именно эту “трассу” (и только её), а “любую трассу, нарисованную таким образом”.

Но тогда возникает вопрос. На рисунке “/” соединяет направления вниз и вправо в одном случае и вверх и влево в другом. А если нарисовать подходы со всех сторон – будет так же направлять?
 .
  |
--/--
  |  

Axwts
Стрелочки движутся с одинаковой скоростью. они по очереди двигаются по одному шагу за раз. Они делают это в зависимости от своего текущего местоположения : сначала перемещаются стрелочки в верхнем ряду …
А какая разница, в каком порядке они ходят, если результат вы видите уже после того, как передвинуты все стрелки? Надо будет держать информацию о стрелках не в виде “'>' в строке, описывающей трассу”, хотя бы для поворотов в нужную сторону. Т.е. это требование выглядит странно.

Axwts
Если стрелочки сталкиваются, то ничего не происходит и они дальше продолжают движение.
А если две стрелки пойдут по одному пути? Встретятся на пересечении и обе повернут на одну ветку. Скорее всего тоже “ничего не происходит”, но мало ли.

Решение:

Будем кодировать направление движения строками ‘N’,' S', ‘E’, ‘W’ - north, south, east, west (на север, на юг, на восток, на запад). Это чтоб не путать с лево/право при поворотах.

Направление поворота на пересечении: ‘L’, ‘F’, ‘R’ - left, forward, right (влево, прямо, вправо).

Далее создаём класс/словарь (смотря что уже проходили) стрелки с определёнными полями. Лучше класс, чуть чище код будет.

Стрелка:
direction - направление движения. строка: N|S|E|W
y, x - координаты.
turn - направление следующего поворота. строка: ‘L’ | ‘F’ | ‘R’

Функция “повернуть”. Аргумент: стрелка
Из turn и direction получает новое direction
Кладёт в turn “следующее” значение.

Карта: массив со строками, как на рисунке.
Изображения стрелок с карты надо убрать и заменить соответствующей “дорогой”.
 #
map = '''
/---⌝ 
|   |  /----⌝'''
map = map.replace('⌝', '\\').split('\n')[1:]
Тут первые две строки карты (надо доделать).
\ в строке кодируется как “\\”. Это неудобно при таком вот “рисовании” (картинка расползётся), поэтому для начала закодируем \ как ‘⌝’. А потом заменим.
Далее режем map на строчки, это чтобы было удобно обращаться к клеткам:
 cell = map[y][x]
И отбрасываем первую пустую строку.

Правила: словарь с характеристиками возможных клеток.
ключи: ‘-’, ‘|’, ‘\\’, ‘/’, ‘+’
значение: словарь, содержащий информацию о клетке:
ключи: четыре направления движения из клетки: ‘N’, ‘S’, ‘E’, ‘W’.
значение:
Если движение из клетки в этом направлении возможно, то True.
Далее вспоминаем, что \ и / меняют направление движения. Если в клетку / заходят с направлением движения N, то уйдут в направлении E. Закодируем это новым направлением движения.
 rule['/']['N'] = 'E'.
Ну а если движение в таком направлении невозможно, то False.

Пример:
 rule['-'] = {'N':False, 'S':False, 'E': True, 'W': True}

Функция “шагнуть”. Аргумент: стрелка.
Проверяем, не на пересечении ли стоим:
 #
cell = map[arrow.y][arrow.x]
if cell == '+'
Если пересечение: поворот, перемещение.
Если нет и
 rule[cell][arrow.direction] == True
то перемещение в направлении arrow.direction. Иначе перемещение в направлении
 rule[cell][arrow.direction]

Функция “перемещение”. Аргументы: стрелка, направление.
поменять координаты у стрелки.

Функция “вывод на экран” Аргументы: карта, массив стрелок.
Рисует текущую позицию. Стрелку, видимо, выводит как одно из ∧∨<>.

Вот и весь алгоритм. Остаётся создать “карту” и “стрелки”.

Офлайн

#4 Янв. 17, 2019 20:50:49

uf4JaiD5
Зарегистрирован: 2018-12-28
Сообщения: 76
Репутация: +  4  -
Профиль   Отправить e-mail  

Задача на движение

О! Вместо NSEW лучше использовать ∧∨<>.

Офлайн

#5 Янв. 18, 2019 05:31:57

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

Задача на движение

uf4JaiD5, запутанный код получается.
Выполни в интерпретаторе

  
import this
и прочитай.

Должна быть карта, на которой проводятся преобразования. Сколько там стрелочек, какие они, мы этого не знаем. Мы можем предположить, что вся карта забита одними стрелочками, и их нужно все продвинуть на три шага. Представил? И карта на 1000 строк и столбцов. А можем предположить, что там ни одной стрелки нет, и нужно тоже продвинуть ноль стрелок. Плюс карта может быть произвольной - не такой, а другой.

Я просто давно делал тетрис (больше 10 лет назад, ещё на бейсике), вот там всё то же самое. Где-то падает фигурка, ещё хрен знает какая, а где-то сокращаются строки, сдвигая остальные клетки и перезакрашивая освободившееся место. Это нужно в массиве всё делать, проходя его по несколько раз.



Отредактировано py.user.next (Янв. 18, 2019 05:33:50)

Офлайн

#6 Янв. 18, 2019 08:21:23

uf4JaiD5
Зарегистрирован: 2018-12-28
Сообщения: 76
Репутация: +  4  -
Профиль   Отправить e-mail  

Задача на движение

py.user.next
запутанный код получается.
Не вижу никакой запутанности. Можно дописать до конца и сравнить.

py.user.next
Мы можем предположить, что вся карта забита одними стрелочками, и их нужно все продвинуть на три шага. Представил? И карта на 1000 строк и столбцов.
У моего алгоритма это не вызовет никаких затруднений.
Надо только найти героя, который нарисует карту 1000х1000.

py.user.next
Плюс карта может быть произвольной - не такой, а другой.
В первом же абзаце писал об этом.

Офлайн

#7 Янв. 18, 2019 10:22:55

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

Задача на движение

uf4JaiD5
Можно дописать до конца и сравнить.
Ну вот смотри, ты использовал map, а тебе не интересно, почему она зелёненьким цветом раскрасилась?
uf4JaiD5
 map = map.replace('⌝', '\\').split('\n')[1:]

Ну и столкновение стрелок у тебя где? Если две стрелки стоят мордами друг к другу, при этом одна стрелка заняла перекрёсток, то какой результат после шага?

Так что ты можешь написать рабочую программу, а я могу её поломать



Офлайн

#8 Янв. 18, 2019 11:18:13

uf4JaiD5
Зарегистрирован: 2018-12-28
Сообщения: 76
Репутация: +  4  -
Профиль   Отправить e-mail  

Задача на движение

py.user.next
Ну вот смотри, ты использовал map
Плохо, конечно, но это ж “схема”, “описание алгоритма” а не готовый код.

py.user.next
Ну и столкновение стрелок у тебя где?
У меня всё работает. Сделай свой, “незапутанный”, вариант.

Автора надо не лишить удовольствия поучаствовать в решении задачки. Как что-нибудь осилит – можно будет помериться алгоритмами.

Офлайн

#9 Янв. 18, 2019 11:25:57

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

Задача на движение

uf4JaiD5
Плохо, конечно, но это ж “схема”, “описание алгоритма” а не готовый код.
Не, я имею в виду ещё более новичковый уровень - ты не знаешь про встроенную функцию map().
Конечно, если ты не знаешь таких вещей, то и на питоне ты красиво писать не можешь.
Так у тебя всё напоминает какой-то JavaScript.

uf4JaiD5
У меня всё работает.
Так у тебя кода даже нет, как ты его проверишь, работает ли он на практике? В теории-то много чего может быть.



Офлайн

#10 Янв. 18, 2019 11:43:01

uf4JaiD5
Зарегистрирован: 2018-12-28
Сообщения: 76
Репутация: +  4  -
Профиль   Отправить e-mail  

Задача на движение

py.user.next
встроенную функцию map()
Поэтому я и пишу “плохо, что я обозвал эту переменную map, но пока это схема, а не готовый исходник – не смертельно”.

py.user.next
Так у тебя кода даже нет, как ты его проверишь, работает ли он на практике?
Во-первых, даже по выложенным здесь наброскам видно, что всё будет работать.
Во-вторых, и код есть – что там писать-то? Запускал, проверял – работает.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version