Найти тему
PCLine

Олимпиада Яндекс Учебника по информатике 2024. Робот находится на клеточном поле без стен. Программа для робота составлена из команд

Робот находится на клеточном поле без стен. Программа для робота составлена из команд движения move_right(), move_left(), move_down(), move_up() и циклов for с одним неотрицательным параметром, внутри которых может быть любое количество команд движения. Вложенных циклов в программе нет. Названия переменных цикла for — из одного символа. Гарантируется, что программа верна, в ней нет синтаксических ошибок и могут встречаться пустые строки. Они нужны, чтобы визуально разделить код на несколько частей.
Каждая команда движения перемещает робота в соседнюю клетку в соответствующем направлении. Производители робота пошли навстречу программистам и добавили четыре команды вида move_right(N), которая передвигает робота в нужном направлении на N шагов (N — положительное целое число больше 1).
Последняя строка в программе — комментарий, который начинается с символа #. Других таких строк в программе нет.
Эту программу для робота надо сократить и заменить её на более короткую и при этом перемещающую робота в ту же клетку.
Ваша задача — написать на Python программу, которая это сделает.
Вашей программе на вход даётся несколько строк на Python со строкой-комментарием в конце.
Требуется вывести код программы, которая составлена по тем же правилам, что и исходная, перемещает робота в ту же клетку и имеет наименьшее возможное количество строк.
Если такую короткую программу можно составить разными способами с одинаковым количеством строк, выведите любой подходящий вариант. В каждой строке ответа разрешается ставить только одну команду движения или заголовок цикла for.
Робот находится на клеточном поле без стен. Программа для робота составлена из команд движения move_right(), move_left(), move_down(), move_up() и циклов for с одним неотрицательным параметром, внутри которых может быть любое количество команд движения. Вложенных циклов в программе нет. Названия переменных цикла for — из одного символа. Гарантируется, что программа верна, в ней нет синтаксических ошибок и могут встречаться пустые строки. Они нужны, чтобы визуально разделить код на несколько частей. Каждая команда движения перемещает робота в соседнюю клетку в соответствующем направлении. Производители робота пошли навстречу программистам и добавили четыре команды вида move_right(N), которая передвигает робота в нужном направлении на N шагов (N — положительное целое число больше 1). Последняя строка в программе — комментарий, который начинается с символа #. Других таких строк в программе нет. Эту программу для робота надо сократить и заменить её на более короткую и при этом перемещающую робота в ту же клетку. Ваша задача — написать на Python программу, которая это сделает. Вашей программе на вход даётся несколько строк на Python со строкой-комментарием в конце. Требуется вывести код программы, которая составлена по тем же правилам, что и исходная, перемещает робота в ту же клетку и имеет наименьшее возможное количество строк. Если такую короткую программу можно составить разными способами с одинаковым количеством строк, выведите любой подходящий вариант. В каждой строке ответа разрешается ставить только одну команду движения или заголовок цикла for.
-2

Ответ:

def srez(S):
N = S[S.find("(")+1:S.find(")")]
if N == "":
N = 1
else:
N = int(N)
S = S[:S.find("(")+1] + S[S.find(")"):]
if S[0:4] == " ":
S = S[4:]
Srez = [N,S,True]
else:
Srez = [N,S,False]
return(Srez)
def move(srez,coord):
if srez[2] == False:
kef.forK = 1
comm = ["move_right()","move_left()","move_up()","move_down()","for k in range():"]
if srez[1] == comm[0]:
coord[0] += srez[0]*kef.forK
return([coord[0],coord[1]])
elif srez[1] == comm[1]:
coord[0] -= srez[0]*kef.forK
return([(coord[0]),coord[1]])
elif srez[1] == comm[2]:
coord[1] += srez[0]*kef.forK
return([coord[0],coord[1]])
elif srez[1] == comm[3]:
coord[1] -= srez[0]*kef.forK
return([coord[0],(coord[1])])
elif srez[1] == comm[4]:
kef.forK = srez[0]
return([coord[0],coord[1]])
def dosrez(S,N):
S1 = S[:-1]+str(N)+")"
return(S1)
def cout(coord,doing,comm):
x = coord[0]
y = coord[1]
if doing > 2 or (x*y==0 and doing == 2):
if x > 1:
S = comm[0]
S = dosrez(S,x)
print(S)
elif x < -1:
S = comm[1]
S = dosrez(S,-x)
print(S)
elif x == 1:
print(comm[0])
elif x == -1:
print(comm[1])

if y > 1:
S = comm[2]
S = dosrez(S,y)
print(S)
elif y < -1:
S = comm[3]
S = dosrez(S,-y)
print(S)
elif y == 1:
print(comm[2])
elif y == -1:
print(comm[3])
class kef():
forK = 1
coord = [0,0]
doing = []
comm = ["move_right()","move_left()","move_up()","move_down()","for k in range():"]
while True:
S = str(input())
if len(S) > 0:
if S[0] == "#":
break
doing.append(S)


for i in doing:
Srez1 = srez(i)
coord = move(Srez1,coord)

cout(coord,len(doing),comm)