Визначте оптимальні варіанти круїз-контролю


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

Це тому найкоротша відповідь у байтах виграє.


Для всіх, хто замислювався, сьогодні я помітив, що мій круїз-контроль фактично має "приховану" кнопку, щоб зменшити швидкість на 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.


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

Безумовно

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);
Кевін Круїйсен

@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

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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.