ナビゲーターになる


8

ああ、いや、私はマラコフの素晴らしい宝物を見つける途中で道に迷っています!そして、私が持っているのは、これらの役に立たない指示のように見えるだけですS10R10D30...私はそれらが何を意味するのか分かりません!手伝って頂けますか?

チャレンジ

からなる方向を指定してN E S W U D L R 1 2 3 4 5 6 7 8 9 0、これらの方向(つまり、ユークリッド距離)をたどったときに、開始地点からの距離を出力します。

N E S W 私が北、東、南、西を回っているのを参照してください。

U D L R私が上、下、左、右を回していることを参照してください(そうNRはと同じEですSL。そうです;はとSLL同じですN)。アップとは、前進し続けることを意味します。ダウンとは、向きを変えることを意味します。

各文字の方向の後に数字が表示されます。これは、その方向に進む距離です。N10E20つまり、北に10ユニット移動してから、東に向けて、20ユニット東に移動します。

入力詳細

  • 入力は常に次のいずれかで始まりNESWます(したがって、空白の入力を考慮する必要はありません)。
  • 続けて2文字の指示が許可されます。NE「北に曲がって、すぐに東に曲がってください」と解釈されるべきです。それはちょうど同じEです。SLL「南に曲がって、すぐに左に2回回す」です。と同じNです。
  • すべての数値は整数になります(.文字セットに含まれていないことに注意してください)
  • 入力は次のもののみで構成されますNESWUDLR1234567890(Cの '\ 0'のような何か他のものが必要な場合、または言語の入力関数に末尾の改行がある場合は、それで問題ありません)。

出力

  • 規範。
  • 関数を使用する場合、数値データ型または文字列を出力する必要があります。
  • 小数点以下3桁まで正確でなければなりません。

テストケース

  • N10: 10
  • N10E10: 14.1421
  • N10S10: 0
  • NSEWUDLR10: 10
  • N100RR20E300D40L12: 268.7452
  • ERR10LL20UN30D100: 70.71067

これらを作成するために使用した想像力に欠けるPythonプログラム。

勝利

これはコードゴルフなので、1週間後の最下位バイトが勝ちます。


@AdmBorkBorkそうです。レモン編集。
— Quelklef 2017


@AdmBorkBork これもですが、すべて少し異なります。
— Quelklef 2017

入力が次のもののみで構成されていると想定できますNESWUDLR1234567890か?
— darrylyeo 2017

@darrylyeoもちろん、編集させてください。
— Quelklef 2017

回答:


2

(Go)Ruby、111バイト

x=0
c=1,1i,-1,-1i
gs.sc(/(\w)(\d*)/){|o,a|x+=c.ro!('URDL'.ix(o)||'NESW'.ix(o)+c.ix(1)).fs*a.toi}
p Mh::hy *x.rc

オンラインでお試しください!

STDINで入力を取り、STDOUTで出力します。

基本的に、このアプローチは複素数を使用して現在の位置cと各方向のオフセットを含むスタック()を格納します。方向がの場合、URDLスタックはその文字列の方向のインデックスによって回転します。方向がの場合、NESWその文字列の方向のインデックスと1スタック内ののインデックスによって回転されます。これにより、現在の位置を基準とした回転が1の位置を基準とした回転に変換されます。いずれの場合も、スタックの最上部に方向のステップ数が乗算され、現在の位置に追加されます。


「(Go)Ruby」とは?
— Carcigenicate 2017

@CarcigenicateこれはRubyです。インタプリタは、ゴルフに適した特別なフラグでコンパイルされています。その他の変更の中でも、メソッド名を短縮し、特定の組み込みの動作を変更することができます。私のTiOリンクにアクセスすると、ヘッダーにコードが表示されます。これは、行われる変更の大部分です。
— Tutleman 2017

4

Python 3、137バイト

v=n=0
d=1
for i in input()+'U':x="NUERSDW0123456789".find(i);c=x<7;v+=d*n*c;n=[n*10+x-7,0][c];d=[d,d**(x%2)*1j**(~-x/2)][c]
print(abs(v))

オンラインでお試しください!

ジョナサンアランのおかげで-9バイト


:あなたは、else節と6バイト保存することができますelse:v+=d*n;n=0;h='NUERSDW'.find(i);d=d**(h%2)*1j**(~-h/2)注- Lここでは検索文字列の末尾からloppedことができますので、-1%2イコール7%2と1j**(-1)等しいです1j**3。
— ジョナサンアラン

@JonathanAllan素敵なトリック!ありがとう!
— HyperNeutrino 2017

:のためにインライン化することにより、他の3保存for i in input()+'U':x="NUERSDW0123456789".find(i);c=x<7;v+=d*n*c;n=[n*10+x-7,0][c];d=[d,d**(x%2)*1j**(~-x/2)][c]
— ジョナサン・アラン

@JonathanAllanこんにちは、ありがとう!
— HyperNeutrino 2017

Pythonの答えで自分の手を試してみましたが、179バイトを下回ることはできませんでした。ブラボー。
— Quelklef 2017

2

JavaScriptの(ES6)、148の 142 140 138 137 134バイト

s=>s.replace(/\d+|./g,_=>~(i='NESW'.search(_))?d=i:~(i='URDL'.search(_))?d+=i:a[d&3]+=+_,a=[0,0,0,0])&&Math.hypot(a[1]-a[3],a[0]-a[2])

-2バイト:(@Shaggy)の.search()代わりに使用.indexOf()

-1バイト:プログラムを再配置して、括弧を削除します(@Shaggy)

-3バイト:(@ThePirateBay)の.replace()代わりに使用.match().map()


最後から2番目のテストでは、さまざまな答えが得られます。
— Quelklef 2017

@Quelklef修正済み。
— darrylyeo 2017

search代わりにを使用して数バイトを節約できますindexOfか?
— Shaggy 2017

に移動aしてmap、,前Mathをで置き換え、&&括弧を削除することで、バイトを保存することもできると思います。
— Shaggy 2017

@シャギー素晴らしい、ありがとう!
— darrylyeo 2017

0

Perl 5、149 + 1(-p)= 150バイト

while(s/(\D+)(\d+)//){$p=/N/?0:/E/?1:/S/?2:/W/?3:/L/?$p-1:/R/?$p+1:/D/?$p+2:$p for split//,$1;$m[$p%4]+=$2}$_=sqrt(($m[0]-$m[2])**2+($m[1]-$m[3])**2)

オンラインでお試しください!

説明:

# Each direction is assigned a number:
#
#     0     North
#     1     East
#     2     South
#     3     West
#
# Variables:
#     $p     present direction
#     @m     total movement in each direction
# Inside loop:
#     $1     a set of direction instructions
#     $2     distance

while(s/(\D+)(\d+)//)    # Remove and preserve the first direction set and distance
   for split//,$1        # Loop through individual letters to set new direction
      $p=/N/?0:          # North
         /E/?1:          # South
         /S/?2:          # East
         /W/?3:          # West
         /L/?$p-1:       # Turn left
         /R/?$p+1:       # Turn right
         /D/?$p+2:       # Turn around
         $p              # Do not change direction
   $m[$p%4]+=$2          # Add the directional movement to previous movements

   $_=sqrt(              # Calculate distance
       ($m[0]-$m[2])**2  # Net North/South movement
      +($m[1]-$m[3])**2  # Net East/West movement
      )
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.