航空機マーシャリングスクール


8

一連の航空機マーシャリング手信号を表す文字列が与えられた場合、これらの信号に続く航空機の最終位置を計算する関数またはプログラムを記述します。

NB:この挑戦で座標がデカルト座標の対、プラスコンパス方向見出しとして表される:x座標され、y座標であり、のいずれかである、、、または。(x, y, h)xyhNESW

(0, 0, N)エンジンをオフにして、架空のグリッド上にある航空機から始めます。入力は、コンマ区切りの文字のペアを含む文字列で、各ペアは1つのマーシャリング信号を表します。順番に各マーシャリング信号を追跡し(x, y, h)、航空機の最終位置の形式で座標を出力する必要があります。

信号が航空機の移動を必要とする場合、航空機が受信するそのタイプの信号ごとに必要な方向に1ユニット移動すると想定します。信号が航空機に方向転換を要求する場合、受信するそのタイプの信号ごとに必要な方向に90度回転すると仮定します。

エンジンがオフの場合、航空機は移動できません。航空機のエンジンがオフで動き/方向指示器を受け取った場合は、動き/方向転換を行わないでください。

信号

各マーシャリング信号は、1組の文字で表されます。ペアの1つ目は、航空機の視点からのマーシャラーの左腕の位置を表し、2つ目は同じPOVからの右腕の位置を表します。この便利なシグナルのチャートが役立つかもしれません。

o/  —  START ENGINES (no movement, no turn)
-/  —  CUT ENGINES   (no movement, no turn)
-~  —  TURN LEFT     (no movement, left turn)
~-  —  TURN RIGHT    (no movement, right turn)
~~  —  COME FORWARD  (forward movement, no turn)
::  —  MOVE BACK     (backward movement, no turn)
/\  —  NORMAL STOP   (no movement, no turn)

これはマーシャリング信号の完全なリストではありませんが、サポートする必要があるのはそれだけです。

入力

入力は、文字のペアを含むコンマ区切りの文字列です。この文字列は常に有効です-入力を検証する必要はありません。

出力

上記のように、出力は座標のセットです。これは任意の便利な形式で返すことができます-言語が複数の戻り値をサポートしている場合は、それを使用できます。または、文字列(座標を囲む角括弧は必須ではありません)、配列、タプル、リスト、またはその他の便利なものを使用できます。唯一のルールは、それが含まれていなければならないということであるxyhその順序で、値。

テストケース

Input  —  Output
o/,~~,~~,~-,::  —  (-1, 2, E)
::,~-,o/,/\,~~,-~,~~,~~,~~  —  (-3, 1, W)
o/,::,-/,~~,o/,~-,~~,~~,~-  —  (2, -1, S)
o/,~-,~-,::,::,~-,~~,-~  —  (-1, 2, S)
~-,~-,o/,::,::,-/,~~,-~  —  (0, -2, N)

1
スタートエンジンとカットエンジンは実際には何をしますか?スタートエンジンとカットエンジンの間の移動のみが実行されますか?そうでなければ私は関連性を見ることができません。
Level River St

@LevelRiverSt 「エンジンがオフの場合、航空機は移動できません。」私はテキストでそれを経験しました。
ArtOfCode

関数を作成する場合、入力を命令のリストとして取得できますか?
FlipTack

@ Flp.Tkcチャレンジを変更して簡単にできますか?いいえ:)
ArtOfCode

組み込みの「スプリット」関数を使用するのが難しいことに気づきませんでした。コードゴルフで厳密な入力フォーマットを持つことはお勧めしません。標準は「入力を任意の便利な形式で受け取る」ことです。
FlipTack

回答:


2

Java 8、505バイト

ゴルフ(大きな塊を削るために@ masterX244の助けを借りて)

class f{static boolean T(String u,String v){return u.equals(v);}public static void main(String[]a){java.util.Scanner q=new java.util.Scanner(System.in);String s=q.nextLine();int x=0;int y=0;int d=0;int[][]v={{0,1},{-1,0},{0,-1},{1,0}};int b=1;for(String r:s.split(",")){if(T(r,"o/")||T(r,"-/"))b=~1;if(b<0){if(T(r,‌​"~-"))d=(d+3)%4;if(T‌​(r,"-~"))d=(d+1)%4;i‌​f(T(r,"~~")){x+=v[d]‌​[0];y+=v[d][1];}if(T‌​(r,"::")){x-=v[d][0]‌​;y-=v[d][1];}}}Syste‌​m.out.println("("+x+‌​","+y+","+"NWSE".cha‌​rAt(d)+")");}}

より読みやすい

class f {
    static boolean T(String u,String v){return u.equals(v);}
    public static void main(String[] a) {
        java.util.Scanner q=new java.util.Scanner(System.in);
        String s=q.nextLine();
        int x=0;
        int y=0;
        int d=0;
        int[][] val = {
                {0,1},  // N
                {-1,0}, // W
                {0,-1}, // S
                {1,0}   // E
        };
        int b=1;
        for (String r: s.split(",")) {
            // toggle b if either start or stop engine
            if(T(r,"o/") || T(r,"-/"))
                b=~1;
            if(b<0){
                // right
                if(T(r,"~-")) d=(d+3)%4;
                // left
                if(T(r,"-~")) d=(d+1)%4;
                // come forward
                if(T(r,"~~")) {
                    x+=val[d][0];
                    y+=val[d][1];
                }
                // move back
                if(T(r,"::")) {
                    x-=val[d][0];
                    y-=val[d][1];
                }
            }
        }
        System.out.print("("+x+","+y+","+"NWSE".charAt(d)+")");
    }
}

