Berdasarkan ide yang disarankan oleh Zgarb .
Pesawat ruang angkasa bergerak di sekitar kisi 3D biasa. Sel-sel grid diindeks dengan bilangan bulat dalam sistem koordinat tangan kanan, xyz . Pesawat ruang angkasa dimulai pada titik asal, menunjuk sepanjang sumbu x positif , dengan sumbu z positif mengarah ke atas.
Pesawat ruang angkasa akan terbang di sepanjang lintasan yang ditentukan oleh urutan gerakan yang tidak kosong. Setiap gerakan adalah salah satu F
(atau ke depan) yang membuat pesawat ruang angkasa bergerak satu sel ke arah yang menghadapnya, atau salah satu dari enam rotasi UDLRlr
. Ini sesuai dengan pitch, yaw and roll sebagai berikut:
Terima kasih kepada Zgarb untuk membuat diagram.
U
p danD
miliki sendiri perubahan nada pesawat ruang angkasa sebanyak 90 derajat (di mana arahnya sesuai dengan pergerakan hidung pesawat ruang angkasa).L
EFT dan EIGHTR
mengubah yaw pesawat ruang angkasa sebesar 90 derajat. Mereka belok kiri dan kanan biasa.l
Et dan Eightr
adalah gerakan menggulung 90 derajat, di mana arahnya menunjukkan sayap mana yang bergerak ke bawah.
Perhatikan bahwa ini harus selalu ditafsirkan relatif terhadap pesawat ruang angkasa sehingga sumbu yang relevan berputar bersama dengannya.
Dalam istilah matematika, pesawat ruang angkasa pada awalnya berada di posisi (0, 0, 0)
, menunjuk sepanjang (1, 0, 0)
vektor, dengan (0, 0, 1)
menunjuk ke atas. Rotasi sesuai dengan matriks berikut yang diterapkan pada sistem koordinat:
U = ( 0 0 -1 D = ( 0 0 1
0 1 0 0 1 0
1 0 0 ) -1 0 0 )
L = ( 0 -1 0 R = ( 0 1 0
1 0 0 -1 0 0
0 0 1 ) 0 0 1 )
l = ( 1 0 0 r = ( 1 0 0
0 0 1 0 0 -1
0 -1 0 ) 0 1 0 )
Anda harus menampilkan posisi akhir dari pesawat ruang angkasa sebagai tiga bilangan bulat x , y , z . Output mungkin tiga bilangan bulat terpisah atau daftar atau string yang mengandung mereka. Mereka mungkin berada dalam urutan yang konsisten selama Anda menentukannya.
Anda dapat menulis sebuah program atau fungsi, mengambil input melalui STDIN (atau alternatif terdekat), argumen baris perintah atau argumen fungsi dan mengeluarkan hasilnya melalui STDOUT (atau alternatif terdekat), nilai pengembalian fungsi atau parameter function (out).
Aturan standar kode-golf berlaku.
Uji Kasus
F => (1, 0, 0)
FDDF => (0, 0, 0)
FDDDF => (1, 0, 1)
LrDDlURRrr => (0, 0, 0)
UFLrRFLRLR => (1, 0, 1)
FFrlFULULF => (3, 0, -1)
LLFRLFDFFD => (-2, 0, -2)
FrrLFLFrDLRFrLLFrFrRRFFFLRlFFLFFRFFLFlFFFlUFDFDrFF => (1, 5, 7)
FUrRLDDlUDDlFlFFFDFrDrLrlUUrFlFFllRLlLlFFLrUFlRlFF => (8, 2, 2)
FFLrlFLRFFFRFrFFFRFFRrFFFDDLFFURlrRFFFlrRFFlDlFFFU => (1, 2, -2)
FLULFLFDURDUFFFLUlFlUFLFRrlDRFFFLFUFrFllFULUFFDRFF => (-3, -2, -3)
Contoh yang berhasil
Berikut adalah langkah-langkah lanjutan dari UFLrRFLRLR
test case. Di sini, semua koordinat menengah dan vektor arah diberikan dalam sistem koordinat global awal (sebagai lawan dari satu lokal ke pesawat ruang angkasa):
Cmd. Position Forward Up
( 0, 0, 0) ( 1, 0, 0) ( 0, 0, 1)
U ( 0, 0, 0) ( 0, 0, 1) (-1, 0, 0)
F ( 0, 0, 1) ( 0, 0, 1) (-1, 0, 0)
L ( 0, 0, 1) ( 0, 1, 0) (-1, 0, 0)
r ( 0, 0, 1) ( 0, 1, 0) ( 0, 0, 1)
R ( 0, 0, 1) ( 1, 0, 0) ( 0, 0, 1)
F ( 1, 0, 1) ( 1, 0, 0) ( 0, 0, 1)
L ( 1, 0, 1) ( 0, 1, 0) ( 0, 0, 1)
R ( 1, 0, 1) ( 1, 0, 0) ( 0, 0, 1)
L ( 1, 0, 1) ( 0, 1, 0) ( 0, 0, 1)
R ( 1, 0, 1) ( 1, 0, 0) ( 0, 0, 1)
Jawaban:
MATL ,
7675 byteIni berfungsi dalam versi bahasa saat ini (12.1.1).
Sunting (4 April 2016): Perilaku fungsi
v
telah berubah dalam rilis 15.0.0 bahasa. Untuk membuat kode di atas berjalan, hapus yang pertamav
dan ganti yang kedua3$v
. Tautan berikut mencakup modifikasi ini.Cobalah online !
Penjelasan
Keadaan kapal dapat dijelaskan dalam dua variabel:
Variabel ketiga adalah arah di mana kapal menghadap, tetapi itu tidak diperlukan, karena dapat diperoleh sebagai arah awal (vektor kolom [
1;0;0]
) dikalikan orientasi saat ini; yaitu, kolom pertama dari orientasi.Dua variabel status ini disimpan di tumpukan, dan diperbarui dengan setiap huruf. Setiap huruf
ULlDRr
mengalikan matriks orientasi dengan salah satu dari enam matriks rotasi untuk memperbarui orientasi. SuratF
menambahkan posisi saat ini ditambah kolom pertama dari matriks orientasi.Enam matriks rotasi dibuat sebagai berikut: pertama diperkenalkan secara langsung; kedua dan ketiga adalah pergeseran melingkar dari yang sebelumnya; dan tiga sisanya adalah versi transparan dari yang lain.
sumber
Oktaf, 175 byte
Versi yang dapat dibaca:
sumber
ES6,
265259 bytePenjelasan: Biasanya untuk menghitung arah pesawat ruang angkasa Anda akan menyusun semua rotasi bersama-sama, dan kemudian untuk setiap gerakan Anda akan menyusun hasilnya ke vektor satuan
F = (1, 0, 0)
(atau lebih sederhana ekstrak kolom pertama dari matriks). MisalnyaFFrlFULULF => F + F + r⋅l⋅F + r⋅l⋅U⋅L⋅L⋅L⋅F
,. Karena perkalian matriks adalah asosiatif, bahasa dengan perkalian matriks bawaan jelas dapat menghitung produk parsialr⋅l⋅U⋅L⋅L⋅L
seiring berjalannya waktu, dikalikan denganF
seperlunya untuk menghasilkan istilah yang kemudian ditambahkan bersama. Sayangnya saya tidak memiliki kemewahan itu, jadi opsi termurah adalah menghitung setiap istilah dalam ungkapan di atas secara terpisah, dimulai dengan jadi saya juga perlu menandai awal dan akhir setiap istilah dalam daftar sehingga saya dapat mengabaikan sisanya. dari string. Sedikit tidak berbulu:F
dan bekerja kembali. Untuk itu, saya perlu daftar untuk setiap kemunculanF
semua rotasi hingga saat itu. Saya melakukan ini menggunakanreplace
$`
sumber