我正在曼哈顿走来走去,离酒店有多远?


27

不必要而复杂的故事

我在曼哈顿走来走去,一步一步走,我的脚已经累了,想回家。

交通非常糟糕,但是幸运的是我非常有钱,而且我有一架直升飞机在酒店待命。但是我需要他们知道为飞机加油多少,并且他们需要知道我与酒店的直接距离。我确实记得我走过哪些街区,可以告诉他们我走了什么路线。但是,该距离需要精确,如果它们太短,我们将不会返回太长,并且我已经购买了无法使用的燃料。

您能给我写一个程序,将其转换成他们要乘飞机旅行所要经过的距离吗?

规格:

给我写一个函数:

  1. 接受相对于任意网格行走的块的列表或字符串:
    • ü P,d自己,大号 EFT和- [R飞行。
    • 可以是大写或小写-例如。如果它更短u而不是U继续使用。
    • 无效的方向具有不确定的行为-例如 X方向可能会导致故障。
  2. 返回一个float / decimal / double,它是到原点的直线距离的两倍。

为了说明和澄清:

我的旅行

我的行程可能很容易被记录"luluu..."['l','u','l'...]但必须被记录为上,下,左,右。


15
您有足够的钱拥有直升机,但您是否在乎是否购买了额外的燃料?:O
Fez Vrasta 2014年

8
@fezvrasta,因为我很小气。

7
通过不讲曼哈顿距离来惹恼我的头。
肯德尔·弗雷

25
正确的答案是:“没关系。你是一个有钱人,所以你伸进口袋,掏出20美元的钞票,然后在空中挥舞,吸引出租车司机的注意;你是然后被一群幼儿园的暴徒殴打,他们抢劫了你并将其殴打成血淋淋的果肉,然后因乱抛垃圾和流浪而被捕,并被指控犯有恐怖主义罪,企图通过在公共场所散布身体渗出物来引起大规模恐慌和大流行的人行道上,一经定罪,送进监狱,并锁定了绰号布鲁特斯一个狱友谁需要一个真正强大的喜欢上你了。欢迎来到纽约!”
鲍勃·贾维斯

2
@McKay无论如何,我将其解释为地图上的方向(否则,它可能是“前进”和“后退”),并且距离量度非常明确,“距原点的直线距离是两倍”,所以没有曼哈顿距离)。
FireFly

Answers:


32

J,17个字符

2*|+/0j1^'urdl'i.

使用以下事实:的力量j代表正确的方向。

  • 'urdl'i. 接受字符串并计算索引(“ u”为0,“ r”为1,...)
  • 0j1^利用的相应幂变换到复平面中的方向j
  • +/ 总结单个步骤
  • 2*| 两倍的模量

例:

> 2*|+/0j1^'urdl'i.'uuuudrrrl'
7.2111

5
不错的工作。数学知识为赢。:-)
Gareth 2014年

设置为“非扩展” ASCII,然后它只有15个字节(因为您不使用第八位)。
Timtech

11

Python 2.7 56 58 56 51 48

使用窃取的号码1毛钱史高治·麦克老鸭,我做了我的财产,现在有比守财奴更多的财富。

y=lambda s:2*abs(sum(1j**(ord(i)%15)for i in s))

蟒2.7 - 61 53 50(不区分大小写)

y=lambda s:2*abs(sum(1j**(ord(i)%16%9)for i in s))

实作

>>> from random import sample
>>> y=lambda s:2*abs(sum((-1j)**(ord(i)%15)for i in s))
>>> path=sample('RLUD'*1000, 100)
>>> y(path)
20.0
>>> path=sample('RLUD'*1000, 100)
>>> y(path)
34.058772731852805

我越来越IndexError: list index out of range。输入内容应采用什么形式?
plannapus 2014年

@plannapus:我添加了一个实现部分
Abhijit

啊,事实%5并非如此%8。好吧,现在更有意义了:)
plannapus 2014年

5

APL(29)

{|+/2 0j2×-⌿2 2⍴+/'URDL'∘.=⍵}

