Robot trên thang


30

Lý lịch

Tôi có một cái thang dựa vào tường và một robot điều khiển từ xa có thể trèo lên nó. Tôi có thể gửi ba lệnh khác nhau cho robot:

  • UP: robot tiến lên một bước. Nếu nó ở bước cao nhất, nó vấp ngã, rơi xuống và phát nổ.
  • DOWN: robot tiến một bước xuống. Nếu đó là bước thấp nhất, không có gì xảy ra.
  • RESET: robot trở về bước thấp nhất.

Tôi cũng có thể gửi một loạt các lệnh và robot sẽ thực hiện từng cái một. Nhiệm vụ của bạn là dự đoán chuyển động của nó.

Đầu vào

Đầu vào của bạn là một số nguyên dương N, đại diện cho số lượng các bước trong các bậc thang, và một chuỗi không trống Ctrên UDR, đại diện cho các lệnh tôi đã gửi đến các robot. Bạn có thể cho rằng N < 1000. Robot được khởi tạo ở bước thấp nhất của thang.

Đầu ra

Nó được đảm bảo rằng tại một số điểm, robot sẽ leo qua bước cao nhất và phát nổ. Đầu ra của bạn là số lượng lệnh mà nó thực thi trước khi điều này xảy ra.

Thí dụ

Xem xét các yếu tố đầu vào N = 4C = "UDDUURUUUUUUUDDDD" Robot, được biểu thị bởi @, di chuyển dọc theo thang 4 bước như sau:

|-|   |-|   |-|   |-|   |-|   |-|   |-|   |-|   |-|   |@|   |-||
|-|   |-|   |-|   |-|   |-|   |@|   |-|   |-|   |@|   |-|   |-||
|-|   |@|   |-|   |-|   |@|   |-|   |-|   |@|   |-|   |-|   |-|v
|@| U |-| D |@| D |@| U |-| U |-| R |@| U |-| U |-| U |-| U |-|# Boom!

Các lệnh còn lại không được thực thi, vì robot đã phát nổ. Vụ nổ diễn ra sau 10 lệnh, vì vậy đầu ra chính xác là 10.

Quy tắc và tính điểm

Bạn có thể viết một chương trình đầy đủ hoặc một chức năng. Số byte thấp nhất sẽ thắng và các sơ hở tiêu chuẩn không được phép.

Các trường hợp thử nghiệm

  1 U -> 1
  1 DDRUDUU -> 4
  4 UDDUUUUURUUUUDDDD -> 7
  4 UDDUURUUUUUUUDDDD -> 10
  6 UUUUUDRUDDDDRDUUUUUUDRUUUUUUUDR -> 20
 10 UUUUUURUUUUUUURUUUUUUUURUUUUUUUUUUUUUU -> 34
  6 UUUDUUUUDDDDDDDDDDDDDDRRRRRRRRRRRUUUUUU -> 8
  6 UUUDUUUDURUDDDUUUUUDDRUUUUDDUUUUURRUUDDUUUUUUUU -> 32
 20 UUDDUDUUUDDUUDUDUUUDUDDUUUUUDUDUUDUUUUUUDUUDUDUDUUUUUDUUUDUDUUUUUUDUDUDUDUDUUUUUUUUUDUDUUDUDUUUUU -> 56
354 UUDDUUDUDUUDDUDUUUUDDDUDUUDUDUDUDDUUUUDUDUUDUDUUUDUDUDUUDUUUDUUUUUDUUDUDUUDUDUUUUUDUDUUDUDUDUDDUUUUUUUDUDUDUDUUUUUDUDUDUDUDUDUDUDUUDUUUUUURUUUDUUUUDDUUDUDUDURURURUDUDUUUUDUUUUUUDUDUDUDUDUUUUUUDUDUUUUUUUDUUUDUUDUDUDUUDUDUDUUUUUUUUUUDUUUDUDUUDUUDUUUDUUUUUUUUUUUUUDUUDUUDUDUDUUUDUDUUUUUUUDUUUDUUUDUUDUUDDUUUUUUUUDUDUDUDUDUUUUDUDUUUUUUUUDDUUDDUUDUUDUUDUDUDUDUUUUUUUUUDUUDUUDUUUDUUDUUUUUUUUUUUDUDUDUDUUUUUUUUUUUUDUUUDUUDUDDUUDUDUDUUUUUUUUUUUUDUDUDUUDUUUDUUUUUUUDUUUUUUUUUDUDUDUDUDUUUUUUDUDUDUUDUDUDUDUUUUUUUUUUUUUUUDUDUDUDDDUUUDDDDDUUUUUUUUUUUUUUDDUDUUDUUDUDUUUUUUDUDUDUDUDUUUUDUUUUDUDUDUUUDUUDDUUUUUUUUUUUUUUUUUUDUUDUUDUUUDUDUUUUUUUUUUUDUUUDUUUUDUDUDUUUUUUUUUDUUUDUUUDUUDUUUUUUUUUUUUDDUDUDUDUUUUUUUUUUUUUUUDUUUDUUUUDUUDUUDUUUUUUUUUUUDUDUUDUUUDUUUUUUDUDUDUUDUUUUUUUUUUUUDUUUDUUDUDUDUUUUDUDUDUDUDUUUUUUUUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUUU -> 872


