Trường Marshall Marshall


8

Đưa ra một chuỗi đại diện cho một loạt các tín hiệu tay máy bay , viết một chức năng hoặc chương trình để tính toán vị trí cuối cùng của một chiếc máy bay theo các tín hiệu này.

NB: tọa độ trong thách thức này được thể hiện như một cặp tọa độ Descartes, cộng với một tiêu đề theo hướng la bàn: (x, y, h)nơi xlà tọa độ x, ylà y phối hợp, và hlà một trong những N, E, S, hoặc W.

Bạn bắt đầu với một chiếc máy bay ở (0, 0, N)trên một lưới tưởng tượng, với động cơ tắt. Đầu vào của bạn là một chuỗi chứa các cặp ký tự được phân tách bằng dấu phẩy, trong đó mỗi cặp đại diện cho một tín hiệu sắp xếp theo thứ tự. Bạn phải lần lượt theo từng tín hiệu sắp xếp theo thứ tự và xuất ra tọa độ (x, y, h)dưới dạng vị trí cuối cùng của máy bay.

Nếu một tín hiệu yêu cầu máy bay của bạn di chuyển, giả sử nó di chuyển một đơn vị theo hướng yêu cầu cho mỗi tín hiệu của loại mà nó nhận được. Nếu tín hiệu yêu cầu máy bay của bạn quay, giả sử nó quay 90 độ theo hướng yêu cầu cho từng tín hiệu của loại mà nó nhận được.

Một chiếc máy bay không thể di chuyển nếu động cơ của nó tắt. Nếu động cơ máy bay của bạn tắt và bạn nhận được tín hiệu chuyển động / rẽ, không áp dụng chuyển động / rẽ.

Tín hiệu

Mỗi tín hiệu sắp xếp được thể hiện bằng một cặp ký tự. Đầu tiên của cặp đại diện cho vị trí của cánh tay trái của nguyên soái, theo quan điểm của máy bay , và cánh tay phải thứ hai từ cùng một POV. Biểu đồ tiện dụng này của các tín hiệu có thể giúp đỡ.

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)

Đây không phải là danh sách đầy đủ các tín hiệu sắp xếp, nhưng đó là tất cả những gì bạn cần để hỗ trợ.

Đầu vào

Đầu vào là một chuỗi được phân tách bằng dấu phẩy chứa các cặp ký tự. Chuỗi này sẽ luôn hợp lệ - bạn không phải xác thực đầu vào.

Đầu ra

Đầu ra là một tập hợp tọa độ như mô tả ở trên. Bạn có thể trả lại giá trị này ở bất kỳ định dạng thuận tiện nào - nếu ngôn ngữ của bạn hỗ trợ nhiều giá trị trả về, bạn có thể sử dụng giá trị đó; cách khác, bạn có thể sử dụng một chuỗi (dấu ngoặc bao quanh tọa độ là không bắt buộc), mảng, tuple, danh sách hoặc bất cứ điều gì khác mà bạn thấy thuận tiện. Nguyên tắc duy nhất là nó phải chứa x, yh các giá trị, theo thứ tự đó.

Các trường hợp thử nghiệm

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

1
Động cơ khởi động và động cơ cắt thực sự làm gì? Chỉ những động thái giữa động cơ khởi động và động cơ cắt sẽ được thực hiện? Nếu không, tôi không thấy sự liên quan.
Cấp sông St

@LevelRiverSt "Một chiếc máy bay không thể di chuyển nếu động cơ của nó bị tắt." Tôi đã trải qua điều đó trong văn bản.
ArtOfCode

nếu chúng ta viết một hàm, chúng ta có thể lấy đầu vào làm danh sách các hướng dẫn không?
FlipTack

@ Flp.Tkc Bạn có thể thay đổi thử thách để làm cho nó dễ dàng hơn không? Không :)
ArtOfCode

Tôi đã không nhận ra việc sử dụng chức năng "split" dựng sẵn rất khó khăn. Có một định dạng đầu vào cứng nhắc trên mã golf không được khuyến khích; tiêu chuẩn là "lấy đầu vào ở bất kỳ định dạng thuận tiện".
FlipTack

Câu trả lời:


2

Java 8, 505 byte

