Знаменитый пират Джек Воробей опять в поисках сокровищ.
На этот раз ему попалась в руки карта, где указан путь к сундуку, полному золота.
Карта попалась очень сложная и магический компас здесь не поможет.
Каждое указание карты состоит из слова, определяющего направление движения (например, "вперед", "налево", "направо", "разворот") и, возможно, одного натурального числа, обозначающего морские мили.
Например, если после слова "вперед" следует количество морских миль, следует проплыть в том направлении, куда мы в данный момент смотрим. Слова "налево" или "направо" означают, что нужно изменить направление взгляда под прямым углом, а "разворот" - изменение направления на прямо противоположное.
Необходимо доплыть до острова, где находится клад как можно быстрее, ведь нас нагоняет английская эскадра.
В программе сначала вводятся два числа в отдельных строках: координаты острова с кладом по оси X (West-East) и Y (South-North).
Далее вводится направление из набора: «вперед», «налево», «направо», «разворот». Первоначальное направление взгляда - West.
Программа выводит на каждом шаге координаты Черной Жемчужины, а при достижении заветной цели - какое количество шагов было сделано для того, чтобы добраться до места.
Пример
Ввод Вывод
5
2
разворот
вперед
5
налево
2
Координаты: 0 0
Координаты: 5 0
Координаты: 5 2
Приплыли! Тащи лопаты
Количество шагов: 3
Ввод Вывод
0
3
направо
3
Координаты: 0 3
Приплыли! Тащи лопаты
Количество шагов: 1
Sample Input:
5
2
разворот
вперед
5
налево
2
Sample Output:
Координаты: 0 0
Координаты: 5 0
Координаты: 5 2
Приплыли! Тащи лопаты
Количество шагов: 3
Мой нерабочий код:
x = int(input(""))
y = int(input(""))
x1 = 0
y1 = 0
step = 0
while (y != y1) or (x != x1):
direction = str(input())
step += 1
if direction == 'разворот' :
print("Координаты: ", x1, y1)
direction1 = str(input(""))
if direction1 == "вперед":
x3 = int(input(""))
x1 += x3
print("Координаты: ",x1, y1)
elif direction1 == "налево":
y3 = int(input(""))
y1 += y3
print("Коордаты: ",x1, y1)
elif direction1 == "направо":
y3 = int(input(""))
y1 -= y3
print("Координаты: ",x1, y1)
else:
if direction == "вперед":
x3 = int(input(""))
x1 -= x3
print("Координаты: ",x1, y1)
direction = str(input(""))
elif direction == "налево":
y3 = int(input(""))
y1 -= y3
print("Координаты: ",x1, y1)
elif direction == "направо":
y3 = int(input(""))
y1 += y3
print("Координаты: ",x1, y1)
print("Приплыли! Тащи лопаты")
print("Количество шагов:",step)
Python
Задача, Пираты карибского моря
Вот рабочий код:
Каждое введённое значение скармливается функции coord, которая обновляет в соответствии с ним аккумулятор. Аккумулятор является кортежем из трёх элементов: кортеж текущих координат, кортеж направления и счётчик. Начальное значение аккумулятора - это начало координат и "запад".
Функция accumulate принимает последовательность входных значений и выдаёт последовательность значений аккумулятора. В принципе, нам нужно только последнее значение аккумулятора, поэтому можно было вместо accumulate использовать reduce, но так удобнее для отладки и для проверки условия окончания: оно проверяется именно по аккумулятору.
iter(input, None) повторяет вызов input(), пока он не вернёт None, т.е. бесконечное число раз, т.к. input() никогда не возвращает None. Для остановки последовательности используется takewhile с условием, что координаты сокровищ не достигнуты.
В расчёте движения (функция coord) рассматриваются три случая: введено число шагов (тогда координаты приращаются в текущем направлении), введено новое направление (тогда вектор направления меняется умножением на матрицу поворота, заданную в словаре), или введена непонятная команда (тогда никаких движений не происходит, т.к. в задаче не сказано, что с этим делать). При изменении координат аккумулятор пропускается через функцию printout, чтобы она их напечатала прямо по ходу обработки.
from itertools import accumulate, takewhile
from functools import partial
from operator import itemgetter
DIR = {
"вперед": ((1, 0), (0, 1)),
"направо": ((0, 1), (-1, 0)),
"налево": ((0, -1), (1, 0)),
"разворот": ((-1, 0), (0, -1))
}
def printout(*t):
tc, _, _ = t
print("Координаты %d %d" % tc)
return t
def coord(t, s):
(x, y), (dx, dy), n = t
dm = DIR.get(s, None)
return (printout((x + int(s) * dx, y + int(s) * dy), (dx, dy), n + 1) if s.isdigit()
else ((x, y), (dm[0][0] * dx + dm[0][1] * dy, dm[1][0] * dx + dm[1][1] * dy), n) if dm != None
else ((x, y), (dx, dy), n))
tt, it = tuple(map(int, map(input, ('','')))), ((0, 0), (-1, 0), 1)
print(*it)
*_, (_, _, nlast) = takewhile(lambda t: tt != t[0], accumulate(iter(input, None), coord, initial = it))
print("Приплыли! Тащи лопаты", "Количество шагов: %d" % (nlast + 1), sep = '\n')
Суть, вкратце:Каждое введённое значение скармливается функции coord, которая обновляет в соответствии с ним аккумулятор. Аккумулятор является кортежем из трёх элементов: кортеж текущих координат, кортеж направления и счётчик. Начальное значение аккумулятора - это начало координат и "запад".
Функция accumulate принимает последовательность входных значений и выдаёт последовательность значений аккумулятора. В принципе, нам нужно только последнее значение аккумулятора, поэтому можно было вместо accumulate использовать reduce, но так удобнее для отладки и для проверки условия окончания: оно проверяется именно по аккумулятору.
iter(input, None) повторяет вызов input(), пока он не вернёт None, т.е. бесконечное число раз, т.к. input() никогда не возвращает None. Для остановки последовательности используется takewhile с условием, что координаты сокровищ не достигнуты.
В расчёте движения (функция coord) рассматриваются три случая: введено число шагов (тогда координаты приращаются в текущем направлении), введено новое направление (тогда вектор направления меняется умножением на матрицу поворота, заданную в словаре), или введена непонятная команда (тогда никаких движений не происходит, т.к. в задаче не сказано, что с этим делать). При изменении координат аккумулятор пропускается через функцию printout, чтобы она их напечатала прямо по ходу обработки.
Похожие вопросы
- 4 задачи по темам:Массивы,Строки,Циклы,условный оператор
- Решение задачи по программированию (желательно питон) Сложность O(квадрат(n))
- Как понять логику решения следующей задачи "ДЛЯ НАЧИНАЮЩИХ"?
- Не могу решать задачи на целочисленную арифметику в питоне.
- нужно написать задачи на питоне
- Как научиться понимать и решать поставленные задачи в программирование?
- Математика и решения задачи
- Как понять логику решения следующей задачи (ещё и "для начинающих" называется)?
- Проект Эйлера / Правильно ли решил задачу? Python
- Не могу сделать задачу (напишите код пожалуйста) довольно трудная