曼哈顿旋转距离序列


9

我虽然这将是一个很好的挑战:http : //adventofcode.com/2016/day/1

任务描述

给定遵循模式(L | R)[1-9] [0-9] *的一系列旋转和距离,给出起点和终点之间的曼哈顿距离,即在垂直方向和水平方向上移动的最小次数一个网格。

例子

例如,如果我们假设您开始面对北方:

沿R2行驶,L3离开您,向东2个街区,向北3个街区,或距您5个街区。R2,R2,R2在距离您的起始位置以南2个街区的地方,向您离开了2个街区。R5,L5,R5,R3距离您12个街区。

技术细节

您可以在移动之间选择分隔符(例如:“ \ n”,“,”或“,”)。您必须以10为底的整数给出答案。

不能重复!

由于多种原因,它不是重复的:

  • 动作不一样。在这里,它们是旋转,而不是方向。
  • 我要曼哈顿的距离,而不是欧洲人的距离。

3
您应该在问题中包含关于曼哈顿距离的描述。仅发布链接是一种俗气。
加布里埃尔·贝纳米

2
完全不同!我们只有轮换!
Labo

1
@Labo,我同意。这不仅是因为答案在曼哈顿距离而另一个答案在欧几里德距离这一事实。这具有乌龟式运动,而另一种则指定罗盘方向NSEW(实际上称其为UDLR是无关紧要的。)
Level River St

2
在将来将其发布到主站点之前,请使用沙盒获取有关您的挑战的反馈。
Mego

2
@Labo很好,我们不希望新用户立即知道此站点的所有内容。这只是下一次的温和建议。:)
Mego

Answers:


4

Python 3中,109个 99 104 101字节

这是一个使用复数的简单答案,输入形式为以空格分隔的字符串或以换行符分隔的字符串。欢迎打高尔夫球!

编辑: -13字节感谢Labo。+5个字节,用于转换为int。

d=p=0
for r in input().split():d+=1-2*(r<'R');p+=1j**d*int(r[1:])
print(int(abs(p.real)+abs(p.imag)))

开球

def manhattan_rotation(seq, nsew=0, pos = 0):
    for rot in seq.split():
        # change direction
        if rot[0] == "L":
            nsew += -1 
        else:
            nsew += 1
        # move in that direction rot[1:] times
        pos += 1j ** nsew * int(rot[1:])
    return int(abs(pos.real)+abs(pos.imag))

1-2 *(r [0] <'R')将为您节省2个字节:)
Labo

不要创建函数,从输入中读取内容可以节省更多字符!
Labo

在同一行中分配2个变量以保存2个字节:d = p = 0
Labo

我再次打高尔夫球,你的答案,使99个字符!pastie.org/private/hm7lejqosdqnkgo000u7q
Labo

2
@Labo我不确定您是否可以以使现有答案无效的方式编辑规范,但让我问一些mod。
Sherlock16年

2

PHP,93字节

while($m=$argv[++$i])${chr(80|3&$d+=(P<$m)-(M>$m))}+=substr($m,1);echo abs($P-$R)+abs($Q-$S);

分解

while($m=$argv[++$i])       // loop through arguments:
    ${                      // 5. use as variable name
        chr(                // 4. cast to character (P,Q,R,S) 
        80|                 // 3. add 80
        3&                  // 2. modulo 4
        $d+=(P<$m)-(M>$m)   // 1. change direction depending on letter
    )}+=substr($m,1);       // 6. add number to variable
echo abs($P-$R)+abs($Q-$S); // calculate distance, print

2

Python 2,86个字节

x=y=0
for d in input().split():c=cmp(d,'M');x,y=int(d[1:])-y*c,x*c
print abs(x)+abs(y)

跟踪当前xy坐标。旋转时,不更新方向,而是旋转当前值,以使运动始终沿x正方向。复数太昂贵,无法从中提取坐标。


1

Python 2中,103个 102字节

l=c=0
for i in input().split():c+=cmp(i[0],'N');l+=1j**c*int(i[1:])
print int(abs(l.imag)+abs(l.real))

代表

输入是一串用空格分隔的方向,例如"R5 L5 R5 R3"
打印出起始位置和目的地之间的曼哈顿距离。

怎么样?

从复杂平面的原点开始l=0

带有累计的向右转四分之一计数器c=0

对于每个指令,i旋转都是通过将方向的第一个字符与字符进行比较来解析的'N',并相应地c进行调整。

于行驶的距离进行解析int(i[1:])和指令是通过取该许多块尺寸在通过取所述给定方向的步骤颁布c的次方0+1j1j**c

曼哈顿的最终距离是在两个方向上(虚部和实部)到原点的绝对距离之和。通过实现abs(l.imag)+abs(l.real)


1
@ Sherlock9-哦,答案收敛了。切换到Python 2并使用cmp类似我的答案的方法节省2个字节,请告知我,然后将其删除。
乔纳森·艾伦

0

的JavaScript(ES2016),98 100

@Neil保存了2个字节

d=>d.replace(/.(\d+)/g,(d,l)=>(o+=d>'M'||3,l*=~-(o&2),o&1?x-=l:y+=l),x=y=o=0)&&(x*x)**.5+(y*y)**.5

ES6为100字节

d=>d.replace(/.(\d+)/g,(d,l)=>(o+=d>'M'||3,l*=~-(o&2),o&1?x-=l:y+=l),x=y=o=0)&&(x>0?x:-x)+(y>0?y:-y)

少打高尔夫球

d => d.replace(/.(\d+)/g,
  (d,l)=>( // L or R in d, distance in l
    o += d>'M' || 3, // orientation in o, used %4
    l *= ~-(o&2), // convert to number and change sign if needed
    o&1 ? x -= l : y += l // move based on orientation
  ), x = y = o = 0)
&& (x>0?x:-x) + (y>0?y:-y)

测试(ES6)

F=
d=>d.replace(/.(\d+)/g,(d,l)=>(o+=d>'M'||3,l*=~-(o&2),o&1?x-=l:y+=l),x=y=o=0)&&(x>0?x:-x)+(y>0?y:-y)

function update() {
  O.textContent=F(I.value)
}

update()
<input id=I value='R5, L5, R5, R3' oninput='update()'><pre id=O></pre>


1
我的ES6回答原为106字节;复制您的中间变量可以节省3个字节;从match切换到replace节省了2个字节,同时复制方向和距离为我节省了最后一个字节,结果是:s=>s.replace(/.(\d+)/g,(c,n)=>(d+=c<'R'||3,n*=~-(d&2),d&1?x+=n:y+=n),x=y=d=0)&&(x<0?-x:x)+(y<0?-y:y),由于c<'R'||3n*=~-(d&2)技巧,现在比ES6答案短了两个字节。
尼尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.