8
Tôi thất vọng vì nhiệm vụ không tạo ra nghệ thuật ASCII đó.
dùng253751


Thay vì một chuỗi, chúng ta có thể lấy một danh sách các mã ký tự không?
Cyoce

@Cyoce Chỉ khi ngôn ngữ của bạn không có cách nào khác để biểu thị một chuỗi.
Zgarb

Câu trả lời:


10

CJam, 26 25 22 byte

0l{i"()~ "=~0e>_}%ri#)

Định dạng đầu vào là các hướng dẫn trên dòng đầu tiên và chiều cao bậc thang trên thứ hai.

Kiểm tra nó ở đây.

Giải trình

0         e# Push a 0 - the initial position of the robot.
l         e# Read the instructions.
{         e# Map this block over the instruction...
  i       e#   Convert to character code. D -> 68, U -> 85, R -> 82.
  "()~ "= e#   We use these as cyclic indices into this array. Note that the values
          e#   modulo 4 are 0, 1 and 2, respectively. So U -> ) (increment),
          e#   D -> ( (decrement), R -> ~ (bitwise NOT, i.e negated and decrement).
  ~       e#   Evaluate the character as code.
  0e>     e#   Clamp to non-negative numbers. So D can't go below 0, and since R is
          e#   guaranteed to yield something negative, this resets it to zero.
  _       e#   Duplicate, so we keep one copy of the current position on the stack.
}%        e# Since this was a map, the result will be wrapped in an array.
ri        e# Read the ladder height and convert it to an integer.
#         e# Find its first occurrence in the list of positions.
)         e# The result is off by one, so we increment it.

Ý tưởng tốt để xử lý tất cả các lệnh ngay cả sau khi vụ nổ. Tôi sẽ mượn nó để tiết kiệm một vài byte
Luis Mendo

7

C, 83 71 + 4 = 75 byte

Cảm ơn @Josh đã cho tôi thấy phong cách K & S , cho phép tắt 8 byte !!

f(i,s,z,a)char*s;{z-=*s<82?z>0:*s>82?-1:z;return z-i?f(i,s+1,z,a+1):a;}

Giải thích:

f(i,s,z,a)char*s;{ // function needs one integer and one "string"
  z-=              // z is the bot's height
    *s<82?         // if 'Down'
      z>0          // then subtract 1 when z>0 or nothing otherwise
    :*s>82?        // else if 'Up'
      -1           // increase height z-=-1
    :z;            // else reset z=z-z
  return z-i?      // if z is not the max height
    f(i,s+1,z,a+1) // try next step
  :a;              // else print how many calls/steps were made
}                  // end of function

Cuộc gọi ví dụ:

f(1,"U",0,1);    // I've added 4 bytes in the score because of ",0,1"

Kiểm tra trực tiếp trên ideone


1
Câu trả lời hay, nhưng có thể đáng lưu ý rằng chức năng này chỉ có thể được sử dụng một lần một cách hiệu quả kể từ khi toàn cầu zakhông được đặt lại.
Josh

@Josh. Tôi đã cập nhật. :)
đã xóa ngày

1
Tuyệt vời! Bạn cũng có thể lưu một vài ký tự bằng cách chơi xung quanh với các khai báo kiểu trong hàm của mình: codegolf.stackexchange.com/a/40266/13877
Josh

@Josh. Wow điều này thật tuyệt vời! cảm ơn
đã xóa ngày

6

JavaScript (ES6), 54 53 byte

n=>c=>(f=p=>n-p?f({D:p&&p-1,U:p+1}[c[i++]]|0):i)(i=0)

Giải trình

Sử dụng một hàm đệ quy trong nội bộ.

var solution =

