Tentukan opsi kontrol pelayaran yang optimal

10

Kontrol pelayaran memiliki 3 opsi berbeda untuk menggerakkan gagang untuk mengatur kecepatan yang ingin Anda kendarai.

  • Menuju Anda: Menambahkan 1 kecepatan.
  • Ke atas: Meningkatkan kecepatan ke kelipatan 10 berikutnya (mis. 20 -> 30, 32 -> 40)
  • Bawah: Menurunkan kecepatan ke kelipatan 10 berikutnya (mis. 20 -> 10, 32 -> 30)

Memasukkan

  • 2 bilangan bulat: yang pertama adalah kecepatan awal dan yang kedua adalah kecepatan yang Anda inginkan, baik non-negatif dan dalam bentuk apa pun yang Anda suka (array, dua argumen, dll.)

Tugas

  • Tentukan cara optimal menggunakan pegangan untuk mencapai kecepatan yang diinginkan dan cetak gerakan dalam urutan yang benar.

Aturan

  • Jika Anda memiliki pilihan antara menarik ke arah Anda dan naik ke atas (seperti dari 39 hingga 40), Anda dapat memilih salah satu opsi, tetapi tetap dengan apa pun yang Anda pilih untuk kasus serupa
  • Anda dapat menggunakan 3 simbol yang berbeda (lebih disukai terlihat) untuk membedakan antara gerakan dalam output (T, U dan D misalnya).
  • Simbol dapat dipisahkan oleh garis baru, spasi, dll. Tetapi tidak harus

Berikut ini beberapa kasus uji:

start speed, desired speed  -->  output
30, 40  -->  U
30, 43  -->  UTTT
43, 30  -->  DD
51, 39  -->  DDDTTTTTTTTT
29, 30  -->  T or U
29, 50  -->  TUU or UUU
12, 12  -->  

Ini adalah sehingga jawaban tersingkat dalam byte menang.

aTastyT0ast
sumber
Bagi siapa pun yang bertanya-tanya, hari ini saya perhatikan kendali pelayaran saya sebenarnya memiliki tombol "tersembunyi" untuk mengurangi kecepatan sebesar 1. Saya salah mengemudi sepanjang waktu ...
aTastyT0ast

Jawaban:

1

JavaScript (ES6), 91 84 75 byte

Disimpan 4 byte berkat @Neil

f=(s,d)=>s-d?(q=s+10-s%10)>d?s>d?0+f(s-(s%10||10),d):1+f(s+1,d):2+f(q,d):""

Penggunaan 0untuk D, 1untuk T, dan 2untuk U.

Produksi ETH
sumber
(s/10+1|0)*10 == (s/10|0)*10+10 == s-s%10+10.
Neil
1
@Neil Terima kasih, itu membantu di tempat lain juga!
ETHproduk
Anda bangkrut f(37,43), 2111tetapi kode baru Anda kembali 111111.
Neil
@Neil Tetap dengan biaya 2 byte.
ETHproduk
1

Jawa, 144 139

Disimpan 5 byte berkat Kevin.

void o(int s,int e){int t=10,x=s/t;System.out.print(s>e?"D":s<e?x<e/t?"U":"T":"");if‌​(s!=e)o(s>e?x*t-(s%t‌​<1?t:0):s<e?x<e/t?(x‌​+1)*t:s+1:0,e);

Tidak disatukan

public static void optimalCruise(int start, int end){

    if(start > end) {
        System.out.print("D");
        optimalCruise(start/10*10-(start%10<1?10:0), end);
    } else if(start < end){
        if(start/10 < end/10){
            System.out.print("U");
            optimalCruise(((start/10)+1)*10, end);
        } else {
            System.out.print("T");
            optimalCruise(start+1, end);
        }
    }
}
dpa97
sumber
Dengan membuat dua intvariabel untuk 10dan s/10Anda dapat mempersingkatnya dengan 5 byte:void o(int s,int e){int t=10,x=s/t;System.out.print(s>e?"D":s<e?x<e/t?"U":"T":"");if(s!=e)o(s>e?x*t-(s%t<1?t:0):s<e?x<e/t?(x+1)*t:s+1:0,e);
Kevin Cruijssen
@KevinCruijssen tangkapan bagus, saya akan mengeditnya di
dpa97
0

Batch, 175 byte

@set/as=%1,d=%2,e=d/10*10
:d
@if %s% gtr %d% echo d&set/as=~-s/10*10&goto d
:u
@if %s% lss %e% echo u&set/as=s/10*10+10&goto u
:t
@if %s% neq %d% echo t&set/as+=1&goto t

Cukup mudah kali ini. Mengambil input sebagai parameter baris perintah, yang disimpan ke dalam sdan d. eadalah dbulat turun ke beberapa sebelumnya 10. Jika slebih besar dari d, maka kita jelas perlu memanggil dsampai smenjadi lebih rendah dari d. Kalau tidak, kita perlu memeriksa apakah slebih rendah dari e; jika demikian, kita dapat memanggil usampai ssama e. Pada titik ini ssekarang antara edan ddan kami hanya bisa memohon tsampai kita mencapai d. Saya melihat ke dalam forloop tetapi mereka menggunakan titik akhir inklusif sehingga akan menjadi terlalu bertele-tele.

Neil
sumber
0

Python, 76 byte

lambda a,b: "U"*(b//10-a//10)+"D"*(a//10-b//10+(b<a))+"T"*min(b%10,(b-a)%99)
Rainer P.
sumber
min(b%10,(b-a)%99)tidak akan selalu bekerja, misalnya(a,b)=(132,33)
Jonathan Allan
Anda memiliki ruang ekstra setelahb:
Stephen
0

C, 156 byte

t,x,y;main(int s,char**a){x=(s=atoi(a[1]))/10,y=(t=atoi(a[2]))/10;if(s^t){for(;y>x;++x)puts("U");for(x+=(s-t>10);x>y;--x)puts("D");for(;t--%10;)puts("T");}}

Tidak Disatukan:

#include <stdio.h>
#include <stdlib.h>
int t, x, y;
int main(int s, char **a)
{
    x = (s = atoi(a[1])) / 10,
    y = (t = atoi(a[2])) / 10;

    if (s ^ t) {
        for ( ; y > x; ++x)
            puts("U");

        for (x += (s - t > 10) ; x > y; --x)
            puts("D");

        for ( ; t-- % 10; )
            puts("T");
    }
    return 0;
}
Runium
sumber