Робот на сходах


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.
користувач253751


Замість рядка можемо взяти список кодів символів?
Кіос

@Cyoce Тільки якщо ваша мова не має інших способів представити рядок.
Згарб

Відповіді:


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.

Гарна ідея обробити всі команди навіть після вибуху. Я позичу це, щоб заощадити кілька байт
Луїс Мендо

7

C, 83 71 + 4 = 75 байт

Дякую @Josh, що показав мені стиль K&S , який дозволив відключити 8 байт !!

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"

Живий тест на ideone


1
Приємна відповідь, але, можливо, варто відзначити, що функцію можна ефективно використовувати лише один раз, починаючи з глобальних точок, zі aне скидаються.
Джош

@Josh. Я оновив. :)
вилучено

1
Дивовижно! Ви також можете зберегти пару символів, погравши з деклараціями типу у своїй функції: codegolf.stackexchange.com/a/40266/13877
Josh

@Josh. Ого, це дивовижно! подяка
видалено

6

JavaScript (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

JavaScript (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", приріст iна 1.
  4. В іншому випадку встановіть iзначення 0.

Відрізаючи, якщо i>=nми уникаємо додавання більше елементів до масиву після того, як робот досяг вершини. Таким чином, ми можемо просто повернути довжину отриманого масиву.


3

Haskell, 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рахує кроки.


Хороша робота з поєднанням названих аргументів та композиції / каррі
Cyoce

3

JavaScript (ES6), 65 байт

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


Я думаю, що 0,i=0можна змінити наi=0
Cyoce

@Cyoce Хм, не вдається мені на новій вкладці (працює на цій сторінці b / ci вже визначено)
Charlie Wynn

@CharlieWynn вибачте, мій пріоритет змішався
Cyoce

3

MATL , 37 34 байт

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

Спробуйте в Інтернеті!

Пояснення

Позиція заснована на 0. Кожне нове положення висувається на стек, зберігаючи старіші позиції. Тож розмір стека представляє кількість рухів до цього часу плюс 1.

Для обробки кожної команди використовується цикл. Цикл виходить, коли положення досягає висоти сходів, обробляє всі команди, навіть після вибуху (ідея взята з відповіді Мартіна ). Кінцевий результат дається показником першої позиції, що дорівнює висоті сходів.

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 байт

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-масив. Потім ми петлю з |%{...}усіма $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)результат. Інакше це значення D, тому нам потрібно перевірити, чи ми вже внизу (це !$c- в PowerShell, "не-нуль" є "істинним" або 1) і встановити $cрівне $c-0або $c-1відповідно.

Редагування - Збережено 7 байт за допомогою призначення мінус-рівного, а не прямого призначення


3

Perl 5, 61 байт

Включає два байти для -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перш ніж він щось надрукував для мене. але, мабуть, це неявно ввімкнено лише -Fв 5.20.3. чи можете ви це підтвердити?
ardnew

@ardnew, -Fмені просто вистачило (5,20 або 5,22 або близько того). Iirc поточний perldoc perlrun каже, що це має на увазі -aта -aмає на увазі -n.
msh210

Скільки ми розраховуємо -i? Я можу бачити, що ви рахуєте це як 1, але я б припустив, що насправді слід вважати 3? :-)
andlrc

@ dev-null, чому три? Я думаю, що умовою на PPCG.SE є підрахунок букв у прапорі, але не символи дефісу, але, будь ласка, виправте мене, якщо я помиляюся. (Схоже, ви користуєтесь тим самим умовою підрахунку і для власної відповіді на це питання. (До речі, приємна відповідь.))
msh210

@ Msh210 Я просто підраховуючи різницю при використанні -iі без perl -i10 -pe';'проти perl -pe';'3 -х символів більше і потім номер входу - який я припускаю , що ми не повинні розраховувати. Але я можу помилятися, хоч про це сьогодні вранці :-)
andlrc

3

Віци, 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

Повідомлення чудово, доки код все ще може бути запущений.
Згарб

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, або функціями, які приймають введення як аргументи та повертають вихідне значення. Ваше рішення жорстко кодує входи, що заборонено.
Згарб

Виправлене формуванням у функції, я використовував інтерпретатор, коли писав його.
Алекс Бердже

Дякую! Ви також повинні додати заголовок форми, ## Python, <N> bytesщоб показати іншим свій результат.
Згарб

Я не думаю, що може бути функція без назви.
user48538

Можна зберегти байти, замінивши 0 if x==0 else x-1наx and x-1
Cyoce

2

JavaScript, 131 106 байт-

Я знаю, що це не виграє змагання 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]};`))()

Я якось пішов навпаки "функціонального" маршруту, зробивши динамічно створене імперативне рішення, будь-який екземпляр інструкції замінюється на приріст або декремент, а лічильник збільшується.

Дякую Cycoce, що врятував мені 29 байт!


Тут я зіграв 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

Збережено 6 байт завдяки DSM.

Досить просто зараз.

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

Java, 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
Відповідаючи на код-гольф- виклик, слід почати свою відповідь # <language_name>, XX bytes. Крім того, ви можете зменшити імена змінних до одного символу кожен і видалити зайві пробіли, таким чином кількість байтів зменшиться (що тут мета) ... Ах, і ласкаво просимо до PPCG!
знято

Деякі поради: Щоб відступити свій код як код, додайте 4 пробіли на початку рядка. Ви видалили пробіли, але ви можете все-таки видалити більше (наприклад: замість цього int steps=1; int count=0;ви можете використовувати int s=1,c=0;- подивіться, я змінив ім'я змінної - і так далі). Ви все ще можете показувати свою версію без вогків під версією для гольфу з поясненням (таким чином хтось легко допоможе вам у гольфі більше байтів).
знято

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

Математика, 114 120 байт

(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&, так що Робі не копає.


Зачекайте: я не думаю, що це справедливо. Це дозволяє роботові спускатися по негативним перекладинам. Уопс. Це навчить мене тестувати не всебічно ... Я поставлю виправлену, коли отримаю можливість.
hYPotenuser

1

Математика, 112 байт

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

0

Clojure, 92 84 байт

Відліки nдо нуля замість нуля до 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)з ненульовим 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, що вдається привести до більш конкурентної тривалості.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.