n=>c=>(
  f=p=>             // f = recursive function, p = position of robot on ladder
    n-p?            // if p != n
      f({           // execute the next command
          D:p&&p-1, // D -> p = max of p - 1 and 0
          U:p+1     // U -> p = p + 1
        }[c[i++]]   // get current command then increment i (current command index)
        |0          // R -> p = 0
      )
    :i              // else return the current command index
)(i=0)              // initialise p and i to 0 for the first recurse
N = <input type="number" id="N" value="354" /><br />
C = <input type="text" id="C" value="UUDDUUDUDUUDDUDUUUUDDDUDUUDUDUDUDDUUUUDUDUUDUDUUUDUDUDUUDUUUDUUUUUDUUDUDUUDUDUUUUUDUDUUDUDUDUDDUUUUUUUDUDUDUDUUUUUDUDUDUDUDUDUDUDUUDUUUUUURUUUDUUUUDDUUDUDUDURURURUDUDUUUUDUUUUUUDUDUDUDUDUUUUUUDUDUUUUUUUDUUUDUUDUDUDUUDUDUDUUUUUUUUUUDUUUDUDUUDUUDUUUDUUUUUUUUUUUUUDUUDUUDUDUDUUUDUDUUUUUUUDUUUDUUUDUUDUUDDUUUUUUUUDUDUDUDUDUUUUDUDUUUUUUUUDDUUDDUUDUUDUUDUDUDUDUUUUUUUUUDUUDUUDUUUDUUDUUUUUUUUUUUDUDUDUDUUUUUUUUUUUUDUUUDUUDUDDUUDUDUDUUUUUUUUUUUUDUDUDUUDUUUDUUUUUUUDUUUUUUUUUDUDUDUDUDUUUUUUDUDUDUUDUDUDUDUUUUUUUUUUUUUUUDUDUDUDDDUUUDDDDDUUUUUUUUUUUUUUDDUDUUDUUDUDUUUUUUDUDUDUDUDUUUUDUUUUDUDUDUUUDUUDDUUUUUUUUUUUUUUUUUUDUUDUUDUUUDUDUUUUUUUUUUUDUUUDUUUUDUDUDUUUUUUUUUDUUUDUUUDUUDUUUUUUUUUUUUDDUDUDUDUUUUUUUUUUUUUUUDUUUDUUUUDUUDUUDUUUUUUUUUUUDUDUUDUUUDUUUUUUDUDUDUUDUUUUUUUUUUUUDUUUDUUDUDUDUUUUDUDUDUDUDUUUUUUUUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUUU" /><br />
<button onclick="result.textContent=solution(+N.value)(C.value)">Go</button>
<pre id="result"></pre>


4

Perl, 47 + 2 = 49 byte

$z-=-/U/||$z&&/D/;$z*=!/R/;$^I<=$z&&last}{$_=$.

Yêu cầu -pcờ, -i$Ncho chiều cao sau và danh sách di chuyển được phân tách bằng dòng mới:

$ perl -pi10 ladderbot.pl <<<< $'U\nU\nU\nU\nU\nU\nR\nU\nU\nU\nU\nU\nU\nU\nR\nU\nU\nU\nU\nU\nU\nU\nU\nR\nU\nU\nU\nU\nU\nU\nU\nU\nU\nU\nU\nU\nU\nU'
34

Làm thế nào nó hoạt động:

                                                # '-p' wraps the code in (simplified):
                                                # while($_=<>) {...print $_}
$z-=-/U/||$z&&/D/;                              # Subtract -1 if UP. subtract 1 if DOWN
                  $z*=!/R/;                     # If R then times by zero
                           $^I<=$z&&last        # Break while loop if N is reached
                                        }{      # Eskimo operator:
                                                # while($_=<>){...}{print$_}
                                          $_=$. # `$.` contains number of lines read from input.

Đã ký:

LINE: while (defined($_ = <ARGV>)) {
    $z -= -/U/ || $z && /D/;
    $z *= !/R/;
    last if $^I <= $z;
}
{
    $_ = $.;
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

4

JavaScript (SpiderMonkey 30+), 65 64 byte

(n,s,i=0)=>[for(c of s)if(i<n)c<'E'?i&&i--:c>'T'?i++:i=0].length

Làm thế nào nó hoạt động

Đầu tiên chúng ta đặt biến ithành 0. Điều này sẽ theo dõi xem có bao nhiêu bước robot đã leo lên. Sau đó, với mỗi char ctrong chuỗi đầu vào, chúng tôi chạy logic sau:

  1. Nếu ilớn hơn hoặc bằng n, đừng làm gì cả.
  2. Nếu c"D":
    • Nếu ilà 0, hãy để nguyên như vậy.
    • Nếu không, giảm nó bằng 1.
  3. Nếu c"U", tăng thêm i1.
  4. Nếu không, đặt ithành 0.

Bằng cách cắt bỏ nếu i>=n, chúng tôi tránh thêm bất kỳ mục nào vào mảng sau khi robot đã đạt đến đỉnh. Vì vậy, chúng ta chỉ cần trả về độ dài của mảng kết quả.


3

Haskell, 65 byte

x%'U'=x+1
x%'D'=max(x-1)0
x%_=0
f n=length.fst.span(<n).scanl(%)0

Ví dụ sử dụng: f 4 "UDDUURUUUUUUUDDDD" -> 10.

%điều chỉnh vị trí hiện tại trên thang, lập scanldanh sách tất cả các vị trí, fst.span(<n)lấy phần trước khi nổ và lengthđếm các bước.


Công việc tuyệt vời với sự kết hợp của các đối số được đặt tên và
bố cục

3

JavaScript (ES6), 65 byte

(n,s)=>[...s].map(_=>i=_<'E'?i&&i-1:_>'T'?i+1:0,i=0).indexOf(n)+1


Tôi nghĩ rằng 0,i=0có thể được thay đổi đểi=0
Cyoce

@Cyoce hmm, thất bại đối với tôi trong một tab mới (hoạt động trên trang này b / ci đã được xác định)
Charlie Wynn

@CharlieWynn xin lỗi, đã có sự ưu tiên của tôi lẫn lộn
Cyoce

3

MATL , 37 34 byte

Oj"t@4\1=?Q}6M?x0}qt0>*]]]N$h=f1)q

Hãy thử trực tuyến!

Giải trình

Vị trí dựa trên 0. Mỗi vị trí mới được đẩy lên ngăn xếp giữ các vị trí cũ hơn. Vì vậy, kích thước ngăn xếp đại diện cho số lượng chuyển động cho đến nay, cộng với 1.

Một vòng lặp được sử dụng để xử lý mỗi lệnh. Vòng lặp được thoát khi vị trí đạt đến độ cao bậc thang xử lý tất cả các lệnh, ngay cả sau vụ nổ (ý tưởng được lấy từ câu trả lời của Martin ). Kết quả cuối cùng được đưa ra bởi chỉ số của vị trí đầu tiên bằng với chiều cao bậc thang.

O             % push a 0: initial position (0-based)
j             % take first input (commands) as a string
"             % for each command
  t           %   duplicate current position
  @           %   push command
  4\          %   modulo 4. This gives 1, 2, 0 for 'U','R', 'D'
  1=?         %   if result equals 1 (command 'U')
    Q         %     increase position by 1
  }           %   else
    6M?       %     if result was nonzero (command 'R')
      x0      %       delete current position and push 0
    }         %     else (command 'D')
      q       %       decrement by 1
      t0>*    %       turn negative values into 0
    ]         %     end if
  ]           %   end if
]             % end for each
N$h           % pack all numbers in the stack into an array
=             % implicitly read second input: ladder height
f1)q          % find first position equal to that, and subtract 1.
              % Implicitly display

