Le défi est de analyser une chaîne comme Python et à imprimer le contenu de la chaîne.
- Entrée (argument de ligne de commande ou stdin) : un littéral de chaîne (par exemple
"hello"
) (ou plusieurs littéraux, voir la concaténation de littéral de chaîne ci-dessous) - Sortie (sortie standard) : le contenu de la chaîne (par exemple
hello
)
Règles d'analyse de la chaîne:
- Un littéral de chaîne est entouré de paires correspondantes de guillemets simples (
'a'
), de guillemets doubles ("a"
), de guillemets simples triples ('''a'''
) ou de guillemets doubles triples ("""a"""
). La première réapparition du type de guillemets qui a ouvert la chaîne termine la chaîne. - La barre oblique inverse s'échappe:
\'
dans une chaîne devient'
,\"
devient"
et\\
devient\
. Vous n'avez pas besoin d'implémenter d'autres échappements de barre oblique inverse. Une barre oblique inverse qui ne fait pas partie d'une séquence d'échappement reste une barre oblique inverse. - Concaténation de littéraux de chaîne: le contenu des littéraux de chaînes adjacents est concaténé. Par exemple,
"hello" 'world'
devienthelloworld
. - L'entrée peut contenir des espaces qui ne font partie d'aucun littéral.
- Vous n'avez pas besoin de prendre en charge tout autre type d'espace, ni à l'intérieur ni à l'extérieur des littéraux.
Règles supplémentaires:
eval
,exec
et des éléments similaires ne sont pas autorisés pour analyser le littéral ou des parties de celui-ci.- Vous pouvez supposer que l'entrée est valide.
- Vous pouvez supposer une longueur d'entrée maximale de 1023 caractères.
Exemples:
"hello" ' world'
->hello world
"""\"""'\\\A"""
->"""'\\A
( '''"""'''"""'''""" )
(sans parenthèses, mais avec des espaces) ->"""'''
Le code le plus court gagne.
Réponses:
Perl, 54 caractères
Juste au moment où je publiais cela, j'ai remarqué qu'elle était presque identique à la solution Ruby de Jan Dvorak. Je suis un peu décontenancé par la similitude, en fait, mais je vais dire "Les grands esprits se ressemblent" et laissez-le faire.
Ce programme met en évidence un cas étrange dans le comptage des caractères dans les scripts Perl: D'après ma lecture, la présence de guillemets simples dans le script signifie que je dois compter l'
-p
option comme deux caractères dans mon total. Typiquement, lors du calcul des tailles de script Perl, le caractère de tiret initial sur les options est considéré comme libre, sur la justification qu'il peut être groupé avec celui-e
qui introduit le programme proprement dit ... mais alors vous devez également tenir compte des échappements supplémentaires vous devez entrer le script sur la ligne de commande. Les guillemets simples nécessitent beaucoup d'échappements, donc pour éviter cette pénalité, je dois le compter comme un script exécuté à partir d'un fichier, et donc j'obtiens#!/usr/bin/perl
gratuitement, mais pas de caractères d'option. C'est un peu déroutant.la source
(('|")\2{2}?)
c'est la même longueur que("""|'''|"|')
C, 178 caractères
C'est l'une de ces solutions C où tout se fait à l'intérieur d'un gang de chaîne d'opérateurs ternaires.
Le programme fonctionne en copiant les caractères dans le même tampon, en remplaçant les métacaractères.
d
contient le délimiteur lorsqu'il est à l'intérieur d'une chaîne ett
est vrai si le délimiteur est un guillemet triple.la source
'foo\\'
fait référence à la chaîne foo \, qui est ensuite suivie d'un caractère qui n'est ni un espace ni un délimiteur de chaîne.Rubis,
7473 caractèresLe noyau est composé de deux expressions régulières: la première détermine les limites de la chaîne et sélectionne uniquement le contenu. La modification est là pour supprimer tout ce qui n'est pas à l'intérieur des chaînes, et elle supprime également les chaînes non fermées.
Les barres obliques inverses sont traitées comme facultatives-facultatives, suivies de tout. Donc,Étant donné que le moteur regex ne reviendra pas en arrière(\\?.)
pour des entrées valides (merci @breadbox), une seule barre oblique inverse ne peut pas y correspondre. Les citations sont traitées par répétition paresseuse. Le deuxième regex supprime ensuite une barre oblique inverse avant chaque caractère pouvant être échappé. Le regex dépend du moteur pour toujours choisir l'alternative la plus à gauche en premier.J'ai également envisagé une approche par machine à états, mais elle s'est avérée assez importante (19 états x 4 classes de caractères) par rapport à la solution regex. Je peux toujours publier la machine d'état si quelqu'un est intéressé.
la source
'foo\\'
est la première chaîne et sebar'
trouve en dehors d'un contexte de chaîne lorsque l'entrée est'foo\\'bar'