Ihre Aufgabe besteht darin, ein Programm zu erstellen, das eine Zeichenfolge (von links nach rechts und von beliebiger Länge) von Token analysiert und auswertet, die Anweisungen geben - entweder nach links oder nach rechts. Hier sind die vier möglichen Token und ihre Bedeutungen:
> go right one single step
< go left one single step
-> go right the total amount of single steps that you've gone right, plus one,
before you previously encountered this token and reset this counter to zero
<- go left the total amount of single steps that you've gone left, plus one,
before you previously encountered this token and reset this counter to zero
Es gibt jedoch einen Haken: Die Token für Anweisungen, die Ihr Programm analysieren kann, werden in der folgenden Form angezeigt:
<<->-><<->->>->>->
... mit anderen Worten, sie sind verkettet, und es ist die Aufgabe Ihres Programms, den korrekten Vorrang der Anweisungen und die Anzahl der zu treffenden Schritte herauszufinden (indem Sie nach vorne schauen). Die Rangfolge ist wie folgt (von der höchsten zur niedrigsten Rangfolge):
->
<-
>
<
Wenn Sie feststellen, <-
dass seit dem Start oder seit dem letzten Zurücksetzen noch keine Schritte nach links ausgeführt wurden, gehen Sie einen einzelnen Schritt nach links. Gleiches gilt für ->
, dann aber für rechts.
Ihr Programm sollte bei 0 beginnen und das Ergebnis sollte eine Ganzzahl mit Vorzeichen sein, die die endgültige Endposition darstellt.
Sie können erwarten, dass die Eingabe immer gültig ist (also <--->>--<
zum Beispiel nichts dergleichen ).
Beispiel Eingabe:
><->><-<-><-<>>->
Schritte in diesem Beispiel:
step | token | amount | end position
------+-------+--------+--------------
1. | > | +1 | 1
2. | < | -1 | 0
3. | -> | +2 | 2
4. | > | +1 | 3
5. | <- | -2 | 1
6. | < | -1 | 0
7. | -> | +2 | 2
8. | <- | -2 | 0
9. | < | -1 | -1
10. | > | +1 | 0
11. | > | +1 | 1
12. | -> | +3 | 4
Zur Verdeutlichung: Die Ausgabe des Programms sollte nur die endgültige Endposition als vorzeichenbehaftete Ganzzahl sein. Die obige Tabelle soll nur die Schritte veranschaulichen, die mein Beispiel unternommen hat. Es ist nicht erforderlich, eine solche Tabelle, Tabellenzeile oder auch nur die Endpositionen der Schritte auszugeben. Es ist nur die letzte Endposition als vorzeichenbehaftete Ganzzahl erforderlich.
Kürzester Code nach einer Woche gewinnt.
<-
wenn unmittelbar danach ein<
oder ein folgt->
. Es gibt keine Möglichkeit , in dieser Sprache , die Sequenz zu repräsentieren<-
dann>
- das wärego left the total amount of single steps that you've gone left, plus one, then go right one single step
. Ist das richtig und beabsichtigt?Antworten:
GolfScript, 46 Zeichen
Dies ist eines der linearsten GolfScript-Programme, die ich je geschrieben habe - es gibt keine einzige Schleife, bedingte oder variable Zuweisung. Alles wird mit String-Manipulation gemacht:
Erstens ersetze ich jedes Vorkommen von
->
durch)
. Da die Gültigkeit der Eingabe garantiert ist, muss das verbleibende Vorkommen von-
ein Teil von sein<-
.Als nächstes mache ich zwei Kopien der Zeichenfolge. Von der ersten Kopie entferne ich die Zeichen
<
und-
und lasse nur>
und)
. Ich dupliziere dann das Ergebnis, entferne alle)
s und alle>
folgenden letzten)
aus der zweiten Kopie, verkette sie und zähle die Zeichen. Tatsächlich zähle ich also:)
,>
nach dem letzten)
und>
vor dem letzten)
.Als nächstes mache ich dasselbe für die andere Kopie, mit der Ausnahme, dass diesmal
<
und<-
anstelle von>
und)
und das-
s vor der letzten Zeichenanzahl entfernt wird. Also zähle ich:<-
,<
nach dem letzten<-
und<
vor dem letzten<-
.Schließlich subtrahiere ich die zweite Zählung von der ersten und gebe das Ergebnis aus.
quelle
Python 2.7 -
154147134128 BytesEs wurden ernsthafte Änderungen an der Funktionsweise dieses Programms vorgenommen. Ich habe die alte Erklärung entfernt, die immer noch im Bearbeitungsverlauf dieser Antwort zu finden ist.
Dieser ist eklig.
Es funktioniert so ziemlich genauso wie die anderen Antworten auf diese Frage, indem die Zeichen in der Eingabe durch gültige Anweisungen in dieser Sprache ersetzt und ausgeführt werden. Es gibt jedoch einen großen Unterschied: Es
replace
ist ein langes Wort. Scheiß drauf.@ProgrammerDan im Chat hatte die Idee, ein Tupel mit der Zeichenfolge
;').replace('
viermal zu verwenden, um die Vorformatierungsmethodestr.format()
für Text zu verwenden. Vier Instanzen von%s
befinden sich in der Zeichenfolge in der zweiten Zeile, wobei jede Instanz ihren Wert vom zugehörigen Element des Tupels am Ende erhält. Da sie alle gleich sind, wird jeder%s
durch ersetzt;').replace('
. Wenn Sie die Operationen ausführen, erhalten Sie folgende Zeichenfolge:Dies ist jetzt gültiger Python-Code, mit dem ausgeführt werden kann
exec
. Das ist richtig, Baby: Verschachtelteexec
s lassen mich Zeichenfolgenoperationen für Code verwenden, die Zeichenfolgenoperationen für Code ausführen müssen . Jemand, bitte töte mich.Der Rest ist ziemlich einfach: Jeder Befehl wird durch Code ersetzt, der drei Variablen verfolgt: Die aktuelle Position, die Anzahl der Rechte seit dem letzten
->
und dieselbe für lefts und<-
. Das Ganze wird ausgeführt und die Position gedruckt.Sie werden bemerken, dass ich
raw_input(';')
mit ';' als Aufforderung, anstattraw_input()
die keine Aufforderung hat. Dies speichert Zeichen auf eine nicht intuitive Art und Weise: Wenn diesraw_input()
der).replace('
Fall%s
wäre , müsste das Tupel mit gefüllt werden , und jede Instanz von hätte '; \' 'davor, mit Ausnahme der ersten . Eine Eingabeaufforderung schafft mehr Redundanz, sodass ich insgesamt mehr Zeichen speichern kann.quelle
list.index()
kehrt zurück,-1
wenn das Zeichen nicht gefunden wird". Es wirft einIndexError
. Sie haben es vielleicht verwechselt mitstr.find
. In der Tat könnten Sie ersetzen[list('><rl').index(c)]
mit['><rl'.find(c)]
.Perl,
134131...9995 BytesNimmt die Eingabe als einzelne Zeile auf stdin, zB:
oder:
Ich habe die Anweisungen in die Operatoren "right" (">" und "->") und "left" ("<" und "<-") aufgeteilt. Die Vorteile davon sind, dass es einfacher ist, die Parallelität zwischen linken und rechten Operatoren auszunutzen, und dass wir nichts Besonderes tun müssen, um die Zeichenfolge zu kennzeichnen. Jede "Richtung" wird als Substitutionsoperation behandelt, bei der die laufende Summe um die Anzahl der Schritte in dieser Richtung angepasst wird, wobei die umgekehrte Richtung, die von der anderen Substitutionsoperation berücksichtigt wird, ignoriert wird. Hier ist ein weniger erfolgreicher Vorfahr dieses Codes als eine Art Dokumentation:
In einer vorherigen Iteration dieses Codes wurden die Ersetzungen alle in einem Durchgang durchgeführt. Dies hatte den Vorteil, dass eine direkte Zuordnung zwischen $ p / $ pos und der Position beibehalten wurde, die zu einem bestimmten Zeitpunkt zurückgegeben wurde, jedoch mehr Code-Bytes benötigte.
Wenn Sie () 5.10.0 verwenden möchten, können Sie zwei weitere Zeichen abseits der Zählung mit s / print / say / rasieren, aber das ist nicht wirklich mein Stil.
quelle
Perl,
8877 BytesDie Eingabe wird über STDIN erwartet, zum Beispiel:
Aktualisieren
Die Zeichenfolge muss nicht in eine Summe konvertiert werden, da
s//
bereits gezählt wird. :-)Erste Version
Die Eingabe wird über STDIN erwartet, Beispiel:
Erläuterung:
Die Idee ist, den Richtungsstring in eine Summe umzuwandeln, so dass das Ergebnis von einem einfachen ausgegeben wird
print eval
.>
bevor einer->
zwei Schritte macht, einen auf einmal und den anderen auf den nächsten->
. Es spielt keine Rolle, welcher->
der beiden dabei folgt. Der interne Zähler wird nach dem nächsten zurückgesetzt->
, verursacht also>
keine weiteren Schritte, das Maximum sind zwei Schritte. Dann->
fügt einen Schritt für mich und so noch verbleibenden jeder>
nach dem letzten->
.Gleiches gilt für die Rückwärtsrichtung mit negativen statt positiven Schrittzahlen.
Z.B:
><->><-<-><-<>>->
s/->/+1/
: Beginnen Sie mit der Vorwärtsrichtung, da diese->
die höchste Priorität hat.Z.B:
><+1><-<+1<-<>>+1
s/>(?=.*1)/+2/g
: Das Look-Ahead-Muster stellt sicher, dass nur die>
vorherigen->
konvertiert werden.Z.B:
+2<+1+2<-<+1<-<+2+2+1
s/>/+1/g
: Jetzt sind die restlichen>
abgedeckt.Z.B:
+2<+1+2<-<+1<-<+2+2+1
s/<-/-1/g
: Analog die Rückwärtsrichtung.Z.B:
+2<+1+2-1<+1-1<+2+2+1
s/<(?=.*-)/-2/g
: Im Look-Ahead-Muster wird das Vollbild-1
des Ersteren<-
nicht benötigt, da keine-
Richtungssymbole mehr vorhanden sind.Z.B:
+2-2+1+2-1-2+1-1<+2+2+1
s/</-1/g
: Die<
nach dem letzten verbleibenden<-
werden konvertiert.Z.B:
+2-2+1+2-1-2+1-1-1+2+2+1
print eval
: Das Ergebnis berechnen und ausgeben.Z.B:
4
quelle
-p
: 74 Bytes ich Ihre geändert ,s/>//g
umy/>//
ein Byte in jedem Fall zu speichern , die auch für die Entfernung des Pars im Ausdruck erlaubt.Ruby, 141 Bytes
Ungolfed:
quelle
l=1;r=1
Kann seinl=r=1
und$><<o
kann seinp o
. Ich denke, Sie könnten sich viel rasieren, wenn Sie diese case-Anweisung durch etwas weniger sperriges ersetzen, vielleicht in der Art voneval %w(o-=1;l+=1 o+=1;r+=1 o-=l;l=1 o+=r;r=1)['<>LR'.index c]
l=r=1;o=0;gets.gsub('->',??).scan(/<-|./){eval"o+=#{%w[-1;l+ -l;l 1;r+ r;r][$&[-1].ord%4]}=1"};p o
Sie könnten mitruby -p
D - 243
Golf gespielt :
Nicht golfen :
quelle
C
148,141140140
141
148
Mit Leerzeichen:
Wahrscheinlich viel mehr Platz zum Golfen. Ich habe es größtenteils aufgegeben, 4 Variablen in Ternären zu manipulieren, die l-Werte erfasst haben (es kam immer länger heraus und wurde später), aber kein schlechter erster Durchgang. Ziemlich unkomplizierter Array-Pass. Übernimmt die Eingabe als Befehlszeilenargument und gibt sie über den Rückgabewert aus.
Sie benötigen das
-std=c99
Flag, um es mit gcc zu kompilieren.EDIT: Ja, es ist spät - einige offensichtliche Dinge verpasst.
quelle
main
:main(char*x,char**v)
. Dann haben Sie 138 statt 140.>><-
Gibt 0 anstelle von 1 oder><->
gibt 0 anstelle von 2.char
und*
, und ersetzen(*(x+1)==45)?(x++,o-=l+2,l=0):(o--,l++)
mit(*++x==45)?(o-=l+2,l=0):(x--,o--,l++)
.JavaScript, 136
Nicht abgeschlossen:
Wie es funktioniert
Wenn Sie einen String wie
s
folgt eingeben:Es wird ein Regex verwendet, um jeden Befehl durch eine Reihe von Anweisungen zu ersetzen, die
z
(die Endposition),l
(gespeicherte Linksbewegungen) und ändernr
gespeicherte Rechtsbewegungen . Jeder Regex wird in der Rangfolge ausgeführt.Für die Eingabe oben wird dies in Folgendes konvertiert
s
:Schön, nicht wahr?
Schließlich müssen wir
eval(s)
die Anweisungen und Warnungen ausführen,z
die die Endposition enthalten.quelle
Javascript (116,
122,130)116
122
130
quelle
JavaScript [217 Bytes]
Wahrscheinlich kann es etwas mehr verkürzt werden ...
quelle
PHP,
284282Kein Regex.
Ungolfed:
quelle
str_split($i)
(1
ist die Standardeinstellung für das zweite Argument.) Und$i
sollte es wahrscheinlich sein$c
, richtig?$i
): P Reparierte es!Eine andere Perl-Lösung, 113 Zeichen
Es gibt bereits zwei Antworten, die dies schlagen, es ist nur für Kichern. Es verwendet einen Ansatz, der auf Ilmaris Beobachtung über den Wert von Token basiert:
Ein bisschen explodiert:
quelle