3

Python 2, 63 62 byte

f=lambda n,s,h=0:h^n and-~f(n,s[1:],-[2%~h,~h,0][ord(s[0])%4])

Ví dụ, f(4, 'UDDUURUUUUUUUDDDD')10.

xnor tìm thấy một biểu thức thậm chí còn ngắn hơn: 2%~hthực sự tuyệt vời :)


Đẹp tìm với %4. Nếu tôi không nhầm, bạn có thể cứu một nhân vật bằng cách làm -[2%~h,~h,0][ord(s[0])%4].
xnor

3

PowerShell, 86 79 byte

param($a,[char[]]$b)$b|%{$d++;if(($c-=((1,0)[!$c],-1,$c)[$_%4])-ge$a){$d;exit}}

Một chút trang bị lại của tôi Khi ông già Noel vào tầng hầm? câu trả lời.

Đưa đầu vào $a$b, rõ ràng đúc $bdưới dạng char-mảng. Chúng tôi sau đó lặp lại với |%{...}tất cả $b. Mỗi lần lặp, chúng tôi tăng số lượt truy cập của chúng tôi $d.

Sau đó, một iftuyên bố để kiểm tra xem chúng tôi đã đạt đến đỉnh -ge$a. Nếu vậy, chúng tôi đầu ra $dexit. Câu iflệnh được xây dựng từ một giả ba được tạo bằng cách gán $cdấu trừ bằng với kết quả của một số chỉ mục vào một mảng.

Chúng tôi có một thủ thuật mà các giá trị ASCII của D, RUtương ứng với 0, 21khi lấy modulo-4, do đó $_%4phục vụ như là chỉ số đầu tiên của chúng tôi. Nếu đó là R, bộ đó$c bằng $c-$c, thực hiện thiết lập lại. Nếu U, điều đó có nghĩa là chúng ta cần phải đi lên, vì vậy $c-(-1)kết quả. Mặt khác D, vì vậy chúng tôi cần kiểm tra xem chúng tôi đã ở dưới cùng chưa (đó là !$c- trong PowerShell, "không-không" là "đúng" hoặc 1) và được đặt $cbằng $c-0hoặc $c-1tương ứng.

Chỉnh sửa - Đã lưu 7 byte bằng cách sử dụng phép gán bằng nhau thay vì gán trực tiếp


3

Perl 5, 61 byte

Bao gồm hai byte cho -F -i. (-M5.01 là miễn phí.)

Đầu vào của số nguyên (ví dụ 10) là perl -M5.01 -F -i10 robot.pl; đầu vào của các lệnh bậc thang là STDIN.

for(@F){($i+=/U/)-=/R/?$i:$i&&/D/;$j++;last if$^I<=$i}say$j

sử dụng perl 5.12.5, tôi cũng phải bật chế độ tự động nhận -anFtrước khi nó in bất cứ thứ gì cho tôi. nhưng nó dường như được kích hoạt ngầm chỉ -Ftrong 5.20.3. bạn có thể xác minh điều này?
ardew

