Penafian: Kisah yang diceritakan dalam pertanyaan ini sepenuhnya fiktif, dan diciptakan semata-mata untuk tujuan memberikan intro.
Bos saya mendapatkan robot mainan baru, dan dia ingin saya membantu memprogramnya. Dia ingin dapat memasukkan instruksi panah sederhana untuk membuatnya bergerak. Instruksi ini adalah: ^ (untuk bergerak maju) <(untuk belok kiri), dan> (untuk belok kanan). Namun, sekarang saya sudah memprogram robot, dia ingin fungsionalitas tambahan. Dia ingin saya mengubah urutan panah apa pun yang dia input, sehingga daripada memiliki robot mengambil jalur yang ditunjukkan, itu bergerak ke lokasi yang diinginkan, ditunjukkan oleh tempat itu akan berakhir jika telah mengambil jalur yang dimasukkan, seefisien mungkin. Saya menghimbau Anda, para anggota PP&CG, untuk membantu saya dengan tugas ini.
Tugas Anda:
Tulis program atau fungsi untuk mengubah string yang terbuat dari panah menjadi string yang akan sampai ke lokasi yang ditunjukkan oleh input secepat mungkin. Memutar membutuhkan waktu selama bergerak mundur atau maju.
Memasukkan:
Sederetan panah, seperti ditunjukkan di atas. Jika Anda mau, karakter yang berbeda dapat diganti dengan panah, tetapi pastikan untuk memasukkan fakta bahwa Anda melakukannya dalam jawaban Anda. Semua test case menggunakan panah secara normal.
Keluaran:
String panah (atau karakter setara Anda), yang membawa robot ke tujuan yang diinginkan seefisien mungkin.
Kasus uji:
Perhatikan bahwa solusi yang ditawarkan hanya kemungkinan, dan bahwa solusi lain mungkin valid.
>^<<^^>^^ -> ^^<^
^^^^>^^^^ -> ^^^^>^^^^
>>>^^^^^^ -> <^^^^^^
>^>^>^>^ -> (empty string)
^<^^<^^<^^^^ -> >^^>^
Mencetak:
Memori robot terbatas, jadi program Anda harus memiliki jumlah byte serendah mungkin.
sumber
^<^^<^^<^^^^
->>^^>^
?Jawaban:
Retina ,
1037471 byteCobalah online! Tautan termasuk kasus uji. Penjelasan:
Belok kiri belok menjadi belok kanan tiga.
Kurangi semua belokan modulo 4.
Batalkan gerakan dalam arah yang berlawanan.
Belok tiga belok kanan kembali menjadi belok kiri. Ini juga menangani kasus
>>^>^
yang perlu menjadi<^<^
.Hapus putaran trailing yang tidak perlu.
sumber
Mathematica, 135 byte
Mengambil a
List
string sebagai input.Penjelasan
Set
j
ke 0, dan seti
ke 1.Untuk setiap karakter dalam input ...
Jika karakternya adalah
>
, kalikani
dengan unit imajiner. Jika karakternya adalah>
, bagii
dengan unit imajiner. Jika karakternya adalah^
, tambahkani
kej
.Ambil bagian nyata dan imajiner dari
j
. Ini memberikan koordinat robot Cartesian.Terapkan yang berikut ini untuk hasil ini:
Setel
a
ke fungsi yang menghasilkan string dengan(input)
atau0
karakter^
s, yang lebih besar.A
List
terdiri dari ...a
diterapkan pada input pertama (bagian nyata darij
)Jika input kedua (imajiner bagian dari
j
) lebih besar dari0
,>
. Jika tidak<
,. Setels
ke karakter yang dihasilkan.a
diterapkan pada nilai absolut dari input kedua.Jika input pertama kurang dari 0
s
,. Jika tidak, kosongkan string.Berlaku
a
untuk kali input yang negatif.Bergabung dengan string.
sumber
Mathematica 119 Bytes
Posisi akhir JungHwan untuk kode jalur lebih pendek dari saya, jadi gunakan itu. Saya pikir mungkin ada cara yang lebih pendek untuk melakukan ini ...
Saya menggunakan
AnglePath
fungsi bawaan untuk menentukan posisi akhir. Saya juga mendefinisikan simbol L, F, dan R untuk "<", "^" dan ">", untuk menyimpan beberapa karakter kutipan.Pemakaian:
Keluaran:
sumber
Ruby , 130 byte
Bagaimana itu bekerja
Cobalah online!
sumber
J, 90 byte
larutan
penjelasan
ada trik rapi menggunakan angka kompleks (mengalikan dengan saya adalah rotasi kiri 90 derajat, dan -i memberi Anda yang benar).
jadi kami mengambil input kami sebagai angka kompleks: a 1 mewakili "berjalan maju" dan i / -i mewakili belok kiri dan kanan.
posisi akhir dihitung dengan mudah dengan representasi ini. Perhatikan ini adalah bagian (paling kanan) pertama dari ekspresi terakhir saya di atas:
Garis pendek di atas itulah yang memecahkan masalah. Semua yang lain hanya mencari tahu bagaimana memformat jawaban, dan pasti bisa diturunkan secara signifikan.
Untuk memahami garis pendek di atas, perhatikan bahwa
*/\
(pemindaian produk parsial) memberi Anda daftar posisi yang Anda hadapi di setiap indeks dalam input: i adalah utara, 1 dan -1 adalah timur dan barat, dan -i adalah selatan . Tetapi karena kita mulai menghadap ke utara, kita harus melipatgandakan semua itu dengan i yang, dalam J, diwakili olehj.
(mengunyah kalimat itu sejenak).Kami hanya benar-benar "bergerak" ketika input asli 1, jadi kami kemudian kalikan hasilnya elementwise oleh array boolean yang merupakan 1 di mana input asli adalah 1 dan 0 sebaliknya:
=&1*
. Hasil yang perkalian array "langkah directional". Posisi akhir kami hanyalah jumlah dari langkah-langkah itu:+/
pengujian
Sayangnya saya tidak bisa menjalankan ini di TIO karena alasan tertentu, tetapi menempelkan yang berikut ke konsol J akan memverifikasi bahwa itu berfungsi:
sumber
C # (.NET Core) , 349 byte
Cobalah online!
Mengambil string sebagai input dan menghasilkan jalur terpendek yang akan diambil input.
Tidak Diseret & Dikomentari
sumber
JavaScript (Node.js) , 187 byte
Cobalah online!
Versi golf dengan spasi putih
-14 byte oleh @Neil
Tidak Disatukan:
sumber
t&3
alih-aliht%4
karena itu bekerja dengan negatift
sehingga Anda dapat menghapus4+
dan()
s.(x?"":t)+t
dapat ditulis(x?t:t+t)
untuk penghematan 1 byte. Kode pemindahan arah terlihat terlalu panjang. Juga saya pikir Anda mungkin harus menggantiindexOf
danMath.abs
dengan perbandingan.indexOf
dengan perbandingan?t-=b=c<'>'||-(c<'^')
.Python 2 ,
174169165 byteSunting 1: -5 byte dengan membolehkan arah berada di luar rentang 0-3, dan menghapus spasi.
Sunting 2: -4 byte dengan mengubah input ke (1, 2, 3) alih-alih (<, ^,>) karena OP mengizinkannya, serta mengubah sistem koordinat saya untuk memungkinkan saya mengurangi perhitungan jarak saya.
Cobalah online!
Menentukan koordinat akhir melalui nilai kamus yang dieksekusi, lalu hanya mencetak jalur langsung ke tujuan akhir.
sumber
Perl 5 , 185 + 1 (-p) = 186 byte
Cobalah online!
sumber
Jenis JavaScript (document.getElementById ()), 343 karakter
diperluas:
}
Pemakaian:
peringatan:
>^^>^
Robot dengan terbalik akan berguna.
sumber