O desafio é analisar uma string como o Python e imprimir o conteúdo da string.
- Entrada (argumento da linha de comando ou stdin) : uma literal de cadeia de caracteres (por exemplo
"hello"
) (ou vários literais, consulte concatenação de literal de cadeia abaixo) - Saída (stdout) : o conteúdo da string (por exemplo
hello
)
Regras para analisar a sequência:
- Um literal de cadeia é colocado entre pares de aspas simples (
'a'
), aspas duplas ("a"
), aspas simples triplas ('''a'''
) ou aspas duplas triplas ("""a"""
). A primeira recorrência do tipo de aspas que abriu a sequência finaliza a sequência. - A barra invertida escapa:
\'
dentro de uma cadeia torna-se'
,\"
torna"
-\\
se e torna - se\
. Você não precisa implementar outras escapes de barra invertida. Uma barra invertida que não faz parte de uma sequência de escape permanece uma barra invertida. - Concatenação literal de string: o conteúdo dos literais de string adjacentes é concatenado. Por exemplo,
"hello" 'world'
torna-sehelloworld
. - A entrada pode conter espaços que não fazem parte de nenhum literal.
- Você não precisa oferecer suporte a nenhum outro tipo de espaço em branco, nem dentro nem fora de literais.
Regras adicionais:
eval
,exec
e coisas semelhantes não são permitidas para analisar o literal ou partes dele.- Você pode assumir que a entrada é válida.
- Você pode assumir um comprimento máximo de entrada de 1023 caracteres.
Exemplos:
"hello" ' world'
->hello world
"""\"""'\\\A"""
->"""'\\A
( '''"""'''"""'''""" )
(sem parênteses, mas com espaços) ->"""'''
O menor código vence.
Respostas:
Perl, 54 caracteres
Quando eu estava postando isso, notei que é quase idêntico à solução Ruby de Jan Dvorak. Estou um pouco impressionado com a sua similaridade, de fato, mas vou dizer "Grandes mentes pensam da mesma forma" e deixar para lá.
Este programa destaca um caso de canto estranho na contagem de caracteres nos scripts Perl: Pela minha leitura, a presença de aspas simples no script significa que preciso contar a
-p
opção como dois caracteres em relação ao meu total. Normalmente, ao calcular o tamanho dos scripts Perl, o caractere inicial do traço nas opções é considerado livre, com a justificativa de que ele pode ser empacotado com o-e
que introduz o programa corretamente ... você precisa inserir o script na linha de comando. As aspas simples exigem muito escape, portanto, para evitar essa penalidade, preciso contá-la como um script executado a partir de um arquivo e, portanto, recebo os caracteres#!/usr/bin/perl
de graça, mas não os de opção. É um pouco confuso.fonte
(('|")\2{2}?)
tem o mesmo comprimento que("""|'''|"|')
C, 178 caracteres
Essa é uma daquelas soluções C em que tudo é feito dentro de um grupo de cadeias de operadores ternários.
O programa funciona copiando caracteres de volta para o mesmo buffer, substituindo os metacaracteres.
d
mantém o delimitador quando dentro de uma sequência et
é verdadeiro se o delimitador for uma citação tripla.fonte
'foo\\'
refere-se à string foo \, que é seguida por um caractere que não é um espaço em branco nem um delimitador de string.Rubi,
7473 caracteresO núcleo aqui são duas regexes: O primeiro determina os limites da cadeia e seleciona apenas o conteúdo. A alteração existe para remover tudo que não está dentro das cordas e também descarta as cordas não fechadas.
As barras invertidas são tratadas como possesive-opcional seguidas por qualquer coisa. Portanto,Como o mecanismo regex não(\\?.)
retornará para entradas válidas (obrigado @breadbox), uma única barra invertida não poderá corresponder lá. As cotações são tratadas por meio de repetição lenta. O segundo regex remove uma barra invertida antes de cada caractere escapável. A regex depende do mecanismo para sempre escolher a alternativa mais à esquerda primeiro.Também considerei uma abordagem de máquina de estado, mas ficou bastante grande (19 estados x classes de 4 caracteres) em comparação com a solução regex. Ainda posso postar a máquina do estado se alguém estiver interessado.
fonte
'foo\\'
é a primeira corda ebar'
está fora de um contexto de string quando a entrada é'foo\\'bar'