Robot na drabinie

30

tło

Mam drabinę opartą na ścianie i zdalnie sterowanego robota, który może się po niej wspinać. Mogę wysłać robotowi trzy różne polecenia:

  • UP: robot robi jeden krok w górę. Jeśli był na najwyższym stopniu, potyka się, spada i eksploduje.
  • DOWN: robot robi jeden krok w dół. Jeśli był na najniższym stopniu, nic się nie dzieje.
  • RESET: robot powraca do najniższego stopnia.

Mogę również wysłać serię poleceń, a robot wykona je kolejno. Twoim zadaniem jest przewidzieć jego ruchy.

Wkład

Twoje wejścia są liczbą całkowitą dodatnią N, reprezentujący liczbę kroków na drabinie i niepusty ciąg Cnad UDRreprezentujących komendy Wysłałem do robota. Możesz to założyć N < 1000. Robot jest inicjowany na najniższym stopniu drabiny.

Wydajność

Gwarantowane jest, że w pewnym momencie robot wejdzie na najwyższy stopień i wybuchnie. Dane wyjściowe to liczba poleceń, które wykonuje, zanim to nastąpi.

Przykład

Rozważ dane wejściowe N = 4i C = "UDDUURUUUUUUUDDDD" robot, oznaczony jako @, porusza się wzdłuż 4-stopniowej drabiny w następujący sposób:

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

Pozostałe polecenia nie są wykonywane, ponieważ robot wybuchł. Eksplozja miała miejsce po 10 poleceniach, więc prawidłowy wynik to 10.

Zasady i punktacja

Możesz napisać pełny program lub funkcję. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.

Przypadki testowe

  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
Zgarb
źródło
1
Powiązane
Peter Taylor
8
Jestem rozczarowany, że zadaniem nie jest wygenerowanie tej sztuki ASCII.
user253751
6
@immibis Wiesz, co robić ...
Martin Ender
Czy zamiast ciągu możemy wziąć listę kodów znaków?
Cyoce,
@Cyoce Tylko jeśli twój język nie ma innych środków do reprezentowania łańcucha.
Zgarb

Odpowiedzi:

10

CJam, 26 25 22 bajtów

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

Format wejściowy to instrukcje w pierwszym wierszu i wysokość drabiny w drugim.

Sprawdź to tutaj.

Wyjaśnienie

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.
Martin Ender
źródło
Dobry pomysł na przetworzenie wszystkich poleceń nawet po wybuchu. Pożyczę to, aby zaoszczędzić kilka bajtów
Luis Mendo
7

C, 83 71 + 4 = 75 bajtów

Dzięki @Josh za pokazanie mi stylu K&S , który pozwolił na wyłączenie 8 bajtów !!

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

Wyjaśniając:

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

Przykładowe wywołanie:

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

Test na żywo na ideone

oddalony
źródło
1
Nicea odpowiedź, ale być może warto zauważyć, że funkcja może być skutecznie wykorzystywane tylko raz od globalnych zi anie są kasowane.
Josh
@Josh. Zaktualizowałem. :)
usunięto
1
Niesamowite! Możesz także zapisać kilka znaków, grając z deklaracjami typu w swojej funkcji: codegolf.stackexchange.com/a/40266/13877
Josh
@Josh. Wow, to jest niesamowite! dzięki
usunięto
6

JavaScript (ES6), 54 53 bajtów

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

Wyjaśnienie

Używa wewnętrznie funkcji rekurencyjnej.

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>

użytkownik 81655
źródło
4

Perl, 47 + 2 = 49 bajtów

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

Wymaga -pflagi, -i$Ndla drugiej wysokości i listy ruchów oddzielonej nową linią:

$ 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

Jak to działa:

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

Wydzielono:

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

JavaScript (SpiderMonkey 30+), 65 64 bajtów

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

Jak to działa

