Diberikan string yang mewakili serangkaian sinyal tangan yang mengatur pesawat , tulis fungsi atau program untuk menghitung posisi akhir pesawat terbang mengikuti sinyal-sinyal ini.
NB: Co-koordinat dalam tantangan ini direpresentasikan sebagai sepasang koordinat Cartesian, ditambah arah kompas pos: (x, y, h)
mana x
adalah koordinat x, y
adalah koordinat y, dan h
merupakan salah satu dari N
, E
, S
, atau W
.
Anda mulai dengan pesawat terbang di (0, 0, N)
grid imajiner, dengan mesin mati. Input Anda adalah string yang berisi pasangan karakter yang dipisah koma, di mana setiap pasangan mewakili satu sinyal marshalling. Anda harus mengikuti setiap sinyal marshalling secara bergantian, dan mengeluarkan koordinat dalam (x, y, h)
bentuk posisi akhir pesawat.
Jika suatu sinyal mengharuskan pesawat Anda untuk bergerak, anggap itu bergerak satu unit ke arah yang diperlukan untuk setiap sinyal dari jenis yang diterimanya. Jika suatu sinyal mengharuskan pesawat Anda berputar, anggap ia berputar 90 derajat ke arah yang diperlukan untuk setiap sinyal dari jenis yang diterimanya.
Sebuah pesawat tidak bisa bergerak jika mesinnya mati. Jika mesin pesawat Anda mati dan Anda menerima sinyal gerakan / belok, jangan menerapkan gerakan / belokan.
Sinyal
Setiap sinyal marshalling diwakili oleh sepasang karakter. Yang pertama dari pasangan mewakili posisi lengan kiri marshaller, dari sudut pandang pesawat , dan yang kedua lengan kanan dari POV yang sama. Grafik sinyal yang berguna ini dapat membantu.
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)
Ini bukan daftar lengkap sinyal marshalling, tetapi hanya itu yang Anda perlukan untuk mendukungnya.
Memasukkan
Input adalah string yang dipisahkan koma yang berisi pasangan karakter. String ini akan selalu valid - Anda tidak harus memvalidasi input.
Keluaran
Keluaran adalah seperangkat koordinat seperti dijelaskan di atas. Anda dapat mengembalikan ini dalam format apa pun yang nyaman - jika bahasa Anda mendukung beberapa nilai pengembalian, Anda dapat menggunakannya; sebagai alternatif, Anda dapat menggunakan string (tanda kurung di sekitar koordinat tidak wajib), array, tuple, daftar, atau apa pun yang menurut Anda nyaman. Satu-satunya aturan adalah bahwa hal itu harus berisi x
, y
dan h
nilai-nilai, dalam urutan itu.
Uji Kasus
Input — Output
o/,~~,~~,~-,:: — (-1, 2, E)
::,~-,o/,/\,~~,-~,~~,~~,~~ — (-3, 1, W)
o/,::,-/,~~,o/,~-,~~,~~,~- — (2, -1, S)
o/,~-,~-,::,::,~-,~~,-~ — (-1, 2, S)
~-,~-,o/,::,::,-/,~~,-~ — (0, -2, N)
Jawaban:
Java 8, 505 byte
Golf (dengan bantuan dari @ masterX244 untuk mencukur potongan besar)
Lebih mudah dibaca
sumber
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)+")");}}
Befunge,
201185 byteCobalah online!
Befunge tidak memiliki tipe string seperti itu, sehingga untuk membuat sinyal lebih mudah untuk dibandingkan, setiap pasangan karakter dikonversi menjadi integer menggunakan rumus
(c1 - 45)/3 + c2 - 47
. Ini bisa berarti kami akan mendapatkan kecocokan salah pada input yang tidak valid, tetapi itu tidak masalah jika input tersebut dijamin valid.Sisa kode didasarkan pada manipulasi empat "variabel": status engine (1 atau 0), heading (0 hingga 3 untuk NESW), dan posisi x dan y . Perhitungan untuk masing-masing sinyal adalah sebagai berikut:
Start engine:
engine = 1
Cut engine:
engine = 0
Belok kiri:
heading = (heading - engine + 4) % 4
Belok kanan:
heading = (heading + engine) % 4
Gerakan: (di mana dir adalah 1 untuk maju dan -1 untuk mundur)
y += dir*engine*(1-heading)*!(heading%2)
x += dir*engine*(2-heading)*(heading%2)
Setelah kita mencapai akhir dari urutan input, maka itu hanya masalah keluaran x , y , dan heading (dikonversi ke char dengan pencarian tabel sederhana).
sumber
Python 2.7.12, 295 byte
Lekukan tingkat pertama setelah
for
menggunakan satu\s
. Lekukan tingkat kedua menggunakan satu\t
. (wysiwyg menggantikan\t
dengan beberapa spasi jadi harap diingat saat menguji ukuran)sumber
raw_input()
.TypeError: Argument to map() must support iteration
(Saya menggunakan Python 2.7.12).Python 2, 142 byte
Contoh:
Ini mencetak bilangan kompleks, yang seharusnya oke, saya kira? The
x
,y
,h
agar masih ada, dan'j'
tidak menyebabkan kebingungan. Katakan padaku apakah aku harus mengubahnya.sumber