例如

     {|+/2 0j2×-⌿2 2⍴+/'URDL'∘.=⍵} 'UUUUDRRRL'
7.211102551

说明:

  • +/'URDL'∘.=⍵:查看字符URDL在参数中出现的频率
  • -⌿2 2⍴:减去U从值D值,并且R从值L
  • 2 0j2×:将垂直值乘以2水平值2i
  • +/:总和
  • |:大小

4

红宝石1.9+(67)

f=->s{2*(((g=s.method :count)[?U]-g[?D])**2+(g[?R]-g[?L])**2)**0.5}

f["DRUULULLULL"] => 10.0
f["UUUUDRRRL"] => 7.211102550927978

3

perl6:44个字符

2*abs [+] i <<**>>%(<U R D L>Z ^4){get.comb}
  • get.comb 获取一行输入并拆分为字符
  • <U R L D> 是单词列表,在这种情况下为字符
  • (1,2,3) Z (4,5,6)== (1,2), (2,5), (3,6),因此它将2个列表彼此压缩,从而形成了一个列表,这些列表%()变成了一个哈希
  • <<**>>成对执行**,扩展较短的列表以适合较长的列表。较短的清单恰好是i
  • [+]对列表的所有元素求和,abs对复数取模

是的,我删除了所有可能的空格。


2

Python 2.7-65

不错,又简短,它使用复数来穿越飞机:

x=lambda s:2*abs(sum([[1,-1,1j,-1j]['RLUD'.index(i)]for i in s]))

DSM和Abhijit的其他问题道具向我展示了使用1j来计算这一点。


可以1j写成j-1j作为-j?此外,这是处理上输入还是下输入,还是仅处理上输入?
DavidC 2014年

1
斯克罗兹叔叔,我恨你。你至少应该给侄子一些钱。
阿比吉特(Abhijit)2014年

1
@DavidCarraher:不,你不能。不可能区分变量j和虚数单位j
Abhijit 2014年

您不是说应该输出两倍的距离吗?当尝试使用UUUUDRRRL时,我使用此功能而不是7.21得到3.606。
plannapus 2014年

4
通过乘以常量2而不是乘以最终结果,可以再保存2个字符。
阿比吉特

2

Mathematica 92 49

Calle因简化代码而功不可没。

f@l_:=2 N@Norm[Tr[l/.{"r"→1,"l"→-1,"u"→I,"d"→-I}]]

f[{"u", "u", "u", "u", "d", "r", "r", "r", "l"}]

7.2111


1
您可以完成OP不需要的很多工作f@l_ := 2 N@Norm[Tr[l /. {"r" -> 1, "l" -> -1, "u" -> I, "d" -> -I}]]

我得到2 Norm[(2. + 2. I) + "U" + "X"]您的代码的输出。
DavidC

1
是的,但是OP表示通过这样的输入失败是可以的。这就是我和其他所有人的理解方式。我看不到其他语言,但是您会看到它们经常对u,r,l和d进行硬编码。

好。得到它了。感谢您指出了这一点。
DavidC

如果用@s 替换剩下的两个括号对,则少两个字符。
shrx 2014年

2

PHP,67

function f($a){foreach($a as$d)@$$d++;return 2*hypot($U-$D,$L-$R);}

例:

<?php
var_dump(f(array('U', 'U', 'U', 'U', 'D', 'R', 'R', 'R', 'L')));

>float(7.211102550928)

2

朱莉娅45岁

f(l)=2*abs(sum([im^(c=='d'?3:c) for c in l]))

偷了i权力的把戏。同样,除d以外的所有字符都具有可以用作的幂的值i


1

J,29个字符

