Как правильно сравнивать вложенные значения в ситуации с вложенным списком? - PullRequest
0 голосов
/ 18 марта 2019

За нашу инженерную неделю моя школа давала проблемы с кодомВам не разрешено использовать библиотеки, которые решают основную часть проблемы.Вот моя проблема.

[>][ ][<]
[ ][^][ ]
[ ][<][ ]

Учитывая ASCII искусство аэродрома любого размера, с любым количеством самолетов, на любых шагах, проанализируйте текстовый файл и сделайте три вещи.

1) Если на шаге выяснить, какой самолет столкнется друг с другом, пометьте самолет знаком «x»

2) На шаге выясните, какой самолет вылетит из сетки, не врезаясь друг в друга, сделайте так, чтобыс «о».например, [ ][ ][<] вылетит с заданным размером шага 3.

3) При заданном шаге, если самолет не вылетает с сетки и не падает, замените его в следующей точке приземления

Я написал нечто, что может превратить указанный выше текстовый файл во вложенный список, а также захватить его текущие и будущие координаты всех плоскостей, которые идут горизонтально.

В настоящее время я работаю над функцией update_airfield, где яполучить пометить самолеты с «х» или «о» или переместить их в другое место.Эта логическая часть головоломки убивает меня.Ниже приведены входные данные для моей функции update_airfield, основанной на указанном выше аэродроме ASCII, после заданного размера шага 2.

# ROW 1 [>][ ][<] or ('>', 0, 0)(' ', 0, 1)('<', 0, 2)
# AFTER adding the step and formatting the output

[('>', 2), ('<', 0)]

# I took the 2nd element because its blank and I also removed the x_axis 
# because we only need to go along the horizontal line. 

Следующий шаг, который я могу сделать, - это выполнить математическое сравнение между пронумерованными значениями положения.Если результат> = 0, то я знаю, что они либо приземлились в одном месте, либо прошли друг через друга, поэтому они потерпели крах.Затем я могу изменить «>» и «<» на «x» и, наконец, повторить для каждой строки.Эта логика должна работать, но ломается, если я делаю строки длиннее и добавляю больше плоскостей.</p>

Вот где я застрял, пытаясь компенсировать аэродром любого размера, с любым количеством самолетов, на любых заданных шагах.Итак, как вы вообще можете начать решать такую ​​проблему?Существуют ли структуры данных в стандартном Python, которые могут помочь мне отследить, какой самолет столкнется друг с другом?Я должен сделать то же самое для самолетов, идущих вверх и вниз в вертикальном направлении.Я думал о сопоставлении всего с упорядоченным словарем, но не знал, как поступить.Любая помощь очень ценится.Надеюсь, я прояснил себя достаточно.

1 Ответ

1 голос
/ 18 марта 2019

Вам не обязательно сравнивать массивы. Если у вас нет огромного количества шагов или полей, самый простой подход состоит в том, чтобы моделировать каждый шаг, играя в направлениях. Кстати, какой символ обозначает вниз?

Initial state
[>][ ][<]
[ ][^][ ]
[ ][<][ ]

Step +1
[ ][X][ ]
[ ][ ][ ]
[<][ ][ ]

Step +2
[ ][X][ ]
[ ][ ][ ]
[L][ ][ ]

и так далее. Вы должны быть осторожны, чтобы не перемещать одну и ту же плоскость за один шаг. Чтобы избежать этого и сделать вещи относительно простыми, вы можете создать структуру для хранения состояния самолета и массив для хранения позиций для проверки столкновений (это просто оптимизация).

Я пойду за псевдокодом.

Ваш класс класса может содержать:

 originalX; 
 originalY;
 currentX; 
 currentY;
 state # on the field, left, collided
 stepNoLeft;
 stepNoCollided;
 ListcollidedWith  - optional

поместить самолеты в список, который будет использоваться в качестве очереди. Создайте двумерный массив для хранения текущих позиций (просто чтобы оглянуться назад на самолет, с которым вы столкнулись). Если поле действительно разреженное (тысячи ячеек и всего несколько самолетов, вы можете рассмотреть другую структуру. Вероятно, это карта списков или мультикарта, в этом случае единственными массивами, которые у вас будут, будет список самолетов, и с кем они столкнулись. Таким образом, поле может быть мультикартой (картой списков) с ключами, представляющими собой позицию х / у. Давайте использовать мультикарту, так как это будет более общим.

очистить карту поля (для следующего шага) переберите список самолетов и поместите самолеты в «поле» / на карте. Для первого шага у вас не должно быть координатных столкновений. Если самолет находится в столкновении, вероятно, он не должен двигаться или улетать. Вы можете пропустить равнины, которые уже улетели (они не меняют направления, поэтому после того, как они покинули поля, они в безопасности. Карта все еще может отслеживать их, но мы не обязаны) Обратите внимание, что допустим следующий случай: плоскости следуют друг за другом в одном файле:

step 0 [ ][<][<][ ]
step 1 [<][<][ ][ ]

Обновите текущий X, Y и поместите его в мультикарту или, если он выходит за пределы поля, пометьте его как вне поля. (в этот момент вы можете проверить занятость целевой ячейки, но можете дождаться конца шага) В конце шага переберите карту и отметьте ячейки несколькими самолетами для столкновения.

промыть и повторить

пример:

 For the Initial state
[>][ ][<]
[ ][^][ ]
[ ][<][ ]

это будет выглядеть так:

tuple: (x,y,direction,id)
step 0: airplanes( (0,0,'>', 'A') , (0,2,'<', 'B') , (1,1,'^', 'C') ,(2,1,'<', 'D')
step 1: airplanes( (0,1,'>', 'A') , (0,1,'<', 'B') , (0,1,'^', 'C') ,(2,0,'<', 'D')

map step1:
key: 0-1 : A,B,C – collided at step1
key:2-0: D

шаг 2: самолеты ((0,1, '>', 'A'), (0,1, '<', 'B'), (0,1, '^', 'C'), (2, -1, '<', 'D') </p>

airplanse A,B,C don't move  (let's assume that once there was a collision they don't move)
airplane D – has left the field

map step1:
key: 0-1 : A,B,C – collided at step1
 D is not in the map

Поскольку в python есть хорошие встроенные списки и карты, вам не нужна никакая библиотека.

...