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 = 4
und 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
Antworten:
CJam,
262522 BytesDas Eingabeformat sind die Anweisungen in der ersten Zeile und die Leiterhöhe in der zweiten Zeile.
Teste es hier.
Erläuterung
quelle
C
8371 + 4 = 75 BytesVielen Dank an @Josh, dass er mir den K & S-Stil gezeigt hat , bei dem 8 Bytes gespart wurden !!
Erklären:
Beispielaufruf:
Live-Test auf Ideone
quelle
z
unda
nicht zurückgesetzt wird.JavaScript (ES6),
5453 BytesErläuterung
Verwendet intern eine rekursive Funktion.
quelle
Perl, 47 + 2 = 49 Bytes
Benötigt die
-p
Flagge-i$N
für letztere Höhe und eine durch Zeilenumbrüche getrennte Zugliste:Wie es funktioniert:
Deparsed:
quelle
JavaScript (SpiderMonkey 30+),
6564 ByteWie es funktioniert
Wir setzen die Variable zuerst
i
auf 0. Dadurch wird protokolliert, um wie viele Schritte der Roboter gestiegen ist. Dann führenc
wir für jedes Zeichen in der Eingabezeichenfolge die folgende Logik aus:i
größer oder gleich istn
, nichts tun.c
ist"D"
:i
0 ist, lass es wie es ist.c
heißt"U"
, Zuwachsi
um 1.i
auf 0 setzen.Durch das Abschneiden von if
i>=n
vermeiden 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.quelle
Haskell, 65 Bytes
Anwendungsbeispiel:
f 4 "UDDUURUUUUUUUDDDD"
->10
.%
Passt die aktuelle Position auf der Leiter an, erstelltscanl
eine Liste aller Positionen,fst.span(<n)
nimmt das Teil vor der Explosion undlength
zählt die Schritte.quelle
JavaScript (ES6), 65 Byte
quelle
0,i=0
kann geändert werdeni=0
MATL ,
3734 BytesProbieren 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 undalle 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.quelle
Python 2,
6362 BytesZum Beispiel
f(4, 'UDDUURUUUUUUUDDDD')
ist10
.xnor fand einen noch kürzeren Ausdruck: Ist
2%~h
echt cool :)quelle
%4
. Wenn ich mich nicht irre, kannst du einen Charakter speichern, indem du tust-[2%~h,~h,0][ord(s[0])%4]
.PowerShell,
8679 BytesEine leichte Umrüstung meiner Wann betritt der Weihnachtsmann den Keller? Antworten.
Übernimmt die Eingabe
$a
und das$b
explizite Casting$b
als 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$d
und ausexit
. 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
,R
undU
entsprechen0
,2
und1
wenn genommen Modulo-4, so$_%4
wie unser erster Index dient. Wenn esR
, dass die Sätze$c
gleich auf$c-$c
, die Reset - tun. WennU
das heißt, wir müssen nach oben, so das$c-(-1)
Ergebnis. Andernfalls ist es einD
, 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$c
gleich zu$c-0
oder$c-1
ist.Bearbeiten - Speichert 7 Bytes, indem anstelle einer direkten Zuweisung eine Minus-Zuweisung verwendet wird
quelle
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.quelle
-anF
bevor er etwas für mich drucken würde. aber es scheint nur-F
in 5.20.3 implizit aktiviert zu werden . Kannst du das überprüfen?-F
für mich gereicht (5.20 oder 5.22 oder so). Iirc der aktuelle Perldoc Perlrun sagt, dass es impliziert-a
und-a
impliziert-n
.-i
? Ich kann sehen, dass Sie es als 1 zählen, aber ich denke, es sollte eigentlich als 3 gezählt werden? :-)-i
und ohneperl -i10 -pe';'
vsperl -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 :-)Vitsy, 44 Bytes
Möglicherweise könnte es einige Reduzierungen geben - ich werde ein paar weitere Dinge herausfinden, wenn ich kann.
Erklärung (in Bearbeitung):
Probieren Sie es online! (großer Testfall)
quelle
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?
ungolfed:
quelle
Python, 121 Bytes
quelle
## Python, <N> bytes
, um anderen Ihre Punktzahl anzuzeigen.0 if x==0 else x-1
mitx and x-1
JavaScript,
131106 Bytes-Ich weiß, dass dies keinen Code Golf-Wettbewerb gewinnen wird, aber es war eine unterhaltsame und dumme Lösung, dies umzusetzen:
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!
quelle
l=>s=>Function('i=c=0;'+s.replace(/./g,x=>`c++;i${{R:"=0",U:`++;if(i>=${l})return c`,D:"--"}[x]};`))()
Python 3, 90
6 Bytes gespart dank DSM.
Im Moment ziemlich einfach.
Testfälle:
quelle
PHP, 129 Bytes
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:
quelle
PHP, 113 Bytes
Kleinere Version von https://codegolf.stackexchange.com/a/74575/13216
Ungolfed:
quelle
Pyth, 19 Bytes
Probieren Sie es online aus: Vorführung oder Test Suite
Erläuterung:
quelle
Java, 250 Byte
quelle
# <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!int steps=1; int count=0;
Sie können verwendenint 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).C 91 Bytes
Keine Warnungen mit
gcc -Wall
. Rekursions- und kommagetrennte Ausdrücke.r.c
enthält nackte Funktion:Kommentiert,
Als Referenz,
roboladder.c
Verpackung,Makefile
zum Prüfen,quelle
Mathematica,
114120 BytesAnonyme 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&
mitd=#~Max~1-1&
, so dass robie nicht Graben geht.quelle
Mathematica, 112 Bytes
quelle
Clojure,
9284 BytesZählt
n
auf Null statt auf Nulln
, kann man ausnutzentake-while pos?
.Original:
Karten 2. Argument
U
zu+
,D
auf-
und andere zunil
. Die Reduzierung Funktion läuft(operand position 1)
mit nicht-nulloperand
und aus0
anderen Gründen . Nimmt Werte, bis wir höher sind als das erste Eingabeargument und zählt, wie viele wir haben.quelle
Mathematica, 67 Bytes
Unbenannte Funktionen von zwei Argumenten, einer positiven Ganzzahl und einer Liste von Zeichen, die eine positive Ganzzahl zurückgeben. Eine einfachere
While
Implementierung als die anderen Mathematica-Einträge, die zu einer konkurrenzfähigeren Länge führt.quelle