Python 2.7- 197 192字节
q='NESW';x,y,d=raw_input().split(',');x=int(x);y=int(y);d=q.find(d);v={0:'y+',1:'x+',2:'y-',3:'x-'}
for c in raw_input():exec['d+','d-',v[d]]['RL'.find(c)]+'=1;d=d%4'
print`x`+','+`y`+','+q[d]
我真的为此感到非常自豪。
说明
首先,让我们清理一下这个烂摊子。我在很多地方都用分号代替了换行符,因为我认为这很酷。通常是这里(仍然是197个字节,根本没有被取消占用)。是的,仍然有一个分号,但是那个实际上节省了一个字节。
q='NESW'
x,y,d=raw_input().split(',')
x=int(x)
y=int(y)
d=q.find(d)
v={0:'y+',1:'x+',2:'y-',3:'x-'}
for c in raw_input():m=v[d];exec['d+','d-',m]['RL'.find(c)]+'=1;d=d%4'
print`x`+','+`y`+','+q[d]
让我们开始!
q='NESW'
首先我们定义q
为字符串'NESW'
。我们稍后再使用两次len("q='NESW';qq") < len("'NESW''NESW'")
。
x,y,d=raw_input().split(',')
在这里,我们在每个逗号处分割输入的第一行。我们的x坐标存储在中x
,y 存储在其中,y
方向的第一个字母存储在中d
。
x=int(x)
y=int(y)
然后,我们仅将坐标设为int。(我为无法想到将两个字符串转换为int的更好方法而感到震惊。我尝试过,x,y=map(int,(x,y))
但结果却更长。)
d=q.find(d)
这会将我们的方向转换为整数。0是北,1是东,2是南,3是西。
v={0:'y+',1:'x+',2:'y-',3:'x-'}
这就是乐趣的开始。
当我们往北走时,Y增加1。因此,该字典取0并给出字符串'y+'
,表示“增加y”。对于其他方向,它给出类似的结果:y或x,后跟+或-。
我们将回到这一点。
for c in raw_input():
m=v[d]
exec['d+','d-',m]['RL'.find(c)]+'=1;d=d%4'
我已经拥有略微放松这一自由的权利。
对于输入的第二行中的每个字符,我们做两件事。首先,我们将变量设置为m
字典中给出的当前方向的任意值。没有理由我们每次都需要发生这种情况,但是这比仅在需要时使它发生更容易。
接下来,我们创建一个列表包含三个元素:'d+'
,'d-'
,和m
。编者注:我认为我完全不用变量就可以摆脱困境m
。我想我可以直接将其放在v[d]
列表中。如果可以的话,这将为我节省几个字节,但是直到完成解释后,我才觉得要对其进行测试,以便大家都可以解决。(是的,它起作用了。)
我们在字符串“ RL”中查找输入的当前字符。str.find
如果找不到字符,则返回-1,因此将R转换为0,将L转换为1,然后将其他任何值转换为-1。当然,我们可以拥有的唯一其他输入是M,但是使它适用于所有内容的字符较少。
我们使用该数字作为创建列表的索引。Python列表索引如果为负数,则从末尾开始,因此,如果输入为R,则得到第一个元素,如果输入为L,则得到第二个元素,如果输入为M,则得到最后一个元素。为方便起见,我将假定我们正对着北方,但其他方向也适用类似的原则。
我们正在使用的可能值分别'd+'
是R,'d-'
L和'y+'
M。然后,将它们附加'=1;d=d%4'
到每个值的末尾。这意味着我们可能的价值是...
d+=1;d=d%4
d-=1;d=d%4
y+=1;d=d%4
那是有效的python代码!这是有效的python代码,完全可以完成我们想要为每个输入字符执行的操作!(该d=d%4
部分只是使我们的方向保持理智。同样,不需要每次都这样做,但是字符更少。)
我们要做的就是执行每个字符得到的代码,将其打印出来(将方向转换回字符串),然后完成!