사다리에 로봇


30

배경

벽에 사다리를 기대고 올라갈 수있는 원격 제어 로봇이 있습니다. 로봇에 세 가지 명령을 보낼 수 있습니다.

  • UP: 로봇이 한 단계 위로 올라갑니다. 가장 높은 단계에 있으면 넘어져 넘어져 폭발합니다.
  • DOWN: 로봇이 한 단계 아래로 내려갑니다. 가장 낮은 단계에 있었다면 아무 일도 일어나지 않습니다.
  • RESET: 로봇이 가장 낮은 단계로 돌아갑니다.

또한 일련의 명령을 보낼 수 있으며 로봇은 하나씩 명령을 실행합니다. 당신의 임무는 그 움직임을 예측하는 것입니다.

입력

귀하의 입력은 양의 정수이다 N사다리의 단계의 수를 나타내는, 그리고 비어 있지 않은 문자열 C을 통해 UDR나는 로봇에 전송 한 명령을 나타내는. 당신은 그것을 가정 할 수 있습니다 N < 1000. 로봇은 사다리의 가장 낮은 단계에서 초기화됩니다.

산출

어느 시점에서 로봇이 가장 높은 단계를 넘어서 폭발 할 것이 보장됩니다. 출력은 이것이 발생하기 전에 실행되는 명령 수입니다.

입력 고려 N = 4하고 C = "UDDUURUUUUUUUDDDD" 로봇로 나타낸 @다음과 같은 4 단계 사다리을 따라 이동한다 :

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

로봇이 폭발했기 때문에 나머지 명령은 실행되지 않습니다. 폭발은 10 번의 명령 후에 일어 났으므로 올바른 출력은 10입니다.

규칙과 득점

전체 프로그램이나 함수를 작성할 수 있습니다. 바이트 수가 가장 적고 표준 허점이 허용되지 않습니다.

테스트 사례

  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
작업이 해당 ASCII 아트를 생성하지 않는 것에 실망했습니다.
user253751


문자열 대신 문자 코드 목록을 가져올 수 있습니까?
Cyoce

@Cyoce 언어에 문자열을 나타내는 다른 방법이없는 경우에만 해당됩니다.
Zgarb

답변:


10

CJam, 26 25 22 바이트

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

입력 형식은 첫 번째 줄의 지침이고 두 번째 줄의 사다리 높이입니다.

여기에서 테스트하십시오.

설명

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.

폭발 후에도 모든 명령을 처리하는 것이 좋습니다. 나는 몇 바이트를 절약하기 위해 빌릴 것이다
Luis Mendo

7

C, 83 71 + 4 = 75 바이트

K & S 스타일 을 보여준 @Josh 에게 감사드립니다 .

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

설명 :

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

호출 예 :

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

이데온 라이브 테스트


1
멋진 대답은,하지만 기능이 효과적으로에만 전역 이후 한 번 사용할 수 있다는 지적 가치가있을 수도 za재설정되지 않습니다.
Josh

@조롱. 업데이트했습니다. :)
제거

1
대박! 함수에서 형식 선언을 사용하여 몇 문자를 저장할 수도 있습니다. codegolf.stackexchange.com/a/40266/13877
Josh

@조롱. 와우 대단해! 감사
제거

6

자바 스크립트 (ES6), 54 53 바이트

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

설명

내부적으로 재귀 함수를 사용합니다.

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 바이트

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

후자의 높이와 개행으로 구분 된 이동 목록 에는 -p플래그가 필요합니다 -i$N.

$ 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

작동 방식 :

                                                # '-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.

출발 :

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

자바 스크립트 (SpiderMonkey 30+), 65 64 바이트

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

작동 원리

먼저 변수 i를 0으로 설정 합니다. 그러면 로봇이 올라온 단계 수를 추적합니다. 그런 다음 c입력 문자열의 각 문자 에 대해 다음 논리를 실행합니다.

  1. 경우 i보다 크다거나 같음 n, 아무것도하지 않습니다.
  2. 만약 c입니다 "D":
    • 경우 i0, 그것은 그대로 둡니다.
    • 그렇지 않으면 1 씩 줄입니다.
  3. 경우 c입니다 "U"증가, i1 일까지.
  4. 그렇지 않으면 i0으로 설정하십시오 .

if 자르면 i>=n로봇이 맨 위에 도달 한 후 더 이상 항목을 배열에 추가하지 않아도됩니다. 따라서 결과 배열의 길이를 간단히 반환 할 수 있습니다.


3

하스켈, 65 바이트

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

사용 예 : f 4 "UDDUURUUUUUUUDDDD"-> 10.

%사다리의 현재 위치를 조정하고 scanl모든 위치의 목록을 작성 fst.span(<n)하며 폭발 전에 부품을 사용 length하고 단계를 계산합니다.


명명 된 인수와 작곡 / 커링의 조합에 대한
훌륭한 직업


3

MATL , 37 34 바이트

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

