Xác định các tùy chọn kiểm soát hành trình tối ưu


10

Một điều khiển hành trình có 3 tùy chọn khác nhau để di chuyển tay cầm để đặt tốc độ bạn muốn lái.

  • Hướng tới bạn: Thêm 1 tốc độ.
  • Lên trên: Tăng tốc độ lên bội số tiếp theo của 10 (ví dụ 20 -> 30, 32 -> 40)
  • Xuống dưới: Giảm tốc độ xuống bội số tiếp theo của 10 (ví dụ 20 -> 10, 32 -> 30)

Đầu vào

  • 2 số nguyên: đầu tiên là tốc độ bắt đầu và thứ hai là tốc độ mong muốn của bạn, cả không âm và ở bất kỳ dạng nào bạn thích (mảng, hai đối số, v.v.)

Bài tập

  • Xác định cách tối ưu để sử dụng tay cầm để đạt tốc độ mong muốn và in ra các bước di chuyển theo đúng thứ tự.

Quy tắc

  • Nếu bạn có lựa chọn giữa việc kéo về phía bạn và đi lên (như từ 39 đến 40), bạn có thể chọn một trong hai tùy chọn, nhưng vẫn giữ nguyên bất cứ điều gì bạn chọn cho các trường hợp tương tự
  • Bạn có thể sử dụng bất kỳ 3 ký hiệu khác nhau (tốt nhất có thể nhìn thấy) để phân biệt giữa các di chuyển trong đầu ra (ví dụ T, U và D).
  • Các biểu tượng có thể được ngăn cách bởi các dòng, dấu cách mới, v.v. nhưng không phải

Dưới đây là một số trường hợp thử nghiệm:

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  -->  

Đây là vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng.


Đối với bất cứ ai thắc mắc, hôm nay tôi nhận thấy điều khiển hành trình của mình thực sự có nút "ẩn" để giảm tốc độ xuống 1. Tôi đã lái xe sai toàn bộ thời gian ...
aTastyT0ast

Câu trả lời:


1

JavaScript (ES6), 91 84 75 byte

Đã lưu 4 byte nhờ @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):""

Sử dụng 0cho D, 1cho T2cho U.


(s/10+1|0)*10 == (s/10|0)*10+10 == s-s%10+10.
Neil

1
@Neil Cảm ơn, điều đó cũng giúp ở một vị trí khác!
Sản phẩm ETH

Bạn đã phá vỡ f(37,43)đó là 2111nhưng mã mới của bạn trở lại 111111.
Neil

@Neil Đã sửa với chi phí 2 byte.
Sản phẩm ETH

1

Java, 144 139

Đã lưu 5 byte nhờ 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);

Ung dung

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

Bằng cách tạo hai intbiến cho 10s/10bạn có thể rút ngắn nó xuống 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 bắt tốt, tôi sẽ chỉnh sửa nó trong
dpa97

0

Mẻ, 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

Khá đơn giản lần này. Đưa đầu vào dưới dạng tham số dòng lệnh, nó lưu vào sd. eđược dlàm tròn xuống bội số trước của 10. Nếu slớn hơn d, thì rõ ràng chúng ta cần phải gọi dcho đến khi strở nên thấp hơn d. Nếu không, chúng ta cần kiểm tra xem scó thấp hơn không e; nếu vậy, chúng ta có thể gọi ucho đến khi sbằng e. Tại thời điểm này stại là giữa edvà chúng tôi chỉ có thể gọi tcho đến khi chúng ta đạt được d. Tôi đã xem xét forcác vòng lặp nhưng họ sử dụng các điểm cuối bao gồm nên sẽ trở nên quá dài dòng.


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)không phải lúc nào cũng hoạt động, ví dụ(a,b)=(132,33)
Jonathan Allan

Bạn có thêm một không gian saub:
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");}}

Ung dung:

#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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.