2015-05-07 4 views
1

мне нужно уменьшить длину этого кода в Python3 настолько, насколько это возможно (даже если она будет менее читаемой):Как я могу уменьшить длину этого кода?

a,b,x,y=[int(i) for i in input().split()] 
while 1: 
r='' 
if y<b:r='S';y+=1 
if y>b:r='N';y-=1 
if x<a:r+='E';x+=1 
if x>a:r+='W';x-=1 
print(r) 

Это карта: вы находитесь на (х, у), и вы должны перейти к (a, b) S для Юга N для Северной NE для северо-востока .... После каждого поворота я должен указать, куда идти, используя печать.

Например, можно ли положить все, если на одной строке?

+0

Я не думаю, что вы можете сделать, чтобы сократить этот код. 'while 1', вероятно, должно быть' while (a, b)! = (x, y) 'хотя. – QuestionC

+1

Это игра, и когда персонаж находится на a, b, он автоматически остановится. – Nina64

+0

Возможно, вы захотите задать этот вопрос на кодовом гольф-поле. – QuestionC

ответ

0
a,b,x,y=[int(i) for i in input().split()] 
print('S'*(b-y)+'N'*(y-b)+'E'*(a-x)+'W'*(x-a)) 

Это зависит от 'W' * 3 == 'WWW' и 'W' * -3 == ''. Порядок указаний не будет таким же, как исходный код (он не будет чередовать несколько N/Ses с несколькими E/Wes). Кроме того, в отличие от исходного кода, он не войдет в бесконечный цикл, как только вы достигнете цели.

+0

Спасибо, но мне нужен «оптимальный угол»: мне нужно использовать «SE», «NW» .... и мне приходится печатать в одном направлении за раз. – Nina64

0

Это решение на самом деле дольше, но оно работает, и от Бога это слишком уродливо, чтобы не делиться.

from itertools import chain, zip_longest 
a,b,x,y=[int(i) for i in input().split()] 
[ print(''.join(x)) for x in zip_longest(chain(('N' for _ in range(b, y)), ('S' for _ in range(b, y, -1))), chain(('W' for _ in range(a, x)), ('E' for _ in range (a, x, -1))), fillvalue='') ] 
Смежные вопросы