いくつかの空きバイト:main()を含むクラスはパブリックである必要はなく(ここでJavaのゴルフのヒントを参照)、最適化できるかなりの数の空白文字(英数字以外の記号の横にあるものはすべて削除できます)。また、falseは0> 1として書き込むことができます
masterX244

また、boolをintで置き換え、ゼロより大きいか小さいかを比較することで、いくつかのバイトも削減されました。(* =-1を使用して切り替える)次のコメントのコード。あなたが唯一の1行が出力された必要なときに、いつものprintlnの上に印刷を()を使用
masterX244

class f{static boolean T(String u,String v){return u.equals(v);}public static void main(String[]a){java.util.Scanner q=new java.util.Scanner(System.in);String s=q.nextLine();int x=0;int y=0;int d=0;int[][]v={{0,1},{-1,0},{0,-1},{1,0}};int b=1;for(String r:s.split(",")){if(T(r,"o/")||T(r,"-/"))b*=-1;if(b<0){if(T(r,"~-"))d=(d+3)%4;if(T(r,"-~"))d=(d+1)%4;if(T(r,"~~")){x+=v[d][0];y+=v[d][1];}if(T(r,"::")){x-=v[d][0];y-=v[d][1];}}}System.out.print("("+x+","+y+","+"NWSE".charAt(d)+")");}}
masterX244 2016

@ masterX244 thx私は明らかにこれについて少し知っています。印刷用の編集に追加します
Bobas_Pett

インポートも最適化するスポットです。1つまたは2つの言及は、両方の完全修飾参照がインポートよりも短いことを示しています。(コメントに貼り付けたコードには、見つけたすべての最適化が含まれています)
masterX244

1

Befunge、201 185バイト

p10p2p3pv
~/3-*95~<v:+-"/"
  v!:-*53_v
 #_7-:v v0-1
vv!:-3_100>p
 _69*-:v NESW v+g01g
v v-*93_g10g\->4+4%10p
v<_100g >*:10g:1\-\2%!**03g+03p10g:2\-\2%**02g+02p
>>~65*`#v_2g.3g.10g9+5g,@

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

Befungeには文字列型がないため、信号を比較しやすくするために、式を使用して各文字のペアが整数に変換され(c1 - 45)/3 + c2 - 47ます。これは、無効な入力で誤った一致が発生することを意味しますが、入力が有効であることが保証されている場合は問題ではありません。

コードの残りの部分は、エンジンの状態(1または0)、見出し(NESWの場合は0〜3)、x位置とy位置の4つの「変数」の操作に基づいています。各信号の計算は次のようになります。

エンジン始動:エンジン engine = 1
停止: engine = 0
左折: heading = (heading - engine + 4) % 4
右折: heading = (heading + engine) % 4
移動:dirは前進の場合は1、後進の場合は-1です)
y += dir*engine*(1-heading)*!(heading%2)
x += dir*engine*(2-heading)*(heading%2)

入力シーケンスの最後に到達したら、xy、および見出し(単純なテーブルルックアップでcharに変換されます)を出力するだけです。


1

Python 2.7.12、295バイト

from operator import*
l=[0,0]
m=[['N',[0,1]],['E',[1,0]],['S',[0,-1]],['W',[-1,0]]]
n=0
x=raw_input()
for c in x.split(','):
 if'o/'==c:n=1
 if'-/'==c:n=0
 if n:
    if'-~'==c:m=m[-1:]+m[:-1]
    if'~-'==c:m=m[1:]+m[:1]
    if'~~'==c:l=map(add,l,m[0][1])
    if'::'==c:l=map(sub,l,m[0][1])
print l+[m[0][0]]

インデントの最初のレベルforは、単一のを使用した後\sです。第2レベルのインデントは単一を使用し\tます。(wysiwygは\t複数のスペースに置き換わるので、サイズをテストするときはこれに注意してください)


3
あります多くのあなたがここに削除することができます余分な空白のは。
ArtOfCode

空白だけでなく、他の非効率を修正するのも簡単です。特定の例については、Pythonでゴルフするためのヒントを試してください。
アドホックガーフハンター2016

code-golfでは、入力プロンプトを用意する必要はありませんraw_input()。ただ行うことができます。
FlipTack

このコードは、15行目のエラーTypeError: Argument to map() must support iterationです(Python 2.7.12を使用しています)。
16

@ Qwerp-Derp、map()エラーを修正したと思います。
Eric

1

Python 2、142バイト

s=raw_input()
e=p=0;d=1
while s:exec'd-=e d+=e p+=1j**d*e e=0 0 e=1 p-=1j**d*e 0'.split()[ord(s[0])+ord(s[1])*2&7];s=s[3:]
print p,'ESWN'[d%4]

例:

% python2.7 ams.py <<<'o/,~~,~~,~-,::'
(-1+2j) E

これは複素数を出力しますが、これは大丈夫だと思いますか?xyh注文はまだそこにある、と'j'混乱を引き起こすことはありません。変更する必要があるかどうか教えてください。

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