Đã chơi gôn (với sự trợ giúp từ @ masterX244 để cạo một khúc lớn)

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)+")");}}

Dễ đọc hơn

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)+")");
    }
}

một số byte miễn phí: lớp chứa main () không cần phải công khai (xem các mẹo chơi gôn cho java ở đây) và khá nhiều khoảng trắng có thể được tối ưu hóa (mọi thứ bên cạnh các ký hiệu không phải âm thanh có thể được loại bỏ). còn sai có thể được ghi là 0> 1
masterX244

Ngoài ra: thay thế bool bằng một int và so sánh nó là lớn hơn hoặc nhỏ hơn 0 cũng làm mất đi một số byte. (sử dụng * = - 1 để chuyển đổi nó) mã trong bình luận tiếp theo. Và luôn luôn sử dụng print () trên println khi bạn chỉ cần một dòng được xuất ra
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

@ masterX244 thx Tôi rõ ràng có một chút biết điều này. Tôi thêm vào phần chỉnh sửa để in
Bobas_Pett

việc nhập khẩu cũng là một điểm để tối ưu hóa. cho một hoặc 2 đề cập đến một tài liệu tham khảo đủ điều kiện về cả hai đều ngắn hơn nhập khẩu. (mã tôi đã dán trong nhận xét chứa tất cả tối ưu hóa tôi tìm thấy)
masterX244

1

Befunge, 201 185 byte

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,@

Hãy thử trực tuyến!

Befunge không có kiểu chuỗi như vậy, vì vậy để làm cho các tín hiệu dễ so sánh hơn, mỗi cặp ký tự được chuyển đổi thành một số nguyên bằng công thức (c1 - 45)/3 + c2 - 47 . Điều này có thể có nghĩa là chúng tôi sẽ nhận được kết quả khớp sai trên đầu vào không hợp lệ, nhưng điều đó không quan trọng nếu đầu vào được đảm bảo là hợp lệ.

Phần còn lại của mã dựa trên thao tác của bốn "biến": trạng thái động cơ (1 hoặc 0), tiêu đề (0 đến 3 đối với NESW) và x y vị trí . Các tính toán cho từng tín hiệu như sau:

Động cơ khởi động: engine = 1
Cắt động cơ: engine = 0
Rẽ trái: heading = (heading - engine + 4) % 4
Rẽ phải: heading = (heading + engine) % 4
Di chuyển: (trong đó dir là 1 cho tiến và -1 cho lùi)
y += dir*engine*(1-heading)*!(heading%2)
x += dir*engine*(2-heading)*(heading%2)

Khi chúng ta đạt đến cuối chuỗi đầu vào, thì đó chỉ là vấn đề xuất ra x , ytiêu đề (được chuyển đổi thành char với tra cứu bảng đơn giản).


1

Python 2.7.12, 295 byte

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]]

Mức độ thụt đầu tiên sau khi forsử dụng một \s. Việc thụt lề của cấp độ thứ hai sử dụng một \t. (wysiwyg thay thế \tbằng nhiều khoảng trắng, vì vậy hãy ghi nhớ điều này khi kiểm tra kích thước)


3
rất nhiều khoảng trắng bên ngoài bạn có thể loại bỏ ở đây.
ArtOfCode

Không chỉ là không gian trắng mà còn dễ sửa chữa không hiệu quả. Hãy thử các mẹo chơi golf trong python cho các kỳ thi cụ thể.
Ad Hoc Garf Hunter

Lưu ý rằng trong môn đánh gôn, bạn không cần phải có bất kỳ lời nhắc nhập liệu nào: bạn chỉ có thể làm raw_input().
FlipTack

Mã lỗi này đối với tôi trên dòng 15: TypeError: Argument to map() must support iteration(Tôi đang sử dụng Python 2.7.12).
clismique

@ Qwerp-Derp, tôi tin rằng tôi đã sửa lỗi map ().
Eric

1

Python 2, 142 byte

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]

Thí dụ:

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

Điều này in số phức, mà sẽ ổn, tôi nghĩ? Các x, y, htrật tự vẫn còn đó, và 'j'không gây ra bất kỳ sự nhầm lẫn. Nói cho tôi biết nếu tôi nên thay đổi nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.