Determine as opções ideais de controle de cruzeiro

10

Um controle de cruzeiro tem 3 opções diferentes para mover a alavanca e definir a velocidade com a qual você deseja dirigir.

  • Em sua direção: Adiciona 1 velocidade.
  • Para cima: aumenta a velocidade para o próximo múltiplo de 10 (por exemplo, 20 -> 30, 32 -> 40)
  • Para baixo: diminui a velocidade para o próximo múltiplo de 10 (por exemplo, 20 -> 10, 32 -> 30)

Entrada

  • 2 números inteiros: o primeiro é a velocidade inicial e o segundo é a velocidade desejada, não-negativa e da forma que você desejar (matriz, dois argumentos etc.)

Tarefa

  • Determine a maneira ideal de usar a alça para atingir a velocidade desejada e imprima os movimentos na ordem correta.

Regras

  • Se você tiver a opção entre puxar em sua direção e subir (como de 39 a 40), poderá escolher qualquer uma das opções, mas fique com o que escolher para casos semelhantes
  • Você pode usar quaisquer três símbolos diferentes (de preferência visíveis) para distinguir entre os movimentos na saída (T, U e D, por exemplo).
  • Os símbolos podem ser separados por novas linhas, espaços, etc., mas não precisam ser

Aqui estão alguns casos de teste:

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

Isso é então a resposta mais curta em bytes vence.

aTastyT0ast
fonte
Para quem se perguntou, hoje eu notei meu controle de cruzeiro tem realmente um botão "escondida" para diminuir a velocidade por 1. Eu estava dirigindo errado o tempo todo ...
aTastyT0ast

Respostas:

1

JavaScript (ES6), 91 84 75 bytes

Guardado 4 bytes graças a @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):""

Usa 0para D, 1para Te 2para U.

ETHproductions
fonte
(s/10+1|0)*10 == (s/10|0)*10+10 == s-s%10+10.
Neil
11
@ Neil Obrigado, isso ajuda em outro local também!
ETHproductions
Você quebrou o f(37,43)que era, 2111mas seu novo código retorna 111111.
Neil
@ Neil Corrigido ao custo de 2 bytes.
ETHproductions
1

Java, 144 139

Economizou 5 bytes graças a 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);

Ungolfed

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
fonte
int10s/10void 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);
Criando
@KevinCruijssen boa captura, eu vou editá-lo em
dpa97 11/11
0

Lote, 175 bytes

@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

Bastante direto desta vez. Recebe a entrada como parâmetros da linha de comando, que salva em se d. eé darredondado para o múltiplo anterior de 10. Se sfor maior que d, então obviamente precisamos chamar daté que sseja menor que d. Caso contrário, precisamos verificar se sé menor que e; Nesse caso, podemos invocar uaté sigual e. Neste ponto sé agora entre ee de podemos simplesmente invocar taté chegarmos d. Eu olhei para forloops, mas eles usam pontos de extremidade inclusivos para que se tornassem muito detalhados.

Neil
fonte
0

Python, 76 bytes

lambda a,b: "U"*(b//10-a//10)+"D"*(a//10-b//10+(b<a))+"T"*min(b%10,(b-a)%99)
Rainer P.
fonte
min(b%10,(b-a)%99)wont sempre trabalho, por exemplo(a,b)=(132,33)
Jonathan Allan
Você tem um espaço extra depoisb:
Stephen
0

C, 156 bytes

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

Ungolfed:

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