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.


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.


(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);
        }
    }
}

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.


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)

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;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.