Najpierw ustawiamy zmienną ina 0. To będzie śledzić, ile kroków wspiął się robot. Następnie dla każdego znaku cw ciągu wejściowym uruchamiamy następującą logikę:

  1. Jeśli ijest większy lub równy n, nie rób nic.
  2. Jeśli cjest "D":
    • Jeśli iwynosi 0, pozostaw to bez zmian.
    • W przeciwnym razie zmniejsz go o 1.
  3. Jeśli ctak "U", zwiększ io 1.
  4. W przeciwnym razie ustaw ina 0.

Odcinając, jeśli i>=n, unikamy dodawania kolejnych elementów do tablicy po osiągnięciu przez robota szczytu. W ten sposób możemy po prostu zwrócić długość wynikowej tablicy.

ETHprodukcje
źródło
3

Haskell, 65 bajtów

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

Przykład użycia: f 4 "UDDUURUUUUUUUDDDD"-> 10.

%dostosowuje bieżącą pozycję na drabinie, scanlsporządza listę wszystkich pozycji, fst.span(<n)bierze udział przed wybuchem i lengthliczy kroki.

nimi
źródło
Dobra
3

JavaScript (ES6), 65 bajtów

(n,s)=>[...s].map(_=>i=_<'E'?i&&i-1:_>'T'?i+1:0,i=0).indexOf(n)+1
Charlie Wynn
źródło
1
Daj nam kontynuować tę dyskusję w czacie .
ETHprodukcje
Myślę, że 0,i=0można zmienić nai=0
Cyoce
@Cyoce hmm, nie udało mi się w nowej zakładce (działa na tej stronie b / ci jest już zdefiniowane)
Charlie Wynn
@CharlieWynn przepraszam, pomieszałem moje pierwszeństwo
Cyoce
3

MATL , 37 34 bajtów

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

Wypróbuj online!

Wyjaśnienie

Pozycja jest oparta na 0. Każda nowa pozycja jest wypychana na stos, zachowując starsze pozycje. Zatem rozmiar stosu reprezentuje liczbę dotychczasowych ruchów plus 1.

Do przetworzenia każdego polecenia używana jest pętla. Pętla jest opuszczana, gdy pozycja osiąga wysokość drabiny, przetwarza wszystkie polecenia, nawet po wybuchu (pomysł wzięty z odpowiedzi Martina ). Ostateczny wynik podaje indeks pierwszej pozycji równy wysokości drabiny.

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
Luis Mendo
źródło
3

Python 2, 63 62 bajty

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

Na przykład f(4, 'UDDUURUUUUUUUDDDD')jest 10.

xnor znalazł jeszcze krótsze wyrażenie: 2%~hjest naprawdę fajne :)

Lynn
źródło
Niezłe znalezisko z %4. Jeśli się nie mylę, możesz uratować postać, robiąc to -[2%~h,~h,0][ord(s[0])%4].
xnor
3

PowerShell, 86 79 bajtów

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

Nieznaczne zmiany mojego Kiedy Święty Mikołaj wchodzi do piwnicy? odpowiedź.

Pobiera dane wejściowe $ai $bjawnie rzutuje $bjako tablica znaków . Następnie zapętlamy |%{...}wszystkie $b. Każdą iterację zwiększamy nasz licznik $d.

Następnie ifoświadczenie, aby sprawdzić, czy osiągnęliśmy szczyt -ge$a. Jeśli tak, wysyłamy $di exit. ifStwierdzenie jest wykonana z pseudo-trójskładnikowego utworzonego przez przypisanie $cminus równa wynikowi kilku wskaźników język tablicy.

Mamy sprawę, że wartości ASCII D, Ri Uodpowiadają 0, 2oraz 1gdy podjęte modulo-4, więc $_%4służy jako naszego pierwszego indeksu. Jeśli tak R, to ustawia się $cna $c-$crobienie resetu. Jeśli Uto oznacza, że ​​musimy iść w górę, więc $c-(-1)wynik. W przeciwnym razie jest to D, więc musimy sprawdzić, czy już jesteśmy na dole (to jest !$c- w PowerShell, „niezerowe” jest „prawdziwe” lub 1) i ustawione odpowiednio $cna $c-0lub $c-1.

Edycja - Zapisano 7 bajtów, używając przypisania równości minus zamiast przypisania bezpośredniego

