确定最佳巡航控制选项


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

Answers:


1

JavaScript(ES6),91 84 75字节

@Neil节省了4个字节

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):""

用途0D1T,和2U


(s/10+1|0)*10 == (s/10|0)*10+10 == s-s%10+10
尼尔,2016年

1
@Neil谢谢,这对另一个地方也有帮助!
ETHproductions 2016年

您打破了f(37,43)原来的情况,2111但是新代码返回了111111
尼尔

@Neil固定为2个字节。
ETHproductions 2016年

1

爪哇144 139

感谢Kevin,节省了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变量10s/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);
Kevin Cruijssen

@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和中ded向下调整至10.如果以前多s是大于d,那么我们显然需要调用d直到s变得低于d。否则,我们需要检查是否s小于e;如果是这样,我们可以调用u直到sequals e。在这一点上s是现在之间ed,我们可以简单地调用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)
Jonathan Allan

您之后有一个额外的空间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");}}

取消高尔夫:

#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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.