+:+&.*:/-/_2[\#/.~/:~'ruld'i.

仅适用于较低的情况下,指示和其他任何字符比rul,和d会导致它给出错误的答案。

用法:

   +:+&.*:/-/_2[\#/.~/:~'ruld'i.'uuuudrrrl'
7.2111

说明:

'ruld'i.'uuuudrrrl'二进位形式的i.表达式从左侧参数中的右侧参数中查找项目的索引。在这种情况下:

   'ruld'i.'uuuudrrrl'
1 1 1 1 3 0 0 0 2

/:~ 将该列表按升序排序:

   /:~'ruld'i.'uuuudrrrl'
0 0 0 1 1 1 1 2 3

#/.~ 计算每个数字的出现次数:

   #/.~/:~'ruld'i.'uuuudrrrl'
3 4 1 1

_2[\ 切成两行:

   _2[\#/.~/:~'ruld'i.'uuuudrrrl'
3 4
1 1

-/ 从顶部减去底部

   -/_2[\#/.~/:~'ruld'i.'uuuudrrrl'
2 3

+&.*:从今天早上看到的另一个J答案中借用了一个技巧,将项目平方,然后求和,然后求平方根。请参阅&.的文件:

   +&.*:/-/_2[\#/.~/:~'ruld'i.'uuuudrrrl'
3.60555

+: 结果翻倍:

   +:+&.*:/-/_2[\#/.~/:~'ruld'i.'uuuudrrrl'
7.2111

1

R,86 74 56个字符

好的,实际上,它与虚数相比要短得多:

2*Mod(sum(sapply(scan(,""),switch,u=1i,d=-1i,l=-1,r=1)))

用法:

> 2*Mod(sum(sapply(scan(,""),switch,u=1i,d=-1i,l=-1,r=1)))
1: u u u u d r r r l
10: 
Read 9 items
[1] 7.211103

xy坐标为74个字符的旧解决方案:

2*sqrt(sum(rowSums(sapply(scan(,""),switch,u=0:1,d=0:-1,l=-1:0,r=1:0))^2))

用法:

> 2*sqrt(sum(rowSums(sapply(scan(,""),switch,u=0:1,d=0:-1,l=-1:0,r=1:0))^2))
1: u u u u d r r r l
10: 
Read 9 items
[1] 7.211103

将输入作为标准输入,必须小写并以空格分隔。使用从(0,0)开始的xy坐标。


1

k(50 49)

{2*sqrt x$x:0 0f+/("udlr"!(1 0;-1 0;0 -1;0 1))@x}

{2*sqrt x$x:0 0f+/("udlr"!(1 0;-1 0;0 -1;0 1))@x}"uuuudrrrl"
7.211103

1

Java中,185,203204217226

class A{public static void main(String[] a){int x=0,y=0;for(int i=0;i<a[0].length();i++) switch(a[0].charAt(i)){case'U':y++;break;case'D':y--;break;case'L':x++;break;case'R':x--;}System.out.print(Math.hypot(x,y)*2);}}

我确实假设每个“ U”为“ 1 up”,所以两个单位为“ UU”

编辑:换出ifs开关

class A{public static void main(String[]a){int x=0,y=0;for(int i=0;i<a[0].length();i++){int c=a[0].charAt(i);if(c=='U')y++;if(c=='D')y--;if(c=='L')x++;if(c=='R')x--;}System.out.print(Math.hypot(x,y)*2);}}

为迭代器移动

class A{public static void main(String[]a){int x=0,y=0;for(int i=0;i<a[0].length();){int c=a[0].charAt(i++);if(c=='U')y++;if(c=='D')y--;if(c=='L')x++;if(c=='R')x--;}System.out.print(Math.hypot(x,y)*2);}}

不再将输入作为字符串,而是方向数组

class A{public static void main(String[]a){int x=0,y=0;for(String s:a){char c=s.charAt(0);if(c=='U')y++;if(c=='D')y--;if(c=='L')x++;if(c=='R')x--;}System.out.print(Math.hypot(x,y)*2);}}

我对摘要的理解是,您只需要一个函数,而不是整个程序。
Boann 2014年

1

T-SQL,158

IF PATINDEX('%[^UDLR]%', @s)=0 select 2*sqrt(power(LEN(REPLACE(@s,'U',''))-LEN(REPLACE(@s,'D','')),2)+power(LEN(REPLACE(@s,'L',''))-LEN(REPLACE(@s,'R','')),2))

@s是varchar(max)类型的输入字符串


1

ES6,77 69

定义:

f=s=>{u=d=l=r=0;for(c of s)eval(c+'++');return 2*Math.hypot(u-d,l-r)}

用法:

>>> f('uuuudrrrl')
7.211102550927979
>>> f( 'uuuudrrrl'.split('') )
7.211102550927979
  • 接受字符串OR数组(小写)
  • 不使用虚数
  • 在OP发布问题的前3天不可能 ; 也就是说,它只能在Firefox 27+中运行(也许还启用了实验性功能的Chrome浏览器,还没有经过测试:)!

(部分受Boann的回答启发。)


我真的想做一些棘手的事情来摆脱这种回报,例如将整个事情变成一个布尔表达式,该布尔表达式只是被自动求值并返回,但是我不确定是否有办法做到这一点,除非我可以for用一些替换语句表达式(包含语句的箭头函数主体需要方括号和显式返回,而仅是表达式的主体则不需要)
。–

1

JavaScript-142个字符-没有eval()

function r(a){return Math.sqrt(Math.pow(a.match(/u/g).length-a.match(/d/g).length,2)+Math.pow(a.match(/l/g).length-a.match(/r/g).length,2))*2}

其中a是类似于“ uudrrl”的字符串

这样使用-

a='uudrrl'
r(a)

在浏览器控制台中测试。

var x = "luluurrrrurd"
r(x)
8.48528137423857

1

C#-90个字符

来自LINQPad。

int x=0,y=0;input.Max(i=>i==85?y++:i==82?x++:i==68?y--:x--);(Math.Sqrt(x*x+y*y)*2).Dump();

输入是有效字符串。

>string input = "LULUURRRRURD";

>8.48528137423857

0

Befunge-93(65)

它具有65个非空白字符(带有空格的217个字符,不过可以通过更紧凑的布局来减少(对于69/176个字符))。输出格式需要一定的自由度,但无疑是准确的。似乎不值得为实现/窃取平方根实现而付出的努力。

v                  >$:*\:*+88*4*5-2.,.@
               >3-:|
           >6-:|
       >8-:|
>~"D"-:|
       $   $   $   $
           \   \
       1   1   1   1
       -   -   +   +
           \   \
^      <   <   <   <

echo 'UUDLLUU' | ./befungee.py ../man 输出2√13(实际上,扩展ASCII似乎实现上有问题)。


0

Matlab,51个字符

我的Matlab提交内容仅适用于大写字母。这是一个有趣的!最困难的部分是将字符串转换为要求和的复数数组。

功能:

f=@(s)abs(sum(fix((s-76.5)/8.5)+((s-79)*i/3).^-99))

用法:

>> f=@(s)abs(sum(fix((s-76.5)/8.5)+((s-79)*i/3).^-99))
>> f('UURDL')
ans =

     1
>>

0

JavaScript 136

function z(a){var x=a.split('u').length-a.split('d').length;var y=a.split('r').length-a.split('l').length;return Math.sqrt(x*x+y*y)*2;};
document.write(z('uuuudrrrwl'));
7.211102550927978

0

JavaScript,89

function f(a){U=D=L=R=0;for(d in a)eval(a[d]+'++');return 2*Math.sqrt((U-=D)*U+(L-=R)*L)}

例:

<script>
document.write(f(['U', 'U', 'U', 'U', 'D', 'R', 'R', 'R', 'L']));
</script>

>7.211102550927978

0

C,120

float d(char *p){int v=0,h=0;while(*p){v+=*p=='U'?1:*p=='D'?-1:0,h+=*p=='R'?1:*p=='L'?-1:0,++p;}return 2*sqrt(v*v+h*h);}

d("LULUURRRRURD") -> 8.485281


0

JavaScript(no ES6,no eval)-131

f=function(h){for(i=0,a=[0,,0,0,0];i<h.length;++i)++a[(h.charCodeAt(i)>>2)-25];x=a[0]-a[4];y=a[2]-a[3];return Math.sqrt(x*x+y*y)*2}

测试:

console.log(f('uuuudrrrl'));     // 7.211102550927978 
console.log(f('luluurrrrurd'));  // 8.48528137423857
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.