Die Herausforderung besteht darin, eine Zeichenfolge wie Python zu analysieren und den Inhalt der Zeichenfolge zu drucken.
- Eingabe (Befehlszeilenargument oder stdin) : ein Zeichenfolgenliteral (z. B.
"hello"
) (oder mehrere Literale, siehe Verkettung von Zeichenfolgenliteralen unten) - Output (stdout) : Der Inhalt der Zeichenfolge (z
hello
)
Regeln zum Parsen der Zeichenfolge:
- Ein String-Literal ist in übereinstimmenden Paaren von einfachen Anführungszeichen (
'a'
), doppelten Anführungszeichen ("a"
), dreifachen einfachen Anführungszeichen ('''a'''
) oder dreifachen doppelten Anführungszeichen ("""a"""
) enthalten. Das erste Wiederauftreten des Anführungszeichentyps, der die Zeichenfolge geöffnet hat, beendet die Zeichenfolge. - Backslash entweicht:
\'
Innerhalb einer Zeichenfolge wird'
,\"
wird"
und\\
wird\
. Sie müssen keine weiteren Backslash-Escapezeichen implementieren. Ein Backslash, der nicht Teil einer Escape-Sequenz ist, bleibt ein Backslash. - Verkettung von Zeichenfolgenliteralen : Der Inhalt benachbarter Zeichenfolgenliterale wird verkettet. Zum Beispiel
"hello" 'world'
wirdhelloworld
. - Die Eingabe kann Leerzeichen enthalten, die nicht Teil eines Literals sind.
- Sie müssen keine anderen Leerzeichen unterstützen, weder innerhalb noch außerhalb von Literalen.
Zusätzliche Regeln:
eval
,exec
Und ähnliche Sachen sind nicht erlaubt für das Parsen der wörtlichen oder Teile davon.- Sie können davon ausgehen, dass die Eingabe gültig ist.
- Sie können eine maximale Eingabelänge von 1023 Zeichen annehmen.
Beispiele:
"hello" ' world'
->hello world
"""\"""'\\\A"""
->"""'\\A
( '''"""'''"""'''""" )
(ohne Klammern, aber mit Leerzeichen) ->"""'''
Der kürzeste Code gewinnt.
Antworten:
Perl, 54 Zeichen
Gerade als ich dies veröffentlichte, bemerkte ich, dass es fast identisch mit Jan Dvoraks Ruby-Lösung ist. Ich bin ein wenig verstört darüber, wie ähnlich es tatsächlich ist, aber ich werde sagen "Große Köpfe denken gleich" und es dabei loslassen.
Dieses Programm hebt einen seltsamen Eckfall beim Zählen von Zeichen in Perl-Skripten hervor: Beim Lesen bedeutet das Vorhandensein von einfachen Anführungszeichen im Skript, dass ich die
-p
Option als zwei Zeichen für meine Gesamtzahl zählen muss. Wenn Sie Perl-Skriptgrößen berechnen, wird das anfängliche Bindestrichzeichen für die Optionen normalerweise als frei angesehen, mit der Begründung, dass es mit dem Zeichen gebündelt werden kann-e
, das das eigentliche Programm einführt. Dann müssen Sie jedoch auch zusätzliche Escapezeichen berücksichtigen Sie müssen das Skript in der Befehlszeile eingeben. Die einfachen Anführungszeichen erfordern viel Escapezeichen. Um diese Strafe zu vermeiden, muss ich sie als Skript zählen, das aus einer Datei ausgeführt wird. Daher erhalte ich die#!/usr/bin/perl
kostenlosen, aber keine Optionszeichen. Es ist ein bisschen verwirrend.quelle
(('|")\2{2}?)
ist die gleiche Länge wie("""|'''|"|')
C, 178 Zeichen
Dies ist eine dieser C-Lösungen, bei denen alles innerhalb einer Kettenbande mit ternären Operatoren erledigt wird.
Das Programm kopiert Zeichen zurück in denselben Puffer und überschreibt die Metazeichen.
d
Enthält das Trennzeichen innerhalb einer Zeichenfolge undt
ist wahr, wenn das Trennzeichen ein dreifaches Anführungszeichen ist.quelle
'foo\\'
bezieht sich auf die Zeichenfolge foo \, auf die dann ein Zeichen folgt, das weder ein Leerzeichen noch ein Zeichenfolgenbegrenzer ist.Rubin,
7473 ZeichenDer Kern hier sind zwei reguläre Ausdrücke: Der erste bestimmt die Zeichenfolgengrenzen und wählt nur den Inhalt aus. Die Änderung dient dazu, alles zu entfernen, was nicht in Zeichenfolgen enthalten ist, und es werden auch nicht geschlossene Zeichenfolgen gelöscht.
Backslashes werden als Possessiv-Optional behandelt, gefolgt von allem. Somit,Da die Regex-Engine(\\?.)
für gültige Eingaben nicht zurückkehrt (danke @breadbox), kann dort kein einziger Backslash gefunden werden. Zitate werden durch faule Wiederholung behandelt. Der zweite reguläre Ausdruck entfernt dann vor jedem entkommenen Zeichen einen Backslash. Die Regex hängt vom Motor ab, um immer zuerst die Alternative ganz links auszuwählen.Ich habe auch einen State-Machine-Ansatz in Betracht gezogen, der sich jedoch im Vergleich zur Regex-Lösung als ziemlich groß herausstellte (19 Zustände x 4 Zeichenklassen). Ich kann die Zustandsmaschine immer noch posten, wenn jemand interessiert ist.
quelle
'foo\\'
ist die erste Zeichenfolge undbar'
befindet sich außerhalb eines Zeichenfolgenkontexts, wenn die Eingabe lautet'foo\\'bar'