AdmBorkBork
źródło
3

Perl 5, 61 bajtów

Obejmuje dwa bajty dla -F -i. ( -M5.01jest bezpłatny.)

Wprowadzanie liczby całkowitej (np. 10) jest takie perl -M5.01 -F -i10 robot.pl; dane wejściowe poleceń drabinkowych są takie jak STDIN.

for(@F){($i+=/U/)-=/R/?$i:$i&&/D/;$j++;last if$^I<=$i}say$j
msh210
źródło
używając perla 5.12.5, musiałem też wyraźnie włączyć tryb autosplit, -anFzanim cokolwiek by to dla mnie wydrukowało. ale wydaje się, że jest domyślnie włączony dopiero -Fw 5.20.3. czy możesz to zweryfikować?
nowy
@ardnew, -Fwystarczyło mi (5,20 lub 5,22 lub więcej). Iirc obecnego perldoc perlrun mówi, że implikuje -ai -aimplikuje -n.
msh210
Ile liczymy -i? Widzę, że liczysz to jako 1, ale sądzę, że powinno się to liczyć jako 3? :-)
andlrc
@ dev-null, dlaczego trzy? Myślę, że konwencja na PPCG.SE polega na liczeniu liter we fladze, ale nie na znakach łącznika minus, ale popraw mnie, jeśli się mylę. (Wygląda na to, że używasz tej samej konwencji liczenia dla własnej odpowiedzi yoru na to pytanie. (Nawiasem mówiąc, fajna odpowiedź.))
msh210
@ msh210 Właśnie liczyłem różnicę przy użyciu -ii bez 3 perl -i10 -pe';'vs perl -pe';'więcej znaków, a następnie liczby wejściowej - co, jak sądzę, nie powinniśmy liczyć. Mogę się jednak mylić, jeśli chodzi o dzisiejszy poranek :-)
andlrc
3

Vitsy, 44 bajty

Prawdopodobnie mogą wystąpić pewne obniżki - jeśli to możliwe, wymyślę jeszcze kilka rzeczy.

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

Objaśnienie (w toku):

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.

Wypróbuj online! (duży przypadek testowy)

Addison Crump
źródło
2

PHP, 88 bajtów

To generuje niektóre (3 + 2n, gdzie n to liczba uruchomionych poleceń) powiadomienia, ale to nie ma znaczenia dla gry w golfa, prawda?

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

bez golfa:

<?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
użytkownik51805
źródło
Powiadomienia są w porządku, o ile kod można nadal uruchomić.
Zgarb
2

Python, 121 bajtów

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
Alex Burge
źródło
1
Witamy w PPCG! Tutaj domyślnie wymagamy, aby odpowiedzi były albo pełnymi programami, które pobierają dane wejściowe ze STDIN i drukują do STDOUT, lub funkcje, które przyjmują dane wejściowe jako argumenty i zwracają wartość wyjściową. Twoje rozwiązanie koduje wejścia na stałe, co jest niedozwolone.
Zgarb
Poprawiony przez przekształcenie się w funkcję, pisałem go przy pomocy interpretera.
Alex Burge
Dziękuję Ci! Powinieneś także dodać nagłówek formularza, ## Python, <N> bytesaby pokazać innym swój wynik.
Zgarb
Nie sądzę, że może istnieć funkcja bez nazwy.
user48538,
Można zapisać bajtów, zastępując 0 if x==0 else x-1zx and x-1
Cyoce
2

JavaScript, 131 106 bajtów-

Wiem, że to nie wygra zawodów Code Golf, ale było to zabawne i głupie rozwiązanie do wdrożenia:

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

W pewnym sensie poszedłem przeciwnie do „funkcjonalnej” trasy, tworząc dynamicznie generowane rozwiązanie imperatywne, każdy przypadek instrukcji jest zastępowany przyrostem lub zmniejszeniem oraz przyrostem przeciwnym.

Dzięki Cycoce za uratowanie mnie 29 bajtów!

