Em uma corda ou não?

8

Recentemente, tenho tido alguns problemas com o novo intérprete TeaScript . O maior problema é identificar se uma sequência contém ou não caracteres especiais.


Desafio

Um caractere especial é definido como um caractere com pontos de código 160 a 255. Você receberá uma entrada que é uma sequência de caracteres com pontos de código de 0 a 255, no máximo um dos quais é um caractere especial. A entrada consistirá em um prefixo de zero ou mais caracteres, uma string entre aspas e um sufixo de zero ou mais caracteres. Se houver um caractere especial na cadeia de caracteres citada, você deve gerar um valor verdadeiro, caso contrário, um valor falsey.

Detalhes

  • Os caracteres "'são considerados aspas.
  • Dentro da cadeia de caracteres citada, uma barra invertida \será usada para escapar do seguinte caractere. No prefixo e sufixo, ele não tem significado especial.
  • As cotações sempre serão equilibradas.
  • Haverá apenas uma string entre aspas.

Exemplos

"Hello, World¡"
true

"Hello, World"¡
false

"Hello' Wo\"rld\\"¡
false

ab"cd\"ef\\gh\i\\"£
false

\"foo¡"
true
Downgoat
fonte
1
Isso pode usar um caso de teste em que o caractere Unicode é escapado.
Martin Ender
1
Também teste casos que realmente usam 'cadeias e várias cadeias em um único caso de teste (idealmente com o caractere Unicode entre eles).
Martin Ender
@ MartinBüttner Uma das regras é que "haverá apenas um conjunto de aspas", mas +1 para as outras idéias de casos de teste.
user81655
@ user81655 oh certo, eu esqueci isso. Isso simplifica as coisas.
Martin Ender
6
"Como existem apenas 1.114.112 caracteres em unicode, seu código precisará ser o mais curto possível" ................ Não tenho palavras para suas justificativas de golfe.
ETHproductions

Respostas:

5

Retina , 19 17 bytes

Agradecemos a user81655 por salvar 2 bytes.

A contagem de bytes usa a ISO 8859-1.

['"].*[¡-ÿ].*['"]

A saída é 0 ou 1.

Experimente online.

Explicação

Devido às suposições do desafio, o primeiro 'ou "iniciará a única sequência da entrada e a última 'ou a "finalizará. Também não precisamos nos preocupar se eles são os mesmos, porque eles são garantidos para serem os mesmos.

Portanto, a regex apenas tenta encontrar um caractere com os pontos de código 161 a 255, inclusive, que é precedido por uma citação e seguido por outro. Sempre haverá 0 ou 1 correspondência.

Martin Ender
fonte
Isso não dará um falso positivo para "abc"¡'? (Eu acho que dependendo de como você ler o OP, que aspas simples nua nunca pode ocorrer em uma entrada, mas tecnicamente há apenas um conjunto de citações neste entrada.)
Lynn
@Mauris, a especificação diz que as cotações sempre serão equilibradas.
Martin Ender
Aqui está uma outra solução de 17 bytes: (['"]).*[¡-ÿ].*\1. Acontece ser mais prático.
Mama Fun Roll
@ ן nɟu that ן oɯ Sim, eu considerei esse, mas achei que era um exagero, dadas as suposições do desafio. ¯ \ _ (ツ) _ / ¯
Martin Ender
4

Nota: Isso pode ser feito com uma expressão regular simples. s=>s.match`['"].*[¡-ÿ].*['"]`tem 29 bytes em JavaScript, mas é mais divertido sem expressões regulares:

JavaScript (ES6), 84 82 bytes

s=>[...s].map((c,i)=>q?i<s.lastIndexOf(q)&c>" "?r=1:s:c=="'"|c=='"'?q=c:0,q=r=0)|r

Explicação

Retorna 1para truee 0para false. O " "código abaixo é um U+00A0 NO-BREAK SPACE(ponto de código 160).

s=>
  [...s].map((c,i)=>     // for each character c in the string
    q?
      i<s.lastIndexOf(q) // if we are still inside the string
        &c>" "?r=1       // and c is a "unicode character", set the result to 1 (true)
      :s                 // returning s for false guarantees that the array returned by map
                         //     will cast to NaN, which allows us to use |r instead of &&r
    :c=="'"|c=='"'?      // if we are starting a string
      q=c                // set the end of string character
    :0,
    q=                   // q = end string character
      r=0,               // initialise r to 0 (false)
  )|r                    // return r

Teste

user81655
fonte
Ele lida com o backspace para escapar de aspas?
Edc65
O que você quer dizer? Você pode testá-lo usando o snippet de teste.
user81655
Direita. Na verdade, é o seguinte
edc65
Ah, seu regex é ainda mais curto que minha solução Retina de dois estágios. Você se importa se eu usá-lo?
Martin Ender
@ MartinBüttner Vá em frente. É praticamente o mesmo de qualquer maneira.
user81655