箭头
* * * *
拉格朗日计划
* * * *
箭头

从坐标原点$(0,0)$出发,按给定的一系列箭头的方向移动,打印每次移动后的位置坐标,箭头及其对应的移动如下:

$(-1,-1)$: ↙ U+2199, ↲ U+21B2, ⇙ U+21D9

$(-1,0)$: ← U+2190, ⇐ U+21D0, ⇦ U+21E6

$(-1,1)$: ↖ U+2196, ↰ U+21B0, ⇖ U+21D6

$(0,-1)$: ↓ U+2193, ⇓ U+21D3, ⇩ U+21E9

$(0,0)$: ↔ U+2194, ↕ U+2195, ⇔ U+21D4, ⇕ U+21D5, ⥀ U+2940, ⥁ U+2941

$(0,1)$: ↑ U+2191, ⇑ U+21D1, ⇧ U+21E7

$(1,-1)$: ↘ U+2198, ↳ U+21B3, ⇘ U+21D8

$(1,0)$: → U+2192, ⇒ U+21D2, ⇨ U+21E8

$(1,1)$: ↗ U+2197, ↱ U+21B1, ⇗ U+21D7

上表中每一行冒号右侧的箭头都可能出现,表示从$(x,y)$移动到$(x+a,y+b)$,其中$(a,b)$是该行冒号左侧的坐标。

本题难度:



解答

共30个箭头,经过观察和尝试,将它们按下面代码中的顺序排列,如此则若i,j模10的余数相同,那么第i个箭头和第j个箭头所对应的的移动完全相同。

用字符串查找的方式定位输入的是第几个箭头,找出其对应的移动方向(这样比用字典实现更短),移动后输出即可。

代码的压缩主要体现在箭头的上述周期性排列中。

最终代码行有三行。

代码长度:212字节 vs. 全站第一:98字节。

import sys
u=v=0
for d in sys.argv[1:]:a="←↑→↓↔↕↖↗↘↙⇐⇑⇒⇓⇔⇕⇖⇗⇘⇙⇦⇧⇨⇩⥀⥁↰↱↳↲".find(d);u+=int(("2343332442"*3)[a])-3;v+=int(("3432334422"*3)[a])-3;print(u,v)