กำหนดตัวเลือกการควบคุมความเร็วที่ดีที่สุด


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, และสำหรับ2U


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

1
@ Neil ขอบคุณที่ช่วยในจุดอื่นด้วย!
ETHproductions

คุณยากจนf(37,43)ซึ่งเป็น2111แต่รหัสใหม่ของคุณกลับ111111มา
Neil

@Neil แก้ไขที่ราคา 2 ไบต์
ETHproductions

1

Java, 144 139

บันทึก 5 ไบต์ขอบคุณ 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);
        }
    }
}

โดยการสร้าง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);
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 คือลงโค้งมนไปหลายครั้งก่อนที่ 10 ถ้ามีค่ามากกว่านั้นเราก็เห็นได้ชัดว่าจำเป็นต้องเรียกใช้จนกลายเป็นที่ต่ำกว่า มิฉะนั้นเราต้องตรวจสอบว่าต่ำกว่า; ถ้าเป็นเช่นนั้นเราสามารถเรียกจนเท่ากับ ณ จุดนี้คือตอนนี้ระหว่างและและเราก็สามารถเรียกใช้จนกว่าจะถึง ฉันดูเป็นลูป แต่พวกเขาใช้จุดปลายรวมดังนั้นจะกลายเป็น verbose มากเกินไปdedsddsdseusesedtdfor



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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.