@ardnew, chỉ cần -Fáp dụng cho tôi (5,20 hoặc 5,22 hoặc hơn). Iirc perldoc perlrun hiện tại nói rằng nó ngụ ý -a-angụ ý -n.
msh210

Chúng ta tính -ibao nhiêu? Tôi có thể thấy bạn tính nó là 1 nhưng tôi đoán nó thực sự nên được tính là 3? :-)
andlrc 3/03/2016

@ dev-null, tại sao ba? Tôi nghĩ rằng quy ước về PPCG.SE là đếm các chữ cái trong một lá cờ chứ không phải các ký tự gạch nối, nhưng xin vui lòng sửa cho tôi nếu tôi sai. (Có vẻ như bạn đang sử dụng cùng một quy ước đếm cho câu trả lời của chính yoru cho câu hỏi này. (
Vô tình

@ msh210 Tôi chỉ đếm sự khác biệt khi sử dụng -ivà không có perl -i10 -pe';'vs perl -pe';'3 ký tự hơn và sau đó số lượng đầu vào - mà tôi đoán chúng ta không nên đếm. Nhưng tôi có thể sai ngay cả khi sáng nay :-)
andlrc

3

Vitsy, 44 byte

Có lẽ có thể có một số giảm - tôi sẽ tìm ra một số điều nữa nếu tôi có thể.

0vVWl:X[4M1+mDvV-);]lvXv?v-N
vD([1-]
v1+
vX0

Giải thích (đang tiến hành):

0vVWl:X[4M1+mDvV-);]lvXv?v-N
0v             Save 0 as our temp var to edit.
  V            Save the input as a global var.
   W           Grab a line of STDIN.
    l          Push the length of the stack.
     :         Clone the stack. This is for later use.
      X        Remove the top item of the stack (we don't need the length right now.
[            ] Do the stuff in the brackets infinitely.
 4M            Modulo 4.
   1+          Add one.
     m         Go to the line index as specified by the top item of the stack.
      Dv       Duplicate the top item, save it in the temp var.
        V-);   If the top value is equal to the input number, exit the loop.
l              Push the length of the stack.
 vXv           Dump the temp var, then save the top item.
    ?          Rotate back to the original stack.
     v-        Subtract the top item (the original length) by the temp var (new length)
       N       Output the top item of the stack of the number.

