Определите оптимальные варианты круиз-контроля

10

Круиз-контроль имеет 3 различных варианта перемещения ручки, чтобы установить скорость, с которой вы хотите двигаться.

  • Навстречу вам: добавляет 1 скорость.
  • Вверх: увеличивает скорость до следующего кратного 10 (например, 20 -> 30, 32 -> 40)
  • Вниз: уменьшает скорость до следующего кратного 10 (например, 20 -> 10, 32 -> 30)

вход

  • 2 целых числа: первое - начальная скорость, а второе - желаемая скорость, как неотрицательная, так и в любой форме (массив, два аргумента и т. Д.)

задача

  • Определите оптимальный способ использования ручки для достижения желаемой скорости и распечатайте движения в правильном порядке.

правила

  • Если у вас есть выбор между тягой к себе и движением вверх (например, от 39 до 40), вы можете выбрать любой вариант, но оставайтесь с тем, что вы выберете для подобных случаев.
  • Вы можете использовать любые 3 различных (предпочтительно видимых) символа, чтобы различать ходы на выходе (например, T, U и D).
  • Символы могут быть разделены новыми строками, пробелами и т. Д., Но не обязательно

Вот несколько тестов:

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

Это поэтому выигрывает самый короткий ответ в байтах.

aTastyT0ast
источник
Для тех, кто задавался вопросом, сегодня я заметил, что на моем круиз-контроле на самом деле есть «скрытая» кнопка для уменьшения скорости на 1. Я все время ехал неправильно…
aTastyT0ast

Ответы:

1

JavaScript (ES6), 91 84 75 байт

Сохранено 4 байта благодаря @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):""

Использует 0для D, 1для Tи 2для U.

ETHproductions
источник
(s/10+1|0)*10 == (s/10|0)*10+10 == s-s%10+10,
Нил
1
@Neil Спасибо, это помогает и в другом месте!
ETHproductions
Вы сломали f(37,43)что было, 2111но ваш новый код возвращается 111111.
Нил
@Neil Исправлено по стоимости 2 байта.
ETHproductions
1

Ява, 144 139

Сохранено 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);

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
источник
Сделав две 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);
Кевин Круйссен
@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

На этот раз довольно просто. Принимает ввод как параметры командной строки, которые он сохраняет в sи d. eэто dокругленный вниз к предыдущему кратному 10. Если sбольше d, то , очевидно , необходимо вызвать dдо sстановится ниже d. В противном случае нам нужно проверить, sменьше ли e; если это так, мы можем вызвать uдо тех пор, пока не будет sравен e. В этот момент sсейчас между eи dмы можем просто вызывать, tпока не достигнем d. Я изучил forциклы, но они используют инклюзивные конечные точки, поэтому стали бы слишком многословными.

Нил
источник
0

Python, 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)
Джонатан Аллан
У вас есть дополнительное место послеb:
Стивен
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");}}

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
источник