Roboter auf einer Leiter


30

Hintergrund

Ich habe eine Leiter an einer Wand und einen ferngesteuerten Roboter, der darauf klettern kann. Ich kann drei verschiedene Befehle an den Roboter senden:

  • UP: Der Roboter macht einen Schritt nach oben. Wenn es sich auf der höchsten Stufe befand, stolpert es, fällt herunter und explodiert.
  • DOWN: Der Roboter macht einen Schritt nach unten. Wenn es auf der untersten Stufe war, passiert nichts.
  • RESET: Der Roboter kehrt zum untersten Schritt zurück.

Ich kann auch eine Reihe von Befehlen senden, die der Roboter nacheinander ausführt. Ihre Aufgabe ist es, seine Bewegungen vorherzusagen.

Eingang

Ihre Eingänge sind eine positive ganze Zahl N, die die Anzahl von Schritten in der Leiter, und eine nicht-leere Zeichenfolge Cüber UDR, die die Befehle an den Roboter I gesendet haben. Das können Sie annehmen N < 1000. Der Roboter wird auf der untersten Stufe der Leiter initialisiert.

Ausgabe

Es ist garantiert, dass der Roboter irgendwann über die höchste Stufe klettert und explodiert. Ihre Ausgabe ist die Anzahl der Befehle, die ausgeführt werden, bevor dies geschieht.

Beispiel

Berücksichtigen Sie die Eingaben, N = 4und C = "UDDUURUUUUUUUDDDD" der Roboter @bewegt sich auf der vierstufigen Leiter wie folgt:

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

Die restlichen Befehle werden nicht ausgeführt, da der Roboter explodiert ist. Die Explosion fand nach 10 Befehlen statt, die korrekte Ausgabe ist also 10.

Regeln und Wertung

Sie können ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig.

Testfälle

  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
Ich bin enttäuscht, dass die Aufgabe nicht darin besteht, diese ASCII-Kunst zu erzeugen.
user253751


Können wir anstelle einer Zeichenfolge eine Liste von Zeichencodes verwenden?
Cyoce

@Cyoce Nur wenn Ihre Sprache keine andere Möglichkeit hat, einen String darzustellen.
Zgarb

Antworten:


10

CJam, 26 25 22 Bytes

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

Das Eingabeformat sind die Anweisungen in der ersten Zeile und die Leiterhöhe in der zweiten Zeile.

Teste es hier.

Erläuterung

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.

Gute Idee, alle Befehle auch nach der Explosion zu verarbeiten. Ich werde das ausleihen, um ein paar Bytes zu sparen
Luis Mendo

7

C 83 71 + 4 = 75 Bytes

Vielen Dank an @Josh, dass er mir den K & S-Stil gezeigt hat , bei dem 8 Bytes gespart wurden !!

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

Erklären:

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

Beispielaufruf:

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

Live-Test auf Ideone


1
Schöne Antwort, aber es kann erwähnenswert sein, dass die Funktion seit Globals effektiv nur einmal verwendet werden kann zund anicht zurückgesetzt wird.
Josh

@Josh. Ich habe aktualisiert. :)
entfernt

1
Genial! Sie können auch ein paar Zeichen speichern, indem Sie mit den Typdeklarationen in Ihrer Funktion herumspielen
Josh

@Josh. Wow, das ist großartig! Danke
entfernt

6

JavaScript (ES6), 54 53 Bytes

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

Erläuterung

Verwendet intern eine rekursive Funktion.

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 Bytes

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

Benötigt die -pFlagge -i$Nfür letztere Höhe und eine durch Zeilenumbrüche getrennte Zugliste:

$ 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

Wie es funktioniert:

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

Deparsed:

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

4

JavaScript (SpiderMonkey 30+), 65 64 Byte

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

Wie es funktioniert

Wir setzen die Variable zuerst iauf 0. Dadurch wird protokolliert, um wie viele Schritte der Roboter gestiegen ist. Dann führen cwir für jedes Zeichen in der Eingabezeichenfolge die folgende Logik aus:

  1. Wenn igrößer oder gleich ist n, nichts tun.
  2. Wenn cist "D":
    • Wenn i0 ist, lass es wie es ist.
    • Andernfalls verringern Sie den Wert um 1.
  3. Wenn cheißt "U", Zuwachsi um 1.
  4. Andernfalls iauf 0 setzen.

Durch das Abschneiden von if i>=nvermeiden wir, dass dem Array weitere Elemente hinzugefügt werden, nachdem der Roboter die Oberseite erreicht hat. Somit können wir einfach die Länge des resultierenden Arrays zurückgeben.


3

Haskell, 65 Bytes

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

Anwendungsbeispiel: f 4 "UDDUURUUUUUUUDDDD"-> 10.

%Passt die aktuelle Position auf der Leiter an, erstellt scanleine Liste aller Positionen, fst.span(<n)nimmt das Teil vor der Explosion und lengthzählt die Schritte.


Gute


3

MATL , 37 34 Bytes

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

Probieren Sie es online!

Erläuterung