DL
źródło
Tutaj grałem w golfa na 29 bajtach:l=>s=>Function('i=c=0;'+s.replace(/./g,x=>`c++;i${{R:"=0",U:`++;if(i>=${l})return c`,D:"--"}[x]};`))()
Cyoce
2

Python 3, 90

Zaoszczędź 6 bajtów dzięki DSM.

W tej chwili całkiem proste.

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

Przypadki testowe:

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
Morgan Thrapp
źródło
1

PHP, 129 bajtów

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

Nie wygrywam, ale fajnie się tworzy. PHP wydaje się nie lubić pustych części operatora trójskładnikowego (generuje błąd składniowy), więc musiałem umieścić0 .

Wersja bez golfa:

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
    }
  }
}
daavko
źródło
1

PHP, 113 bajtów

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

Nie golfowany:

// $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;
        }
    }
}
RibeiroBreno
źródło
2
Świetny pierwszy post! Zredagowałem twój post dla lepszej czytelności. Miłej gry w golfa!
GamrCorps
1

Pyth, 19 bajtów

x.u@[tWNNhN00)CYz0Q

Wypróbuj online: pakiet demonstracyjny lub testowy

Wyjaśnienie:

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
Jakube
źródło
1

Java, 250 bajtów

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;
}
Surya Vattikuti
źródło
2
Odpowiadając na wyzwanie związane z golfem , powinieneś zacząć od odpowiedzi # <language_name>, XX bytes. Możesz także zredukować nazwy zmiennych do jednego znaku i usunąć dodatkowe białe znaki, w ten sposób liczba bajtów zmniejszy się (co jest tutaj celem) ... Ach, i witaj w PPCG!
usunięto
Kilka wskazówek: Aby wciąć kod jako kod, dodaj 4 spacje na początku linii. Usunąłeś niektóre spacje, ale nadal możesz usunąć więcej (np. Zamiast tego int steps=1; int count=0;możesz użyć int s=1,c=0;- patrz, zmieniłem nazwę zmiennej - i tak dalej). Nadal możesz pokazać swoją wersję bez golfa poniżej wersji z golfem z wyjaśnieniem (w ten sposób ktoś może ci pomóc w grze w więcej bajtów).
usunięto
1

C, 91 bajtów

Brak ostrzeżeń z gcc -Wall . Wyrażenia rekurencyjne i rozdzielane przecinkami.

r.c zawiera nagą funkcję:

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

Skomentował,

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
}

Na przykład,

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

roboladder.c obwoluta,

#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 dla testów,

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
jamieguinan
źródło
1

Mathematica, 114 120 bajtów

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

Funkcja anonimowa, która przyjmuje dwa argumenty (C, N). Ostrożnie korzystaj z tego, ponieważ nie zamyka on strumienia, który otwiera. Przypisuje także wszystkie swoje zmienne globalnie.

Edytowany zastąpić d=#-1&z d=#~Max~1-1&, tak że robie nie wykracza kopanie.

hYPotenuser
źródło
Czekaj: nie sądzę, żeby to było ważne. Pozwala robotowi zejść ze szczebli ujemnych. Ups To nauczy mnie testowania niezrozumiale ... Kiedy tylko będę miał okazję, postawię poprawiony.
hYPotenuser
1

Mathematica, 112 bajtów

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

Clojure, 92 84 bajtów

Liczy ndo zera zamiast zera do n, można wykorzystać take-while pos?.

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

Oryginalny:

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

Odwzorowuje drugi argument Una +, Ddo -i innych na nil. Funkcja redukcji działa (operand position 1)z wartością inną niż null operandi 0inaczej. Pobiera wartości, dopóki nie przekroczymy pierwszego argumentu wejściowego i zlicza, ile mamy.

NikoNyrh
źródło
0

Mathematica, 67 bajtów

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

Nienazwane funkcje dwóch argumentów, dodatniej liczby całkowitej i listy znaków, która zwraca dodatnią liczbę całkowitą. Prostsza Whileimplementacja niż w przypadku innych pozycji Mathematica, która zapewnia większą konkurencję.

Greg Martin
źródło