最適なクルーズコントロールオプションを決定する


10

クルーズコントロールには、ハンドルを動かして、運転したい速度を設定する3つのオプションがあります。

  • あなたに向かって:1スピードを追加します。
  • 上向き:速度を次の10の倍数に上げます(例:20-> 30、32->> 40)
  • 下向き:速度を10の次の倍数に下げます(例:20-> 10、32->> 30)

入力

  • 2つの整数:1つ目は開始速度、2つ目は希望の速度で、負ではなく、任意の形式(配列、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バイト

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

用途0のためにD1のためにT、と2のためにU


(s/10+1|0)*10 == (s/10|0)*10+10 == s-s%10+10
Neil、

1
@ニールありがとう、それは別の場所でも役立ちます!
ETHproductions 2016年

あなたはf(37,43)どちらが壊れたか2111、あなたの新しいコードは戻ります111111
Neil、

@Neil 2バイトのコストで修正されました。
ETHproductions 2016年

1

Java、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);
        }
    }
}

2つのにすることで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);
ケビンCruijssen

@KevinCruijssenグッドキャッチ、編集します
dpa97 '11 / 11/16

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まで呼び出す必要があります。そうでない場合は、がより小さいかどうかを確認する必要があります。もしそうなら、equals まで呼び出すことができます。この時点でとの間にあり、到達するまで呼び出すだけです。ループを調べましたが、それらは包括的なエンドポイントを使用しているため、冗長になりすぎていたでしょう。sdseusesedtdfor


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

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;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.