최적의 크루즈 컨트롤 옵션 결정


10

크루즈 컨트롤에는 핸들을 움직여 주행하고자하는 속도를 설정하는 3 가지 옵션이 있습니다.

  • 당신을 향해 : 1 속도를 추가합니다.
  • 위로 : 다음 10의 배수로 속도를 증가시킵니다 (예 : 20-> 30, 32-> 40)
  • 아래쪽으로 : 속도를 10의 다음 배수로 줄입니다 (예 : 20-> 10, 32-> 30)

입력

  • 2 개의 정수 : 첫 번째는 시작 속도이고 두 번째는 원하는 속도이며 음이 아니거나 원하는 형식 (배열, 두 개의 인수 등)입니다.

직무

  • 핸들을 사용하여 원하는 속도에 도달하는 최적의 방법을 결정하고 올바른 순서로 동작을 인쇄하십시오.

규칙

  • 당신이 당신쪽으로 당기고 위쪽으로 올라가는 것 중에서 선택할 수 있다면 (39에서 40까지), 당신은 어느 쪽이든 선택할 수 있지만, 비슷한 경우에 당신이 선택한 것을 유지하십시오.
  • 출력에서 이동 (예 : T, U 및 D)을 구별하기 위해 3 개의 다른 (바람직하게 보이는) 기호를 사용할 수 있습니다.
  • 기호는 줄 바꿈 등으로 구분할 수 있지만 반드시 그럴 필요는 없습니다.

다음은 몇 가지 테스트 사례입니다.

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

이것은 이므로 바이트 단위의 최단 답변이 이깁니다.


궁금한 사람은 오늘 크루즈 컨트롤이 실제로 "숨겨진"버튼으로 속도를 1 감소시키는 것을 알았습니다. 나는 전체 시간 동안 잘못 운전하고 있습니다 ...
aTastyT0ast

답변:


1

자바 스크립트 (ES6), 91 84 75 바이트

@Neil 덕분에 4 바이트 절약

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):""

사용 0을 위해 D, 1대한 T, 및 2위해 U.


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

1
@ Neil 감사합니다, 그것은 다른 곳에서도 도움이됩니다!
ETHproductions

당신은 f(37,43)어느 것을 깨뜨 2111렸지만 새로운 코드는 돌아옵니다 111111.
Neil

@Neil 2 바이트의 비용으로 고정되었습니다.
ETHproductions

1

자바, (144) 139

Kevin 덕분에 5 바이트를 절약했습니다.

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

언 골프

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

두함으로써 int대한 변수를 10하고 s/10당신은 5 바이트를 줄일 수 있습니다 :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);
케빈 Cruijssen

@KevinCruijssen 좋은 캐치, 내가 그것을 편집합니다
dpa97

0

배치, 175 바이트

@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

이번에는 매우 간단합니다. 입력을 명령 줄 매개 변수로 사용하여 sand에 저장 d합니다. e이다 d(10)의 경우 이전 배수로 반올림 다운 s보다 큰 경우 d, 우리는 분명히 호출 할 필요 d까지 s보다 낮게된다 d. 그렇지 않으면, 우리 se; 보다 낮은 지 확인해야합니다 . 그렇다면, 같을 u때까지 호출 할 수 있습니다 . 이 시점 에서 지금 사이에 있으며 도달 할 때까지 호출 할 수 있습니다 . 루프를 살펴 보았지만 포괄적 인 엔드 포인트를 사용하므로 너무 장황하게되었습니다.sesedtdfor


0

파이썬, 76 바이트

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)예를 들어 항상 작동하지는 않습니다.(a,b)=(132,33)
Jonathan Allan

당신은 뒤에 여분의 공간이 있습니다b:
Stephen

0

C, 156 바이트

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

언 골프 드 :

#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;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.