# Determine the optimal cruise control options

A cruise control has 3 different options to move the handle to set the speed you want to drive with.

• Towards you: Adds 1 speed.
• Upwards: Increases speed to the next multiple of 10 (e.g. 20-->30, 32-->40)
• Downwards: Decreases speed to the next multiple of 10 (e.g. 20-->10, 32-->30)

Input

• 2 integers: the first is the starting speed and the second is your desired speed, both non-negative and in any form you like (array, two arguments, etc.)

• Determine the optimal way of using the handle to reach the desired speed and print out the moves in the correct order.

Rules

• If you have the choice between pulling towards you and going upwards (like from 39 to 40) you can choose either option, but stay with whatever you choose for similar cases
• You may use any 3 different (preferably visible) symbols to distinguish between the moves in the output (T, U and D for example).
• The symbols can be seperated by new lines, spaces, etc. but don't have to be

Here are some test cases:

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


This is so the shortest answer in bytes wins.

• For anyone who wondered, today I noticed my cruise control has actually a "hidden" button to decrease the speed by 1. I was driving wrong the entire time... – aTastyT0ast Nov 16 '16 at 15:49

# JavaScript (ES6), 9184 75 bytes

Saved 4 bytes thanks to @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):""


Uses 0 for D, 1 for T, and 2 for U.

• (s/10+1|0)*10 == (s/10|0)*10+10 == s-s%10+10. – Neil Nov 9 '16 at 22:00
• @Neil Thanks, that helps in another spot too! – ETHproductions Nov 9 '16 at 22:05
• You broke f(37,43) which was 2111 but your new code returns 111111. – Neil Nov 9 '16 at 22:20
• @Neil Fixed at a cost of 2 bytes. – ETHproductions Nov 9 '16 at 22:28

# Java, 144 139

Saved 5 bytes thanks to 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);
}
}
}

• By making two int variables for 10 and s/10 you can shorten it by 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 Nov 10 '16 at 8:10
• @KevinCruijssen good catch, I'll edit it in – dpa97 Nov 11 '16 at 16:16

## Batch, 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


Fairly straightforward this time. Takes input as command-line parameters, which it saves into s and d. e is d rounded down to the previous multiple of 10. If s is greater than d, then we obviously need to invoke d until s becomes lower than d. Otherwise, we need to check whether s is lower than e; if so, we can invoke u until s equals e. At this point s is now between e and d and we can simply invoke t until we reach d. I looked into for loops but they use inclusive endpoints so would have become too verbose.

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

• min(b%10,(b-a)%99) wont always work, for example (a,b)=(132,33) – Jonathan Allan Nov 10 '16 at 3:41
• You have an extra space after b: – Stephen Aug 9 '17 at 14:38

# C, 156 bytes

t,x,y;main(int s,char**a){x=(s=atoi(a))/10,y=(t=atoi(a))/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)) / 10,
y = (t = atoi(a)) / 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;
}