Die Position ist 0-basiert. Jede neue Position wird auf den Stapel geschoben, wobei die älteren Positionen beibehalten werden. Die Stapelgröße entspricht also der Anzahl der bisherigen Bewegungen plus 1.

Jeder Befehl wird in einer Schleife abgearbeitet. Die Schleife wird verlassen, wenn die Position die Leiterhöhe erreicht und alle Befehle verarbeitet werden, auch nach der Explosion (Idee aus Martins Antwort ). Das Endergebnis ergibt sich aus dem Index der ersten Position, die der Leiterhöhe entspricht.

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 Bytes

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

Zum Beispiel f(4, 'UDDUURUUUUUUUDDDD')ist 10.

xnor fand einen noch kürzeren Ausdruck: Ist 2%~hecht cool :)


Netter Fund mit dem %4. Wenn ich mich nicht irre, kannst du einen Charakter speichern, indem du tust -[2%~h,~h,0][ord(s[0])%4].
Xnor

3

PowerShell, 86 79 Bytes

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

Eine leichte Umrüstung meiner Wann betritt der Weihnachtsmann den Keller? Antworten.

Übernimmt die Eingabe $aund das $bexplizite Casting $bals Zeichen-Array. Wir schleifen dann mit |%{...}über alles $b. Mit jeder Iteration erhöhen wir unseren Zähler$d .

Dann ein if Aussage, um zu prüfen, ob wir die Spitze mit getroffen haben -ge$a. Wenn ja, geben wir $dund aus exit. Dasif Anweisung besteht aus einem Pseudoternär, der durch Zuweisen erstellt wird$c Minus gleich dem Ergebnis mehrerer Indizes zu einem Array erstellt wird.

Wir haben einen Trick , dass die ASCII - Werte von D, Rund Uentsprechen 0, 2und 1wenn genommen Modulo-4, so $_%4wie unser erster Index dient. Wenn es R, dass die Sätze $cgleich auf $c-$c, die Reset - tun. Wenn Udas heißt, wir müssen nach oben, so das $c-(-1)Ergebnis. Andernfalls ist es ein D, also müssen wir prüfen, ob wir schon ganz unten sind (das ist !$c- in PowerShell ist "nicht null" "wahr" oder "wahr")1 ) und Satz $cgleich zu $c-0oder $c-1ist.

Bearbeiten - Speichert 7 Bytes, indem anstelle einer direkten Zuweisung eine Minus-Zuweisung verwendet wird


3

Perl 5, 61 Bytes

Beinhaltet zwei Bytes für -F -i. (-M5.01 ist kostenlos.)

Eingang der ganzen Zahl (zB 10) als perl -M5.01 -F -i10 robot.pl; Die Eingabe der Kontaktplanbefehle erfolgt als STDIN.

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

Mit Perl 5.12.5 musste ich auch den Autosplit-Modus explizit aktivieren, -anFbevor er etwas für mich drucken würde. aber es scheint nur -Fin 5.20.3 implizit aktiviert zu werden . Kannst du das überprüfen?
ardnew

@ardnew, hat gerade -Ffür mich gereicht (5.20 oder 5.22 oder so). Iirc der aktuelle Perldoc Perlrun sagt, dass es impliziert -aund -aimpliziert -n.
msh210

Wie viel zählen wir -i? Ich kann sehen, dass Sie es als 1 zählen, aber ich denke, es sollte eigentlich als 3 gezählt werden? :-)
andlrc

@ dev-null, warum drei? Ich denke, die Konvention für PPCG.SE ist, die Buchstaben in einem Flag zu zählen, aber nicht die Bindestriche-Minus-Zeichen, aber bitte korrigieren Sie mich, wenn ich falsch liege. (Es sieht so aus, als würden Sie dieselbe Zählkonvention auch für Ihre eigene Antwort auf diese Frage verwenden. (Übrigens, nette Antwort.))
msh210

@ msh210 Ich habe nur den Unterschied gezählt, wenn ich -iund ohne perl -i10 -pe';'vs perl -pe';'3 Zeichen mehr und dann die eingegebene Nummer verwendet habe - was ich denke, wir sollten nicht zählen. Aber vielleicht irre ich mich heute morgen :-)
andlrc

3

Vitsy, 44 Bytes

Möglicherweise könnte es einige Reduzierungen geben - ich werde ein paar weitere Dinge herausfinden, wenn ich kann.

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

Erklärung (in Bearbeitung):

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.

Probieren Sie es online! (großer Testfall)


2

PHP, 88 Bytes

Dies erzeugt einige (3 + 2n, wobei n die Anzahl der ausgeführten Befehle ist) Hinweise, aber das spielt beim Golfen keine Rolle, oder?

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

ungolfed:

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

Mitteilungen sind in Ordnung, solange der Code noch ausgeführt werden kann.
Zgarb

2

Python, 121 Bytes

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
Willkommen bei PPCG! Hier wird standardmäßig vorausgesetzt, dass Antworten entweder vollständige Programme sind, die Eingaben von STDIN entgegennehmen und an STDOUT ausgeben, oder Funktionen, die Eingaben als Argumente verwenden und den Ausgabewert zurückgeben. Ihre Lösung codiert die Eingaben hart, was nicht zulässig ist.
Zgarb

