Ich reproduziere den zweiten Teil des ersten Tags des Advent of Code mit Genehmigung des Erstellers.
Der Weihnachtsmann versucht, Geschenke in einem großen Wohnhaus auszuliefern, findet aber nicht die richtige Etage - die Anweisungen sind ein wenig verwirrend. Er beginnt im Erdgeschoss (Etage 0) und folgt dann den Anweisungen einzeln.
Eine öffnende Klammer (
bedeutet, dass er eine Etage höher gehen soll, und eine schließende Klammer )
bedeutet, dass er eine Etage tiefer gehen soll.
Das Wohnhaus ist sehr hoch und der Keller ist sehr tief; Er wird niemals die oberen oder unteren Stockwerke finden.
Suchen Sie anhand einer Reihe von Anweisungen die Position des ersten Zeichens, das ihn veranlasst, den Keller zu betreten (Etage -1).
Als Beispiele:
Durch die Eingabe )
betritt er den Keller an Position 1 des Charakters.
Durch die Eingabe ()())
betritt er den Keller an Position 5 des Charakters.
Ein langer Eingang gegeben hier , dass die Lösung 1797 ergeben sollte.
Das ist Codegolf, also gewinnt die kürzeste Lösung!
Antworten:
Gelee,
87 BytesVielen Dank an @ Sp3000 für das Golfen ab 1 Byte!
Probieren Sie es online!
Wie es funktioniert
quelle
Python 2, 44 Bytes
Diese clevere Lösung wurde von Hallvabo, Xsot, Mitchs und Whatisgolf für dieses Problem beim Anarchy Golf gefunden . Wenn jemand von euch es stattdessen posten möchte, werde ich es entfernen.
Der Trick ist, Pythons Parser die Arbeit machen zu lassen. Die Funktion
input()
versucht, eine Eingabezeichenfolge auszuwerten, und löst beim ersten nicht übereinstimmenden Paren einen Fehler aus. Dieser Fehler hat, wenn er abgefangen wird, FormDies beinhaltet die Zeichennummer, an der der Fehler aufgetreten ist.
quelle
Python
7977 BytesEs gibt wahrscheinlich einen besseren Weg, dies zu tun, aber mir fehlen die Ideen. Auch dies ist mein erster Beitrag über Codegolf.
Vielen Dank an @Erwan. zum Golfen ab 2 Bytes.
quelle
[0:g]
durch[:g]
-2*ord(z)+81
durch2*(z<')')-1
Python 3, 59
3 Bytes gespart dank grc.
Ich mag es nicht, in Python manuell Zeichenfolgen zu indizieren. Es fühlt sich so falsch an.
quelle
C 55 Bytes
Probieren Sie es hier aus .
Edit: Ich bin mir nicht sicher, warum ich eine unbenutzte Variable dort belassen habe ...
quelle
CJam, 10 Bytes
oder
oder (Dank an Dennis)
Teste es hier.
Erläuterung
Wie A Simmons bereits bemerkte,
()
ist CJam eine glückliche Wahl, da dies die Dekrement- / Inkrement-Operatoren sind. Das heißt, wenn wir bei Null beginnen, suchen wir nach der Stufe, bei der der Weihnachtsmann die erste Etage erreicht.quelle
Labyrinth , 18 Bytes
Probieren Sie es online! Diese Antwort ergab sich aus der Zusammenarbeit mit @ MartinBüttner.
Erläuterung
Der übliche Labyrinth-Primer (ich sage "normal", aber das schreibe ich jedes Mal neu):
n*10 + <digit>
. Dies ermöglicht den einfachen Aufbau großer Zahlen. Verwenden Sie_
, um eine neue Nummer zu beginnen , die Null drückt.Dieser Code ist etwas seltsam, da die Hauptschleife zum Golfen zwei Aufgaben in einer vereint. Für die erste Hälfte des ersten Durchgangs passiert Folgendes:
Nachdem der Stack mit -1 initialisiert wurde, kann die eigentliche Verarbeitung beginnen. Hier ist, was die Hauptschleife macht.
Das letzte Duplikat fügt dem Stapel für jede von uns ausgeführte Iteration ein Element hinzu. Dies ist wichtig, da wir Folgendes tun, wenn wir beim NOP auf Null gehen und vorwärts gehen:
quelle
Oracle SQL 11.2,
160159 BytesNicht golfen
quelle
Retina ,
2221Probieren Sie es online aus oder testen Sie den großen Testfall. (Die URL für den großen Testfall ist groß. Lassen Sie mich wissen, ob sie für Sie nicht funktioniert. In Chrome scheint sie in Ordnung zu sein.)
1 Byte gespart dank Martin!
Wir passen die ersten ausgeglichenen Klammern an und extrahieren sie. Dann zählen wir, wie oft die leere Zeichenfolge mit diesem Ergebnis übereinstimmt. Ich bin mir nicht sicher, ob dies der beste Weg ist, dies in Retina zu tun, besonders wenn der PCRE-Modus es kürzer macht, aber die Verwendung des
$#_
Ersatzes schien länger zu sein, weil ein Fehler aufgetreten ist und das Problem besteht, dass mehr als eine Übereinstimmung vorliegt.Dieser Algorithmus verursacht ein merkwürdiges Verhalten bei ungültigen Eingaben. Er geht im Wesentlichen davon aus, dass der Weihnachtsmann sich nach den anderen Bewegungen auf mysteriöse Weise dorthin teleportiert, wenn er es nicht in den Keller schafft.
quelle
Grep + AWK, 51 Bytes
Der
grep
Befehl setzt jedes Zeichen in eine neue Zeile.quelle
Pyth, 13 Bytes
Erläuterung
Probieren Sie es hier aus
Alter Algorithmus, 15 Bytes
Erläuterung:
Probieren Sie es hier aus
Oder wenn andere Zeichen als
(
und verwendet werden dürfen)
, 9 Bytes (Verschieben der Vorverarbeitung zur Eingabe)Erläuterung
Probieren Sie es hier aus
quelle
JavaScript (ES6), 58 Byte
Entfernt rekursiv ein Paar übereinstimmender
()
s, bis das erste Zeichen a ist)
. Warnung: Versuchen Sie dies nicht bei Saiten, die nicht genug)
s haben. Beispiel:Zu diesem Zeitpunkt wurden insgesamt 12 Zeichen gelöscht, sodass die Antwort 13 lautet.
quelle
MATL ,
1211 Bytes1 Byte, das mit Dennis 'Idee, -1 zu berechnen, in der Eingabezeichenfolge gespeichert wurde
Probieren Sie es online!
quelle
CJam,
1210 BytesProbieren Sie es hier aus.
Zwei Bytes gespart dank Martin.
Erläuterung:
quelle
Javascript, 117 Bytes
Ignoriert andere Zeichen. Verwendet
prompt
undalert
.quelle
Perl, 34 + 1 = 35 Bytes
Danke an Dennis für ein paar Tipps.
Laufen Sie mit dem
-p
Flagge. Es funktioniert in Perl 5.10, aber spätere Versionen benötigen hier ein Leerzeichen:++ while
Ältere, nicht Golf spielende Version:
quelle
Python, 44 Bytes
Der Boden
i
beginnt bei,1
so dass wiri
mit dem Falsey-Wert enden0
. Wenn dies nicht der Fall ist, fügen Sie rekursiv eine hinzu, um das erste Zeichen zu entfernen und die Stockwerksnummer basierend auf diesem Zeichen zu aktualisieren.quelle
Javascript, 57 Bytes
Ziemlich einfach, iteriert nur über die Eingabe, incs if '(' decs if ')'. Gibt beim ersten Negativ zurück.
quelle
Ruby, 47 Bytes
Anonyme Funktion.
quelle
C 73 Bytes
Erwartet die Eingabe von STDIN; Keine anderen Zeichen als
(
und)
in der Eingabe erscheinen (zumindest bis wir die Antwort erreicht haben). Die Eingabe muss ASCII sein.Gibt die Antwort auf STDOUT aus.
Verwendet die 1-Bit-Differenz zwischen ASCII für
(
und)
.Schön formatierte Version:
quelle
f=c=0
in die Initialisierung der Schleife verschiebenfor(f=c=0;f!=...
, um ein Byte zu speichern?PowerShell,
756562 ByteVerwendet eine ähnliche Technik wie auf Parenthifiable Binärzahlen in einer Schleife durch alle Eingabezeichen, ein Laufen zu halten
$c
ounter von+1
für jeden(
und-1
für jeden)
, dann testen , ob wir negativ getroffen haben (dh, wir sind im Keller).Bearbeiten - Speichert 10 Bytes, indem die tatsächlichen Zeichen und nicht deren Indizes durchlaufen werden.
Bearbeiten 2 - Speichert 3 zusätzliche Bytes, indem die Gleichheitsprüfung gegen Modulo ausgetauscht wird, sodass das Casting implizit erfolgt
quelle
Mathematica,
62-55BytesAlle langen Funktionsnamen! Funktioniert ähnlich wie die CJam-Antwort von Simmons.
quelle
Befunge 25 Bytes
Ausgänge in unary. Dies startet Sie im ersten Stock und geht bis 0.
quelle
Schläger (102)
Ungolfed
quelle
APL, 18 Zeichen
Auf Englisch:
¯1*')'=⍵
: -1 wobei input = ")", andernfalls 1;+\
: laufende Summe;1⍳⍨¯1=
: finde den Index des ersten -1.quelle
Lua,
928987 BytesEs wird ein Befehlszeilenargument benötigt.
Bearbeiten: 3 Bytes gespeichert
Bearbeiten: 2 Bytes gespeichert und ein Fehler behoben, der in Randfällen auftreten konnte, wird jetzt über den Exit-Code ausgegeben
Ungolfed
quelle
k / kona ,
2321 BytesDurch Entfernen unnötiger Klammern werden 2 Byte gespart.
Verwendung:
quelle
Perl, 40 + 1 = 41 Bytes
Benötigt die
-p
Flagge:Nimmt eine gültige Eingabe an.
Wie es funktioniert:
quelle
Javascript (ES6),
6867 BytesÜbernimmt die Eingabe als erstes Argument
Erläuterung
quelle
Python (3.5),
787162 Byteseine rekursive Lösung
es ist ähnlich wie diese Lösung für Minigolf
Wir können davon ausgehen, dass der Weihnachtsmann immer den Keller erreicht
quelle