Determine las opciones óptimas de control de crucero

10

Un control de crucero tiene 3 opciones diferentes para mover el mango y establecer la velocidad con la que desea conducir.

  • Hacia usted: Agrega 1 velocidad.
  • Hacia arriba: aumenta la velocidad al siguiente múltiplo de 10 (por ejemplo, 20 -> 30, 32 -> 40)
  • Hacia abajo: disminuye la velocidad al siguiente múltiplo de 10 (por ejemplo, 20 -> 10, 32 -> 30)

Entrada

  • 2 enteros: el primero es la velocidad de inicio y el segundo es la velocidad deseada, tanto no negativa como en la forma que desee (matriz, dos argumentos, etc.)

Tarea

  • Determine la forma óptima de usar el mango para alcanzar la velocidad deseada e imprima los movimientos en el orden correcto.

Reglas

  • Si tiene la opción de tirar hacia usted y hacia arriba (como de 39 a 40), puede elegir cualquiera de las opciones, pero quédese con lo que elija para casos similares
  • Puede usar 3 símbolos diferentes (preferiblemente visibles) para distinguir entre los movimientos en la salida (T, U y D, por ejemplo).
  • Los símbolos pueden separarse con nuevas líneas, espacios, etc., pero no es necesario que sean

Aquí hay algunos casos de prueba:

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

Este es el por lo que gana la respuesta más corta en bytes.

aTastyT0ast
fuente
Para cualquiera que se lo haya preguntado, hoy noté que mi control de crucero tiene un botón "oculto" para disminuir la velocidad en 1.
Conducía

Respuestas:

1

JavaScript (ES6), 91 84 75 bytes

Guardado 4 bytes gracias 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):""

Usos 0para D, 1para Ty 2para U.

ETHproductions
fuente
(s/10+1|0)*10 == (s/10|0)*10+10 == s-s%10+10.
Neil
1
@Neil ¡Gracias, eso también ayuda en otro lugar!
ETHproductions
Rompiste f(37,43)cuál era 2111pero tu nuevo código vuelve 111111.
Neil
@Neil Corregido a un costo de 2 bytes.
ETHproductions
1

Java, 144 139

Guardado 5 bytes gracias 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);

Sin golf

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
fuente
Al hacer dos intvariables para 10y s/10puede acortarlo en 5 bytes: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 buena captura, lo
editaré
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 sencillo esta vez. Toma la entrada como parámetros de línea de comandos, que guarda en sy d. ese dredondea al múltiplo anterior de 10. Si ses mayor que d, entonces obviamente debemos invocar dhasta que ssea ​​menor que d. De lo contrario, debemos verificar si ses menor que e; Si es así, podemos invocar uhasta que sea sigual e. En este punto sestá ahora entre ey dy podemos simplemente invocar thasta llegar d. Miré los forbucles pero usan puntos finales inclusivos, por lo que se habrían vuelto demasiado detallados.

Neil
fuente
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.
fuente
min(b%10,(b-a)%99)no siempre funciona, por ejemplo(a,b)=(132,33)
Jonathan Allan
Tienes un espacio extra despuésb:
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");}}

Sin golf:

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