온라인으로 사용해보십시오!

설명

위치는 0부터 시작합니다. 각각의 새로운 위치는 오래된 위치를 유지하면서 스택으로 밀려납니다. 따라서 스택 크기는 현재까지의 움직임 수에 1을 더한 값입니다.

루프는 각 명령을 처리하는 데 사용됩니다. 위치가 사다리 높이에 도달 하면 폭발 후에도 모든 명령을 처리 할 때 루프 가 종료됩니다 ( Martin의 답변 에서 가져온 아이디어 ). 최종 결과는 사다리 높이와 동일한 첫 번째 위치의 색인으로 제공됩니다.

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

파이썬 2, 63 62 바이트

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

예를 들어 f(4, 'UDDUURUUUUUUUDDDD')입니다 10.

xnor는 더 짧은 표현을 찾았습니다. 2%~h정말 멋집니다 :)


와 좋은 발견 %4. 내가 실수하지 않으면을 수행하여 캐릭터를 저장할 수 있습니다 -[2%~h,~h,0][ord(s[0])%4].
xnor

3

PowerShell, 86 79 바이트

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

내의 약간의 재정비는 산타 지하를 입력 않는 경우? 대답.

입력을 $a받고 $b명시 적 $b으로 char-array로 캐스트 합니다. 그런 다음 |%{...}전체 를 반복 합니다 $b. 반복 할 때마다 카운터가 증가합니다 $d.

그런 다음을 사용 if하여 정상에 도달했는지 확인 하는 설명입니다 -ge$a. 그렇다면, 우리의 출력 $dexit. 이 if명령문은 $c여러 인덱스의 결과에 빼기-동일을 배열로 할당하여 생성 된 의사 삼항으로 구성 됩니다.

우리의 ASCII 값하는 트릭이 D, RU대응가 0, 21모듈로 4를 가지고 갈 때, 그래서 $_%4우리의 첫 번째 인덱스 역할을합니다. 그것의 경우 R, 그 세트 $c에 동일 $c-$c리셋을하고. 그렇다면 U, 우리는 올라 가야한다는 것을 의미합니다 $c-(-1). 결과. 그렇지 않으면 A의 D합니다 (의 우리가 맨 아래에 이미 있다면 확인해야하므로, !$c- PowerShell의 "하지 제로"는 "true"또는이다 1)와 세트 $c로 동일 $c-0또는 $c-1각각.

편집-직접 할당이 아닌 빼기 할당을 사용하여 7 바이트 저장


3

펄 5, 61 바이트

에 대한 2 바이트를 포함합니다 -F -i. ( -M5.01무료입니다.)

정수 (예 : 10)의 입력은 다음과 같습니다 perl -M5.01 -F -i10 robot.pl. 래더 명령의 입력은 STDIN입니다.

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

perl 5.12.5를 사용하면 -anF나에게 아무것도 인쇄하기 전에 자동 분할 모드를 명시 적으로 활성화 해야했습니다. 그러나 -F5.20.3 에서만 암시 적으로 활성화되는 것처럼 보입니다 . 이것을 확인할 수 있습니까?
ardnew

@ardnew, 그냥 -F나를 위해 충분했습니다 (5.20 또는 5.22 정도). 현재의 perldoc perlrun은 그것이 암시 -a하고 -a암시 한다고 말합니다 -n.
msh210

우리는 얼마를 계산 -i합니까? 나는 당신이 1로 계산하는 것을 볼 수 있지만 실제로 3으로 계산되어야한다고 생각합니까? :-)
andlrc