vD([1-]
v              Push the temp variable to the stack.
 D([  ]        If this value is not zero...
    1-         Subtract one from it.

v1+            Push the temp variable to the stack, then add one to it.

vX0            Dump the temp var and replace it with zero.

Dùng thử trực tuyến! (trường hợp thử nghiệm lớn)


2

PHP, 88 byte

Điều này tạo ra một số thông báo (3 + 2n trong đó n là số lệnh chạy) nhưng điều đó không quan trọng đối với việc chơi gôn, phải không?

<?php for(;$x++<$argv[1];)switch($argv[2][$i++]){case R;$x=2;case D;--$x?--$x:0;}echo$i;

vô dụng:

<?php                    # actually 1 byte shorter not as a function
for(;$x++<$argv[1];)     # not initialising the $x causes a notice but still works
                         # post increment $x by 1 regardless of the command (saves us writing a U case)
  switch($argv[2][$i++]) # get next command, increment number of commands
    {case R;             # R gets treated as a constant with value 'R'. and a notice
      $x=2;              # falling through to D which will double decrement so set to 2
    case D;              # same trick as R
      --$x?--$x:0;}      # decrement once then again if >0
echo$i;                  # output

Thông báo là tốt, miễn là mã vẫn có thể được chạy.
Zgarb

2

Python, 121 byte

def f(a,n):
 i=c=0
 while i<n:i={'U':lambda x:x+1,'D':lambda x:0 if x==0 else x-1,'R':lambda x:0}[a[c]](i);c+=1
 return c

1
Chào mừng đến với PPCG! Ở đây, chúng tôi yêu cầu các câu trả lời là các chương trình đầy đủ lấy đầu vào từ STDIN và in sang STDOUT hoặc các hàm lấy đầu vào làm đối số và trả về giá trị đầu ra. Giải pháp của bạn mã hóa cứng các đầu vào, không được phép.
Zgarb

Sửa chữa bằng cách hình thành chức năng, tôi đã sử dụng trình thông dịch khi tôi viết nó.
Alex Burge

Cảm ơn bạn! Bạn cũng nên thêm một tiêu đề của biểu mẫu ## Python, <N> bytesđể cho người khác thấy điểm của bạn.
Zgarb

Tôi không nghĩ có thể có một chức năng không tên.
dùng48538

Bạn có thể lưu byte bằng cách thay thế 0 if x==0 else x-1bằngx and x-1
Cyoce

2

JavaScript, 131 106 byte

Tôi biết điều này sẽ không giành chiến thắng trong một cuộc thi Code Golf, nhưng đây là một giải pháp thú vị và ngu ngốc để thực hiện:

l=>s=>Function('i=c=0;'+s.replace(/./g,x=>`c++;i${{R:"=0",U:`++;if(i>=${l})re‌​turn c`,D:"--"}[x]};`))()

Tôi đã đi ngược lại với một lộ trình "chức năng" bằng cách tạo ra một giải pháp mệnh lệnh được tạo động, bất kỳ trường hợp nào của một lệnh được thay thế bằng tăng hoặc giảm và tăng số lượt truy cập.

Cảm ơn Cycoce đã tiết kiệm cho tôi 29 byte!


Ở đây, tôi đã đánh gôn 29 byte:l=>s=>Function('i=c=0;'+s.replace(/./g,x=>`c++;i${{R:"=0",U:`++;if(i>=${l})return c`,D:"--"}[x]};`))()
Cyoce

2

Trăn 3, 90

Đã lưu 6 byte nhờ DSM.

Khá đơn giản ngay bây giờ.

def f(c,n):
 f=t=0
 for x in c:
  f+=1|-(x<'E');f*=(x!='R')&(f>=0);t+=1
  if f>=n:return t

Các trường hợp thử nghiệm:

assert f('U', 1) == 1
assert f('DDRUDUU', 1) == 4
assert f('UDDUUUUURUUUUDDDD', 4) == 7
assert f('UDDUURUUUUUUUDDDD', 4) == 10
assert f('UUDDUUDUDUUDDUDUUUUDDDUDUUDUDUDUDDUUUUDUDUUDUDUUUDUDUDUUDUUUDUUUUUDUUDUDUUDUDUUUUUDUDUUDUDUDUDDUUUUUUUDUDUDUDUUUUUDUDUDUDUDUDUDUDUUDUUUUUURUUUDUUUUDDUUDUDUDURURURUDUDUUUUDUUUUUUDUDUDUDUDUUUUUUDUDUUUUUUUDUUUDUUDUDUDUUDUDUDUUUUUUUUUUDUUUDUDUUDUUDUUUDUUUUUUUUUUUUUDUUDUUDUDUDUUUDUDUUUUUUUDUUUDUUUDUUDUUDDUUUUUUUUDUDUDUDUDUUUUDUDUUUUUUUUDDUUDDUUDUUDUUDUDUDUDUUUUUUUUUDUUDUUDUUUDUUDUUUUUUUUUUUDUDUDUDUUUUUUUUUUUUDUUUDUUDUDDUUDUDUDUUUUUUUUUUUUDUDUDUUDUUUDUUUUUUUDUUUUUUUUUDUDUDUDUDUUUUUUDUDUDUUDUDUDUDUUUUUUUUUUUUUUUDUDUDUDDDUUUDDDDDUUUUUUUUUUUUUUDDUDUUDUUDUDUUUUUUDUDUDUDUDUUUUDUUUUDUDUDUUUDUUDDUUUUUUUUUUUUUUUUUUDUUDUUDUUUDUDUUUUUUUUUUUDUUUDUUUUDUDUDUUUUUUUUUDUUUDUUUDUUDUUUUUUUUUUUUDDUDUDUDUUUUUUUUUUUUUUUDUUUDUUUUDUUDUUDUUUUUUUUUUUDUDUUDUUUDUUUUUUDUDUDUUDUUUUUUUUUUUUDUUUDUUDUDUDUUUUDUDUDUDUDUUUUUUUUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUUU', 354) == 872

1

PHP, 129 byte

function r($h,$s){$i=0;$c=1;while($x=$s[$i++]){if($x=='U'){$c++;}elseif($x=='D'){--$c<1?$c=1:0;}else{$c=1;}if($c>$h){return$i;}}}

Không chiến thắng, nhưng thú vị để tạo ra. PHP dường như không thích các phần trống trong toán tử ternary (nó đưa ra lỗi Cú pháp), vì vậy tôi đã phải đặt một0 nó ở đó.

Phiên bản bị đánh cắp:

function r($h,$s) {          // $h - height of ladder; $s - instructions
  $i = 0;                    // Instruction index
  $c = 1;                    // Position on ladder
  while ($x = $s[$i++]){     // Set $x to current instruction and increment index
    if ($x == 'U'){          // If instruction is U...
      $c++;                  // Increment ladder position
    } elseif ($x == 'D') {   // If instruction is D...
      --$c < 1 ? $c = 1 : 0; // Decrement ladder position, if under 1 set to 1
    } else {                 // If instruction is anything else (in this case R)
      $c = 1;                // Reset ladder position
    }
    if ($c > $h) {           // If ladder position is larger than height...
      return $i;             // Return current instruction index
    }
  }
}

1

PHP, 113 byte

Phiên bản nhỏ hơn của https://codegolf.stackexchange.com/a/74575/13216

function r($h,$s){$i=0;$c=1;while($x=$s[$i++]){$c+=($x=='U'?1:($x=='D'?($c>1?-1:0):1-$c));if($c>$h){return $i;}}}

Ung dung:

// $h - height of ladder; $s - instructions
function r($h,$s) {
    $i = 0;
    $c = 1;
    while ($x = $s[$i++]) {
        $c += (
            $x=='U'?
                1
            :
                (
                    $x=='D'? (
                        $c>1?
                            -1
                        :
                            0
                    ):
                        1-$c
                )
        );
        if ($c > $h) {
            return $i;
        }
    }
}

2
Bài đăng đầu tiên tuyệt vời! Tôi chỉnh sửa bài viết của bạn để dễ đọc hơn. Chúc bạn chơi golf vui vẻ!
GamrCorps

1

Bình thường, 19 byte

x.u@[tWNNhN00)CYz0Q

Dùng thử trực tuyến: Trình diễn hoặc Test Suite

Giải trình:

x.u@[tWNNhN00)CYz0Q   implicit: z = input string, Q = input number
 .u             z0    reduce z: for each char Y in z manipulate N = 0 with:
    [        )           create a list with
     tWNN                  * N-1 if N>0 else N
         hN                * N+1
           0               * 0
            0              * 0
   @          CY         replace N by the ord(Y)-th element (mod 4)
 .u                   .u give us a list with all intermediate values of N
x                 Q   print the index of Q in this list

1

Java, 250 byte

int cmds(int n, String s) {
int steps=1;
int count=0;
for (int i=0;i< s.length();i++) {
count++;
char c=s.charAt(i);
switch(c){
case 'D':
steps=(steps==1)?1:--steps;
break;
case 'R':
steps=1;
break;
case 'U':
++steps;
break;
}
if(steps>n)
return count;
}
return 0;
}

2
Khi trả lời mã-golf -challenge, bạn nên bắt đầu câu trả lời của mình # <language_name>, XX bytes. Ngoài ra, bạn có thể giảm tên biến của mình thành một ký tự và loại bỏ các khoảng trắng thừa, theo cách này, số byte của bạn sẽ giảm (đó là mục tiêu ở đây) ... Ah, và chào mừng bạn đến với PPCG!
đã xóa

Một số mẹo: Để thụt mã của bạn dưới dạng mã, thêm 4 khoảng trắng ở đầu dòng. Bạn đã xóa một số khoảng trắng, nhưng bạn vẫn có thể xóa thêm (ví dụ: thay vì int steps=1; int count=0;bạn có thể sử dụng int s=1,c=0;- nhìn tôi đã thay đổi tên biến - v.v.). Bạn vẫn có thể hiển thị phiên bản chưa được chỉnh sửa của mình bên dưới phiên bản được đánh golf với lời giải thích (cách này dễ dàng cho ai đó giúp bạn chơi nhiều byte hơn).
đã xóa

1

C, 91 byte

Không có cảnh báo với gcc -Wall . Đệ quy và biểu thức phân tách bằng dấu phẩy.

r.c chứa chức năng trần:

int r(int N,int n,int s,char*C){return*C&&s<=N?s+=*C&2?-s:*C&1?1:-1,r(N,n+1,s?s:1,C+1):n;}

Đã bình luận

int r(int N,   // number of steps on ladder
      int n,   // result, seed with 0
      int s,   // current step, seed with 1
      char *C  // command string
      )
{
    return *C&&s<=N ?  // still reading commands and still on ladder?
       s+=                // increment step value by...
        *C&2?             // bit test if 'R' but not 'U' or 'D'.
         -s               // negate to 0, will set to 1 in call if needed
         :*C&1?           // Not 'R', is it 'U'?
            1             // 'U', add 1
            :-1,          // Must be 'D', subtract 1
       r(N,n+1,s?s:1,C+1) // Recursive call, and fix case where s==0.
      :n;                 // end of string or fell off ladder
}

Để tham khảo,

'U'.charCodeAt(0).toString(2)
"1010101"
'D'.charCodeAt(0).toString(2)
"1000100"
'R'.charCodeAt(0).toString(2)
"1010010"

roboladder.c vỏ bánh,

#include <stdio.h>
#include <stdlib.h>
#include "r.c"
int main(int argc, char * argv[])
{
  int N = atoi(argv[1]);
  int n = r(N,0,1,argv[2]);
  int check = atoi(argv[3]);
  printf("%d : %d\n", n, check);
  return 0;
}

Makefile để thử nghiệm,

run:
    @gcc -Wall robotladder.c -o robotladder 
    @./robotladder 1 U 1
    @./robotladder 1 DDRUDUU 4  
    @./robotladder 4 UDDUUUUURUUUUDDDD 7
    @./robotladder 4 UDDUURUUUUUUUDDDD 10
    @./robotladder 6 UUUUUDRUDDDDRDUUUUUUDRUUUUUUUDR 20
    @./robotladder 10 UUUUUURUUUUUUURUUUUUUUURUUUUUUUUUUUUUU 34
    @./robotladder 6 UUUDUUUUDDDDDDDDDDDDDDRRRRRRRRRRRUUUUUU 8
    @./robotladder 6 UUUDUUUDURUDDDUUUUUDDRUUUUDDUUUUURRUUDDUUUUUUUU 32
    @./robotladder 20 UUDDUDUUUDDUUDUDUUUDUDDUUUUUDUDUUDUUUUUUDUUDUDUDUUUUUDUUUDUDUUUUUUDUDUDUDUDUUUUUUUUUDUDUUDUDUUUUU 56
    @./robotladder 354 UUDDUUDUDUUDDUDUUUUDDDUDUUDUDUDUDDUUUUDUDUUDUDUUUDUDUDUUDUUUDUUUUUDUUDUDUUDUDUUUUUDUDUUDUDUDUDDUUUUUUUDUDUDUDUUUUUDUDUDUDUDUDUDUDUUDUUUUUURUUUDUUUUDDUUDUDUDURURURUDUDUUUUDUUUUUUDUDUDUDUDUUUUUUDUDUUUUUUUDUUUDUUDUDUDUUDUDUDUUUUUUUUUUDUUUDUDUUDUUDUUUDUUUUUUUUUUUUUDUUDUUDUDUDUUUDUDUUUUUUUDUUUDUUUDUUDUUDDUUUUUUUUDUDUDUDUDUUUUDUDUUUUUUUUDDUUDDUUDUUDUUDUDUDUDUUUUUUUUUDUUDUUDUUUDUUDUUUUUUUUUUUDUDUDUDUUUUUUUUUUUUDUUUDUUDUDDUUDUDUDUUUUUUUUUUUUDUDUDUUDUUUDUUUUUUUDUUUUUUUUUDUDUDUDUDUUUUUUDUDUDUUDUDUDUDUUUUUUUUUUUUUUUDUDUDUDDDUUUDDDDDUUUUUUUUUUUUUUDDUDUUDUUDUDUUUUUUDUDUDUDUDUUUUDUUUUDUDUDUUUDUUDDUUUUUUUUUUUUUUUUUUDUUDUUDUUUDUDUUUUUUUUUUUDUUUDUUUUDUDUDUUUUUUUUUDUUUDUUUDUUDUUUUUUUUUUUUDDUDUDUDUUUUUUUUUUUUUUUDUUUDUUUUDUUDUUDUUUUUUUUUUUDUDUUDUUUDUUUUUUDUDUDUUDUUUUUUUUUUUUDUUUDUUDUDUDUUUUDUDUDUDUDUUUUUUUUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUUU 872
    @wc -c r.c

1

Toán học, 114 120 byte

(d=#~Max~1-1&;u=#+1&;r=1&;s=StringToStream@ToLowerCase@#;l=1;t=1;While[(l=ToExpression[s~Read~Character]@l)<=#2,t++];t)&

Hàm ẩn danh, có hai đối số (C, N). Cẩn thận sử dụng cái này, vì nó không đóng luồng nó mở. Ngoài ra, nó gán tất cả các biến của nó trên toàn cầu.

Chỉnh sửa để thay thế d=#-1&bằng d=#~Max~1-1&, để robie không đi đào.


Đợi đã: Tôi không nghĩ rằng điều này là hợp lệ. Nó cho phép robot đi xuống các nấc thang âm. Rất tiếc. Điều đó sẽ dạy tôi kiểm tra không toàn diện ... Tôi sẽ sửa lỗi khi tôi có cơ hội.
hYPotenuser

1

Toán học, 112 byte

i=0;First@Position[ToExpression["{"<>#~StringReplace~{"U"->"i++,","D"->"i=i~Max~1-1,","R"->"i=0,"}<>"0}"],#2-1]&

0

Clojure, 92 84 byte

Đếm nbằng không thay vì bằng không n, có thể sử dụng take-while pos?.

#(count(take-while pos?(reductions(fn[p o](if o(min(o p 1)%)%))%(map{\U -\D +}%2))))

Nguyên:

#(count(take-while(partial > %)(reductions(fn[p o](if o(max(o p 1)0)0))0(map{\U +\D -}%2))))

Bản đồ đối số thứ 2 Utới +, Dtới- và những người khác nil. Chức năng giảm chạy (operand position 1)với non-null operandvà mặt 0khác. Đưa ra các giá trị cho đến khi chúng tôi cao hơn đối số đầu vào thứ nhất và tính số lượng chúng tôi có.


0

Toán học, 67 byte

(p=i=0;While[p<#,p=Switch[#2[[++i]],"U",p+1,"D",1~Max~p-1,_,0]];i)&

Các hàm không tên của hai đối số, một số nguyên dương và một danh sách các ký tự, trả về một số nguyên dương. Việc Whiletriển khai đơn giản hơn các mục Mathicala khác, giúp quản lý kết quả có độ dài cạnh tranh cao hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.