사다리에 로봇


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
멋진 대답은,하지만 기능이 효과적으로에만 전역 이후 한 번 사용할 수 있다는 지적 가치가있을 수도 z및 a재설정되지 않습니다.
— 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. 그렇다면, 우리의 출력 $d과 exit. 이 if명령문은 $c여러 인덱스의 결과에 빼기-동일을 배열로 할당하여 생성 된 의사 삼항으로 구성 됩니다.

우리의 ASCII 값하는 트릭이 D, R및 U대응가 0, 2및 1모듈로 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.