@ dev-null, 왜 세? PPCG.SE의 규칙은 문자를 하이픈 빼기 문자가 아닌 플래그로 계산하는 것이지만 잘못하면 나를 수정하십시오. (이 질문에 대한 yoru 자신의 답변에도 동일한 계산 규칙을 ​​사용하는 것 같습니다. (
실수로도

@ msh210 3 대 문자를 사용 -i하거나 사용 하지 않고 입력 숫자와 입력 숫자를 비교할 때 차이를 세고있었습니다. 그러나 나는 오늘 아침에 대해 잘못 생각할 수도 있습니다 :-)perl -i10 -pe';'perl -pe';'
andlrc

3

Vitsy, 44 바이트

아마도 약간의 축소가있을 수 있습니다-가능하다면 더 많은 것을 알아낼 것입니다.

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

설명 (진행 중) :

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.

온라인으로 사용해보십시오! (큰 테스트 사례)


2

PHP, 88 바이트

이것은 (3 + 2n 여기서 n은 실행되는 명령의 수입니다) 통지를 생성하지만 골프에는 중요하지 않습니다.

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

언 골프 :

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

코드를 계속 실행할 수있는 한주의가 필요합니다.
Zgarb

2

파이썬, 121 바이트

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
PPCG에 오신 것을 환영합니다! 여기서 기본적으로 답은 STDIN에서 입력을 받아 STDOUT으로 인쇄하는 전체 프로그램이거나 입력을 인수로 받아서 출력 값을 리턴하는 함수 여야합니다. 솔루션이 입력을 하드 코딩하므로 허용되지 않습니다.
Zgarb

기능을 형성함으로써 수정, 나는 그것을 작성할 때 통역을 사용하고있었습니다.
Alex Burge

고맙습니다! 또한 ## Python, <N> bytes점수를 다른 사람에게 표시 하려면 양식 헤더를 추가해야 합니다.
Zgarb

명명되지 않은 함수가있을 수 있다고 생각하지 않습니다.
user48538

0으로 대체0 if x==0 else x-1x and x-1
Cyoce

2

자바 스크립트, 131 106 Bytes-

이것이 Code Golf 경쟁에서 이길 수는 없다는 것을 알고 있지만 이것은 구현하기위한 재미 있고 어리석은 해결책이었습니다.

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

나는 동적으로 생성 된 명령형 솔루션을 만들어서 "기능적"경로와 반대가되었습니다. 명령의 모든 인스턴스는 증분 또는 감소와 카운터 증분으로 대체됩니다.

저를 29 바이트 절약 한 Cycoce에 감사드립니다!


나는 29 바이트를 골퍼했다 :l=>s=>Function('i=c=0;'+s.replace(/./g,x=>`c++;i${{R:"=0",U:`++;if(i>=${l})return c`,D:"--"}[x]};`))()
Cyoce

2

파이썬 3, 90

DSM 덕분에 6 바이트를 절약했습니다.

지금은 매우 간단합니다.

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

테스트 사례 :

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 바이트

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

승리하지는 않지만 만드는 재미. PHP는 삼항 연산자에서 빈 부분을 싫어하는 것 같습니다 (구문 오류가 발생합니다) 0.

언 골프 버전 :

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 바이트

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

언 골프 드 :

// $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
첫 번째 게시물! 가독성을 높이기 위해 게시물을 수정했습니다. 행복한 골프!
GamrCorps

1

Pyth, 19 바이트

x.u@[tWNNhN00)CYz0Q

온라인으로 사용해보십시오 : 데모 또는 테스트 스위트

설명:

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

자바, 250 바이트

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
응답 할 때 코드 골프 -challenge을, 당신과 당신의 대답을 시작해야합니다 # <language_name>, XX bytes. 또한 변수 이름을 각각 한 문자로 줄이고 여분의 공백을 제거 할 수 있습니다. 이렇게하면 바이트 수가 줄어 듭니다 (여기서는 목표입니다) ... 아, PPCG에 오신 것을 환영합니다!
제거함

몇 가지 팁 : 코드를 코드로 들여 쓰려면 줄 시작 부분에 4 개의 공백을 추가하십시오. 당신은 약간의 공간을 제거,하지만 당신은 여전히 더 제거 할 수 있습니다 (예를 : 대신 int steps=1; int count=0;사용할 수있는 int s=1,c=0;- 모습은 내가 변수 이름을 변경 - 등). 당신은 여전히 보여줄 수 ungolfed 아래 버전을 golfed (이 방법은 다른 사람의 도움을 당신을 위해 쉬운 설명과 버전이 골프를 더 바이트).
제거함

1

C, 91 바이트

에 경고가 없습니다 gcc -Wall. 재귀 및 쉼표로 구분 된 표현식.

r.c 베어 기능을 포함합니다 :

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

댓글,

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
}

참고로

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

roboladder.c 싸개,

#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 시험용,

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

Mathematica, 114120 바이트

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

두 개의 인수 (C, N)를 취하는 익명 함수. 열린 스트림을 닫지 않으므로 조심해서 사용하십시오. 또한 모든 변수를 전역 적으로 할당합니다.

대체 편집 d=#-1&d=#~Max~1-1&그 robie 파고하지 않도록.


잠깐 : 이것이 유효하지 않다고 생각합니다. 로봇이 음의 렁을 내려갈 수 있습니다. 으악. 그것은 포괄적이지 않은 테스트를 가르쳐 줄 것입니다 ... 나는 기회를 얻었을 때 수정 된 것을 올릴 것입니다.
hYPotenuser

1

매스 매 티카, 112 바이트

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

0

클로저, 92 84 바이트

n0 대신에 0으로 계산 하여 n활용할 수 있습니다 take-while pos?.

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

기발한:

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

에 두 번째 인수 U를 (으 +) D-매핑합니다 nil. 기능을 줄이면 실행 (operand position 1)null 이외로 operand하고 0, 그렇지 않으면. 첫 번째 입력 인수보다 높을 때까지 값을 가져와 우리가 가진 수를 계산합니다.


0

수학, 67 바이트

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

양의 정수를 리턴하는 양의 정수와 문자 목록의 두 인수의 이름이없는 함수. While다른 Mathematica 항목보다 더 간단한 구현으로보다 경쟁력있는 길이를 제공합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.