Als ich es schrieb, benutzte ich einen Interpreter.
Alex Burge

Vielen Dank! Sie sollten auch eine Kopfzeile des Formulars hinzufügen ## Python, <N> bytes, um anderen Ihre Punktzahl anzuzeigen.
Zgarb

Ich glaube nicht, dass es eine unbenannte Funktion geben kann.
user48538

Sie können durch das Ersetzen speichern Bytes 0 if x==0 else x-1mitx and x-1
Cyoce

2

JavaScript, 131 106 Bytes-

Ich weiß, dass dies keinen Code Golf-Wettbewerb gewinnen wird, aber es war eine unterhaltsame und dumme Lösung, dies umzusetzen:

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

Ich bin das Gegenteil eines "funktionalen" Weges gegangen, indem ich eine dynamisch generierte Imperativlösung erstellt habe. Jede Instanz eines Befehls wird durch ein Inkrement oder Dekrement und ein Zählerinkrement ersetzt.

Vielen Dank an Cycoce, der mir 29 Bytes gespart hat!


Hier habe ich 29 Bytes l=>s=>Function('i=c=0;'+s.replace(/./g,x=>`c++;i${{R:"=0",U:`++;if(i>=${l})return c`,D:"--"}[x]};`))()
abgespielt

2

Python 3, 90

6 Bytes gespart dank DSM.

Im Moment ziemlich einfach.

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

Testfälle:

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 Bytes

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

Nicht gewinnen, aber Spaß machen. PHP scheint leere Teile im ternären Operator nicht zu mögen (es wirft einen Syntaxfehler auf), also musste ich dort ein setzen 0.

Ungolfed-Version:

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 Bytes

Kleinere Version von 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;}}}

Ungolfed:

// $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
Toller erster Beitrag! Ich habe Ihren Beitrag zur besseren Lesbarkeit bearbeitet. Viel Spaß beim Golfen!
GamrCorps

1

Pyth, 19 Bytes

x.u@[tWNNhN00)CYz0Q

Probieren Sie es online aus: Vorführung oder Test Suite

Erläuterung:

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

1

Java, 250 Byte

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

2
Wenn Sie eine Code-Golf- Herausforderung beantworten, sollten Sie Ihre Antwort mit beginnen # <language_name>, XX bytes. Außerdem können Sie Ihre Variablennamen auf jeweils ein Zeichen reduzieren und zusätzliche Leerzeichen entfernen. Auf diese Weise verringert sich die Anzahl der Bytes (was hier das Ziel ist) ... Ah, und willkommen bei PPCG!
entfernt

Einige Tipps: Um Ihren Code als Code einzurücken, fügen Sie 4 Leerzeichen am Zeilenanfang hinzu. Sie haben einige Leerzeichen entfernt, aber Sie können immer noch mehr entfernen (z. B .: statt int steps=1; int count=0;Sie können verwenden int s=1,c=0;- siehe, ich habe den Variablennamen geändert - und so weiter). Sie können Ihre noch zeigen ungolfed Version unterhalb der golfed Version mit einer Erklärung ( auf diese Weise ist einfach für jemand helfen Sie Golf spielen mehr Bytes).
entfernt

1

C 91 Bytes

Keine Warnungen mit gcc -Wall. Rekursions- und kommagetrennte Ausdrücke.

r.c enthält nackte Funktion:

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

Kommentiert,

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
}

Als Referenz,

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

roboladder.c Verpackung,

#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 zum Prüfen,

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, 114 120 Bytes

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

Anonyme Funktion, die die beiden Argumente (C, N) annimmt. Gehen Sie dabei vorsichtig vor, da der geöffnete Stream dadurch nicht geschlossen wird. Außerdem werden alle Variablen global zugewiesen.

Herausgegeben zu ersetzen d=#-1&mit d=#~Max~1-1&, so dass robie nicht Graben geht.


Warten Sie: Ich glaube nicht, dass dies gültig ist. Dadurch kann der Roboter negative Sprossen hinunterfahren. Hoppla. Das bringt mir bei, nicht umfassend zu testen.
Hypotenuser

1

Mathematica, 112 Bytes

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

0

Clojure, 92 84 Bytes

Zählt nauf Null statt auf Null n, kann man ausnutzen take-while pos?.

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

Original:

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

Karten 2. Argument Uzu +, Dauf -und andere zu nil. Die Reduzierung Funktion läuft (operand position 1)mit nicht-null operandund aus 0anderen Gründen . Nimmt Werte, bis wir höher sind als das erste Eingabeargument und zählt, wie viele wir haben.


0

Mathematica, 67 Bytes

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

Unbenannte Funktionen von zwei Argumenten, einer positiven Ganzzahl und einer Liste von Zeichen, die eine positive Ganzzahl zurückgeben. Eine einfachere WhileImplementierung als die anderen Mathematica-Einträge, die zu einer konkurrenzfähigeren Länge führt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.