Найти в Дзене
PCLine

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

Ответ: 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(
Робот находится на клеточном поле без стен. Программа для робота составлена из команд движения 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)