マンハッタンの周りを歩いていますが、ホテルからどれくらい離れていますか?


27

不要で複雑な話

私はブロックごとにマンハッタンを歩いていますが、足が疲れて家に帰りたいと思っています。

交通はかなり悪いですが、幸いなことに私はとても裕福で、ホテルで待機しているヘリコプターを持っています。しかし、私は彼らがフライトのためにどれだけの燃料を詰め込むかを知る必要があり、そのために彼らはホテルからの私の直接距離を知る必要があります。私はどのブロックを歩いたかを覚えていて、どのルートを取ったかを伝えることができました。ただし、この距離は正確である必要があります。距離が短すぎると戻れず、長すぎて使用できない燃料を買いました。

それを取得するためにフライトで移動する必要がある距離に変換するプログラムを作成できますか?

仕様:

次の関数を書いてください:

  1. 任意のグリッドに関連して歩いたブロックのリストまたは文字列を受け入れます。
    • U p、D所有、L eftおよびR ight。
    • 大文字でも小文字でもかまいません-例えば。先uU進む代わりに使用する方が短い場合。
    • 無効な方向には未定義の動作があります-例えば。Xの方向は障害を引き起こす可能性があります。
  2. 原点からの直線距離の2倍のfloat / decimal / doubleを返します。

イラストと説明のため:

私の旅行

私の旅は、同じように簡単に記録されている可能性"luluu..."['l','u','l'...]、それは上、下、左、右のように記録されなければなりません。


15
あなたはヘリコプターを持っているのに十分な金持ちですが、余分な燃料が買われても気にしますか?:O
フェズブラスタ14

8
@fezvrasta私はケチだから

7
マンハッタンの距離についてこれを作らないことによって私の頭を台無しにする方法。
ケンドールフレイ14

25
正解は「それは問題ではない。あなたは金持ちだから、ポケットに手を入れて20ドルの札束を引き出し、空中でそれを振ってキャビーの注意を引き付ける。あなたはその後、幼稚園の凶悪犯のグループがあなたを強奪し、血まみれのパルプに叩きつけます。有罪判決を受け、刑務所に送られ、ブルータスと呼ばれるセルメイトに閉じ込められた歩道は、あなたを本当に強く好みます。ニューヨークへようこそ!」
ボブジャービス-モニカの復活14年

2
@McKay私はそれをとにかく地図上の方向として解釈します(そうでなければ、おそらく「前方」と「後方」になります)、そして距離の測定はかなり明確な「原点から直線距離の2倍」です。マンハッタン距離)。
FireFly 14

回答:


32

J、17文字

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

の力がj適切な方向を表すという事実を使用しています。

  • 'urdl'i. 文字列を取り、インデックスを計算します(「u」の場合は0、「r」の場合は1、...)
  • 0j1^の対応する累乗を使用して、複素平面の方向に変換しjます。
  • +/ 単一のステップを要約します
  • 2*| モジュラスの2倍

例:

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

5
良くやった。勝利のための数学の知識。:
ガレス14

この「非拡張」ASCIIを作成すると、わずか15バイトになります(8ビット目を使用しないため)。
ティムテック14

11

Python 2.7 56 58 56 51 48

スクルージ・マクダックから盗まれたナンバーワン・ダイムで、私は財産を作り、スクルージよりも多くの富を手にしました。

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

Pythonの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

@plannapus:実装セクションを追加しました
Abhijit 14

ああ、そうでは%5なかった%8。それは今より理にかなっています:)
plannapus 14

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 1行の入力を取得し、文字に分割します
  • <U R L D> 単語のリスト、この場合は文字
  • (1,2,3) Z (4,5,6)== (1,2), (2,5), (3,6)ので、2つのリストを相互に圧縮%()し、ハッシュに変わる区画のリストを作成します
  • <<**>>pairwiseを実行し**、長いリストに合わせて短いリストを拡張します。短いリストはたまたま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 14

1
スクルーおじさん、嫌いだ。少なくともneのためにいくらかお金を残すべきです。
アビジット2014

1
@DavidCarraher:いいえ、できません。変数jと虚数単位を区別することは不可能ですj
Abhijit 14

2倍の距離を出力すると想定されていませんでしたか?UUUUDRRRLを試してみると、7.21ではなくこの関数で3.606を取得しています。
プランナパス14

4
2最終結果を乗算する代わりに定数を乗算することにより、さらに2文字を保存できます。
アビジット2014

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 14

1
はい、しかしOPはそのような入力で失敗してもいいと言います。それは私と他の皆がそれを解釈する方法です。私はこれらの他の言語を読むことはできませんが、それらはしばしばu、r、l、dのハードコーディングをしていることがわかります。

OK。とった。それを指摘してくれてありがとう。
DavidC

残りの2組の括弧を@sに置き換えると、さらに2文字少なくなります。
shrx 14

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行に切り分けます:

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

-/ 上から下を引きます

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

+&.*:今朝見た別のJの回答からトリックを借り、項目を二乗し、それらを合計してから平方根を実行します。ドキュメントの下を&.参照してください:

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

+: 結果を2倍にします。

   +:+&.*:/-/_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アップ」であると仮定しましたので、2つのユニットが「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);}}

ブリーフの私の理解は、プログラム全体ではなく機能のみが必要であるということでした。
ボアン14

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
  • 文字列または配列(小文字)を受け入れます
  • 虚数を使用しません
  • OPが質問を投稿する3日前には不可能だったでしょう。つまり、Firefox 27以降でのみ実行されます(また、実験的なものが有効になっているChromeもテストされていません:)。

(Boannの回答に一部影響を受けています。)


本当にすべてをブール式に変換して、自動的に評価されて自動的に返されるなど、リターンを取り除くために何かトリッキーなことをしたいのですが、forステートメントをいくつかに置き換えることができない限り、これを行う方法はありません式(ステートメントを含む矢印関数の本体には、括弧と明示的な戻り値が必要ですが、単なる式の本体には必要ありません。)
Noyo 14

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(ES6なし、評価なし)-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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.