マンハッタンの回転シーケンスの距離


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
質問には、マンハッタンの距離についての説明を含める必要があります。リンクを投稿するだけでもちょっと厄介です。
— ガブリエルベナミー16

2
とても違います!ローテーションしかない!
— Labo

1
@ラボ同意する。ここでの答えはマンハッタン距離にあるのに対し、もう1つはユークリッド距離にあるという事実だけではありません。これは、亀スタイルの動きを持っているが、他のいずれかを指定コンパス方向NSEW(それはそれらをUDLRは無関係です呼び出すという事実。)
— レベル川セント

2
今後、サンドボックスを使用して、メインサイトに投稿する前に、課題についてフィードバックを得てください。
— Mego

2
@Laboそれは結構です、私たちは新しいユーザーがこのサイトのすべてのインとアウトをすぐに知ることを期待しません。それは次回の穏やかな提案に過ぎません。:)
— Mego

回答:


4

Python 3、109 99 104 101バイト

これは、スペースで区切られた文字列または改行で区切られた文字列として入力された、複素数を使用する単純な答えです。ゴルフの提案を歓迎します!

編集:ラボのおかげで-13バイト。+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既存の回答を無効にするような方法で仕様を編集できるかどうかはわかりませんが、いくつか変更をお願いします。
— Sherlock9

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)

現在xとy座標を追跡します。回転すると、方向を更新するのではなく、現在の値を回転して、モーションが常に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))

repl.it

入力は、スペースで区切られた方向の文字列です(例:)"R5 L5 R5 R3"。
出発地と目的地の間のマンハッタン距離を印刷します。

どうやって?

複雑な平面の原点から始まりl=0ます。

累積的な四分の一右折カウンターでc=0、

各命令iの回転は、方向の最初の文字を文字と比較することによって解析され'N'、cそれに応じて調整されます。

移動距離はで解析int(i[1:])されc、0+1jwithの累乗を取ることで指定された方向に、ブロックサイズのステップを多数実行することにより、命令が実行されます1j**c。

最終的なマンハッタン距離は、原点からの2つの方向(虚数と実数)の絶対距離の合計です。で達成abs(l.imag)+abs(l.real)


1
@ Sherlock9-ああ、ええと、収束に答えます。Python 2に切り替えて2バイトを節約しcmp、私の答えのように使用して、知らせてください。削除します。
— ジョナサンアラン

0

JavaScript(ES2016)、98 100

2バイト節約@Neil

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バイト節約されました。一致から置換に切り替えると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'||3とn*=~-(d&2)トリックのおかげで、ES6の回答よりも2バイト短くなりました。。
— Neil
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.