今どこにいるの?


21

今どこにいるの?

d文字のみを含む文字列を指定しますNSWE移動した座標(左から右へ、貪欲に消費)と、私が住んでいる最終的な座標が決まります。

左から右へ座標を読み取るための規則:

  • 次の文字がNまたはの場合S
    • Norの後の文字Sが別のNorである場合S
      • 最初Nまたはのみを消費しSます。
      • 出力[0,1]N
      • 出力[0,-1]S
    • Norの後の文字がorでSあるW場合E
      • 両方の消費NまたはSおよびWまたはE
      • 出力[1,1]または[-1,1]for NEおよびNW
      • 出力[1,-1]または[-1,-1]for SEおよびSW
  • 文字がEorのW前にあるSかどうかN
    • Eまたはを消費しWます。
    • 出力[1,0]のためにE
    • 出力[-1,0]のためにW

実施例

NSWE

[0,1]   (North      N)
[-1,-1] (South-west SW)
[1,0]   (East       E)
[0,0]   (N+SW+E = Didn't actually move)

これは任意の形式にすることができます。有効な出力の他の例を次に示します。

[[0,1],[-1,-1],[1,0],[0,0]]


[[[0,1],[-1,-1],[1,0]],[0,0]]


"0,1\n0,-1\n-1,0\n1,0\n0,0"

等...


その他の例

SWSENNESWNE

[-1,-1]
[1,-1]
[0,1]
[1,1]
[-1,-1]
[1,1]
[1,0]

NNEESESSWWNW

[0,1]
[1,1]
[1,0]
[1,-1]
[0,-1]
[-1,-1]
[-1,0]
[-1,1]
[0,0]

ねねね

[1,1]
[1,1]
[1,1]
[1,0]
[4,3]

ねん

[1,1]
[0,1]
[1,2]

EEE

[1,0]
[1,0]
[1,0]
[3,0]

ルール

  • 抜け穴に違反しない便利な形式で出力できます。
  • あなたは貪欲に消費しなければなりませNWEN,W,E、決して、それは常にNW,Eです。
    • これが適用されます:SW*SE*NW*NE*
    • あなたは貪欲に左から右に消費しています。
  • これは、バイト数が最も少なくなります。

「旅行した座標を決定する」:後で説明するものと本当に一致するかどうかはわかりません。それは「私のすべての動きのベクトルを決定する」ようなものです。最終出力のみが実際の座標です。
アーナウルド

1
そこまで歩いていくテストケース[4, 3]は、テスト出力で何が起こっているかを少し見やすくします。
リン

3
複素数1-1j(-1+1j)などの形式で有効な出力形式ですか?
リン

2
与えられたルールと例の両方にこのケースがないことに基づいて、input-Stringが「N」または「S」で終わることはないと思いますか?
ケビンクルーッセン

1
貪欲な消費は実際にそうではありませんか?以来はNEちょうどであるN+Eそれは問題ではないではないでしょうか?
小麦ウィザード

回答:


7

Python 2、116バイト

import re
a=[(int(s,35)%5-3,('N'in s)-('S'in s))for s in re.findall('[NS][EW]?|.',input())]
print a,map(sum,zip(*a))

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

出力として[(3+4j), 1, -1j, …]、91バイト

lambda x:[sum(1j**(ord(c)%8%5)for c in s)for s in[x]+re.findall('[NS][EW]?|.',x)]
import re

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

このラムダは、ガウス整数のリストを返します。最初の座標は最終座標であり、他のすべてはそこに到達するために必要なステップです。


5

アタッシュ、80バイト

V#Sum##{Chop[1-ToBase[22260446188,3],2][Sum@Ords=>MatchAll[_,/"[NS][WE]|."]%11]}

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

これは、1つの文字列引数を取る匿名関数です。

説明

最初のタスクは、この質問の解析フェーズを実装することです。入力を解析するために単純な正規表現を使用するのが最短であることがわかりました(_):

MatchAll[_,/"[NS][WE]|."]

これは、正規表現のすべての出現に一致します [NS][WE]|.他の多くの回答に見られるようます。これにより、要求された方向が貪欲に得られます。

次に、ハッシュ関数を各ディレクトリに適用します。各方向のコードポイントを取得し、それらを合計します。これにより、次のマッピングが得られます。

Direction       Ord-sum
E               69
N               78
S               83
W               87
NE              147
SE              152
NW              165
SW              170

これらの値をより小さなドメインにマップしようとします。モジュロはこれに役立ち、与えられたすべての入力に一意の値をもたらす最小のモジュロが11であることを示すことができます。剰余でソートすると、次の表が得られます。

Direction       Ord-sum         % 11
NW              165             0
N               78              1
E               69              3
NE              147             4
SW              170             5
S               83              6
SE              152             9
W               87              10

これで、によるエンコードとして、入力対応ができましたSum@Ords=>[...]%11。次に、これらの剰余をポイントに変換する必要があります。別のマッピングの導出を試みます。つまり、方向に対応しないハッシュに「スパース充填値」を挿入することは有用です。

Direction       Hash        Coordinates
NW              0           [-1, 1]
N               1           [0, 1]
--             (2)          [0, 0]
E               3           [1, 0]
NE              4           [1, 1]
SW              5           [-1, -1]
S               6           [0, -1]
--             (7)          [0, 0]
--             (8)          [0, 0]
SE              9           [1, -1]
W               10          [-1, 0]

現在、ハッシュでインデックス可能なリストを提供できる一連のポイントがあります。

[-1, 1] [0, 1] [0, 0] [1, 0] [1, 1] [-1, -1] [0, -1] [0, 0] [0, 0] [1, -1] [-1, 0]

さて、これを圧縮して、-1s、0s、および1s のみで構成されているものと見なします。リストはペアを表すため、データを失うことなくリストをフラット化できます。次に、各数値を取得してx計算する1-xと、次のリストが取得されます。

2 0 1 0 1 1 0 1 0 0 2 2 1 2 1 1 1 1 0 2 2 1

これを基数3の数値に変換できます。

20101101002212111102213

ベース10への変換:

20101101002212111102213 ≡ 2226044618810

要約すると、我々はポイントを撮影した、それらをアンペア、から差し引か各要素を取っ1て、ベースから変換3私たちを与えます22260446188。このように解凍できます:

  1. 3を基数に変換 ToBase[22260446188,3]
  2. 1から減算された各数値を取得します(自己反転): 1-ToBase[22260446188,3]
  3. リストを再ペアリングします。 Chop[1-ToBase[22260446188,3],2]

これにより、元のペアのセットが得られます。その後、次のように前述のインデックス作成を実行できます。

(chopped value)[hashes]

Attacheでは、配列によるインデックス付けは、それらのインデックスに対応するすべての要素を返すためです。(つまり、[1,2,3,4][ [0,0,-1,1] ] = [1,1,4,2]。)これで、OPがたどったパスの方向がわかりました。残っているのは、合計を計算することです。

そのため、この結果をラムダでキャプチャし、{...}それを関数構成(a##b)の最初の関数として配置しV#Sumます。これはフォークであり、inputを指定するとx、次のように展開されます。

V[x, Sum[x]]

Sum、2D配列が与えられると、配列内のすべての列を合計します(ベクトル化された合計の結果として)したがって、これにより、方向と最終目的地がペアになり、最終結果が得られます。


4

JavaScript(ES6)、102バイト

文字列を返します。

s=>s.replace(/[NS][EW]|./g,s=>(D=d=>!!s.match(d),x+=h=D`E`-D`W`,y+=v=D`N`-D`S`,[h,v]+`
`),x=y=0)+[x,y]

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


テンプレート関数の使用が好きです!:D
コナーオブライエン

@ ConorO'Brienええ、彼らはここでかなり便利です。これまでに召喚したすべてのハッシングソーサリースペルは、少なくとももう少し長くなります。
アーナウルド

4

MATL、45バイト

'NS' 'WE'Z*Z{2MhX{h'eklihfmj'X{YX9\3_2&YAqts

オンラインでお試しください!または、すべてのテストケースを確認します

説明(例付き)

'NSWE'例として入力を検討してください。

'NS' 'WE'  % Push these two strings
           % STACK: 'NS', 'WE'
Z*         % Cartesian product. Gives a 4×2 char matrix
           % STACK: ['NW'; 'NE'; 'SW'; 'SE']
Z{         % Cell array of rows (strings)
           % STACK: {'NW', 'NE', 'SW', 'SE'}
2M         % Push again the inputs of the second-last function call
           % STACK: {'NW', 'NE', 'SW', 'SE'}, 'NS', 'WE'
h          % Concatenate horizontally
           % STACK: {'NW', 'NE', 'SW', 'SE'}, 'NSWE'
X{         % Cell array of individual elements (chars)
           % STACK: {'NW', 'NE', 'SW', 'SE'}, {'N', 'S', 'W', 'E'}
h          % Concatenate horizontally
           % STACK: {'NW', 'NE', 'SW', 'SE', 'N', 'S', 'W', 'E'}
'eklihfmj' % Push this string
           % STACK: {'NW', 'NE', 'SW', 'SE', 'N', 'S', 'W', 'E'}, 'eklihfmj'
X{         % Cell array of individual elements (chars)
           % STACK: {'NW','NE','SW','SE','N','S','W','E'},{'e','k','l','i','h','f','m','j'}
YX         % Implicit input. Regexp replace: replaces 'NW' by 'e', then 'NE' by 'k', etc.
           % Note that the two-letter combinations are replaced first, which implements
           % the greediness; and the target letters do not appear in the source, which
           % avoids unwanted interactions between replacements
           % STACK: 'hlj'
9\         % Modulo 9 (of codepoints), element-wise
           % STACK: [5, 0, 7]
3_2&YA     % Convert to base 3 with 2 digits. Gives a 2-column matrix
           % STACK: [1, 2; 0, 0; 2, 1]
q          % Subtract 1, element-wise
           % STACK: [0, -1; -1, -1; 1, 0]
tXs        % Duplicate. Sum of each column
           % STACK: [0, -1; -1, -1; 1, 0], [0, 0]
           % Implicit display

4

Java(JDK 10)、171バイト

s->{var r="";int i=0,l=s.length,c,x=0,y=0,Y,X;for(;i<l;X=c>1||i<l&&(c=~-s[i]/6%4)>1&&++i>0?c*2-5:0,r+=X+","+Y+" ",x+=X,y+=Y)Y=(c=~-s[i++]/6%4)<2?1-c*2:0;return r+x+","+y;}

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

説明

のおかげc=~-s[i]/6%4で、次のマッピングが行われます。

'N' -> ascii: 78 -> -1 = 77 -> /6 = 12 -> %4 = 0
'S' -> ascii: 83 -> -1 = 83 -> /6 = 13 -> %4 = 1
'W' -> ascii: 87 -> -1 = 86 -> /6 = 14 -> %4 = 2
'E' -> ascii: 69 -> -1 = 68 -> /6 = 11 -> %4 = 3
  • NSで確認されたc<2とにマッピングされた+1/ -1使用しました1-c*2
  • EWでチェックc>1され、+1/ -1を使用してマップされc*2-5ます。

クレジット


ああ、私の説明を入力している間にJavaの答えを投稿しました。:)私たちは両方とも完全に異なるアプローチを使用しているので、今のところはそのままにします。ラムダで使用される変数が大きすぎると、効果的にファイナルにする必要があります。そうしないと、バイトを節約するためにリストではなくストリングを返すことができます。
ケビンクルーイッセン

おかげで、わずか数バイト(4)しか保存できませんでしたが、何もないよりはましです;)
オリビエグレゴワール

@KevinCruijssenおかげで、最初はかなり明白に見えましたが、バイトカウントを30以上削減する別のアプローチに取り組んでいました。
オリビエグレゴワール


1
@KevinCruijssen申し訳ありませんが、変更を統合するのは面倒です...仕事に取り掛かっており、このページを更新するのを忘れています...とにかくありがとうございます^^ 'クレジット数が実際のクレジットを下回っている可能性が非常に高いです。それもごめんなさい:s
オリヴィエグレゴワール

3

Retina 0.8.2、93バイト

.+
$&¶$&
\G[NS]?[EW]?
$&¶
G`.
W
J
%O`.
+`EJ|NS

m`^((J)?[EJ]*)((S)?[NS]*)
$#2$*-$.1,$#4$*-$.3

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

.+
$&¶$&

入力を複製します。

\G[NS]?[EW]?
$&¶

最初のコピーを方向に分割します。

G`.

上記のプロセスで作成された余分な空白行を削除します。

W
J

との間でソートWされるJように変更します。(移動の間にしても動作します。)ENESW

%O`.

各行を順番に並べ替えます。

+`EJ|NS

反対方向のペアを削除します(これはもちろん最後の行にのみ影響します)。

m`^((J)?[EJ]*)((S)?[NS]*)
$#2$*-$.1,$#4$*-$.3

水平および垂直方向の動きの数を数え、必要に応じて標識を追加します。

Retina 0.8.2とRetina 1の違いを知っている方は、Retina 1の*代わりにを使用しているため、Retina 1で2バイト節約できることを指摘したいと思います$*。私はそこにいる間に、分割プロセスを簡素化しようとしましたが、バイト数をさらに減らすことはできませんでしたが、これと同等にすることができました:

L$`$(?<=(.*))|[NS]?[EW]?
$&$1

3

Java 10、269 265 243バイト

s->{var r="";int x=0,y=0,t,X,Y,a;for(;!s.isEmpty();r+=X+"|"+Y+" ",s=s.substring(++t),x+=X,y+=Y){a=s.charAt(t=0);if(s.matches("[SN][WE].*")){X=s.charAt(1)<70?1:-1;Y=1-a%2*2;t++;}else{X=a<70?1:a>86?-1:0;Y=a>69&a<87?1-a%2*2:0;}}return r+x+"|"+y;}

間違いなくこの挑戦​​にふさわしい言語ではありません。

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

説明:

s->{                  // Method with String as both parameter and return-type
  var r="";           //  Result-String, starting empty
  int x=0,            //  Ending `x`-coordinate, starting at 0
      y=0,            //  Ending `y`-coordinate, starting at 0
      t,X,Y,a;        //  Temp-integers
  for(;!s.isEmpty()   //  Loop as long as the input-String is not empty yet
      ;               //    After every iteration:
       r+=X+"|"+Y+" ",//     Append the current steps to the result-String
       s=s.substring(t),
                      //     Remove the first `t` characters from the input-String
       x+=X,y+=Y){   //      Append the ending `x`,`y` coordinates with the steps
    a=s.charAt(0);   //    Set `a` to the first character of the input-String to save bytes
    t=1;             //    Set `t` to 1
    if(s.matches("[SN][WE].*")){
                     //   Else-if the input-String starts with N/S followed by E/W:
      X=s.charAt(1)<70?1:-1;
                     //    Set `X` to 1 if 'E', -1 if 'W'
      Y=1-a%2*2;     //    Set `Y` to 1 if 'N', -1 if 'S'
      t++;}          //    Increase `t` by 1
    else{            //   Else:
      X=a<70?1:a>86?-1:0;
                     //    Set `X` to 1 if 'E', -1 if 'W', 0 if 'N' or 'S'
      Y=a>69&a<87?1-a%2*2:0;}}
                     //    Set `Y` 1 if 'N', -1 if 'S', 0 if 'E' or 'W'
  return r+x+"|"+y;} //  Append the ending coordinates, and return the result-String

1
Javaの回答はポイントを獲得しますが、誰もが獲得できるからです:)
魔法のタコ

@MagicOctopusUrnはい。:)そして、あなたは最短になることはありませんが、私はまだJavaでゴルフを楽しんでいます。ただし、この課題では、OlivierGrégoireによるJavaの回答は約70バイト短くなるため、ほとんどの賛成票が彼に送られるはずです。
ケビンクルーッセン


2

JavaScript(ES6)、102バイト

f=
s=>s.replace(/((N)|(S))?((E)|(W))?/g,(m,v,n,s,h,e,w)=>(x+=h=!w-!e,y+=v=!s-!n,m?[h,v]+`
`:[x,y]),x=y=0)
<input oninput=o.textContent=/[^NSEW]/.test(this.value)?``:f(this.value)><pre id=o>0,0

文字列を返します。


1

ルビー75 71バイト

->x{[*x.scan(/[NS][EW]?|./),x].map{|s|s.chars.sum{|c|1i**(c.ord%8%5)}}}

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

benj2240のおかげで-4バイト。

複素数を返すことは受け入れられる出力形式のように見えるので、非常に素晴らしいLynnの回答を移植するよりもゴルファーになることはないと思います


非常に素晴らしい。innerをスキップしmapてブロックを直接渡すことで数バイトを節約できますsumオンラインで試してみてください!
benj2240

1

F#(モノ)、269バイト

let f s=
 let l,h=(string s).Replace("NW","A").Replace("NE","B").Replace("SW","C").Replace("SE","D")|>Seq.map(function 'N'->0,1|'S'->0,-1|'W'-> -1,0|'E'->1,0|'A'-> -1,1|'B'->1,1|'C'-> -1,-1|'D'->1,-1)|>Seq.mapFold(fun(x,y) (s,t)->(s,t),(x+s,y+t))(0,0)
 Seq.append l [h]

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


こんにちは、PPCGへようこそ。残念ながら、出力の最後の項目が欠落しています。これは終了した位置です。そうするためにNSWE、あなたは、現在出力している(0,1)(-1,-1)(1,0)、しかし、第4の出力はそう、それらの座標の合計でなければなりません(0,0)(ので、0+-1+1 = 01+-1+0 = 0)。
ケビンクルーッセン

@KevinCruijssen OK、私はそれをキャッチしませんでした。更新しました。
ヘンリックハンセン

1
今はうまく機能しているようですので、私から+1してください。滞在を楽しんで!あなたはまだそれを見ていない場合には:)と、ヒントは、F#でのゴルフのために<すべての言語>でのゴルフのためのヒントをお読みも面白いかもしれません。
ケビンクルーイッセン

1

sed、125

出力フォーマットで撮影自由バージョン:

スコアには-r、sed のパラメーターの+1が含まれます。

s/(N|S)(E|W)/\L\2,\1 /g
s/N|S/,& /g
s/E|W/&, /g
s/N|E/A/gi
s/S|W/a/gi
p
:
s/(\S*),(\S*) (\S*),(\S*)/\1\3,\2\4/
t
s/Aa|aA//
t

オンラインで試す

出力は次のとおりです。

  • 座標要素はコンマ区切りです
  • 座標の各セットはTABで区切られています
  • 最終座標は新しい線上にあります
  • すべての数字はℤ単項です:
    • の文字列 A + ve整数を表しlen(string)
    • の文字列 a -ve整数を表し-len(string)
    • 空の文字列は 0

例えば:

  • , は[0,0]
  • ,AA [0,2]
  • aaa, [-3,0]

GNU execの拡張子を含む4.2.2をsedは、147

賢明な出力形式バージョン:

スコアには-r、sed のパラメーターの+1が含まれます。

s/(N|S)(E|W)/\L\2 \1\n/g
s/N|S/0 &\n/g
s/E|W/& 0\n/g
s/N|E/1/gi
s/S|W/-1/gi
p
:
s/(\S+) (\S+)\n(\S+) (\S+)/\1+\3 \2+\4/
t
s/\S+/$[&]/g
s/^/echo /e

出力は、行ごとに1つ、スペースで区切られた座標として与えられます。最後から2番目の座標セットと最終的な座標セットの間に余分な改行があります。問題があるかどうかはわかりません。

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


0

PHP、153バイト

正規表現に分割をさせます。マッチをループし、中間結果を出力して合計します:

preg_match_all("/[NS][EW]?|E|W/",$argn,$m);foreach($m[0]as$s){$x+=$p=strtr($s[-1],NEWS,1201)-1;$y+=$q=strtr($s[0],NEWS,2110)-1;echo"$p,$q
";}echo"$x,$y";

でパイプとして実行する-nR、オンラインで試してください


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