¿En una cuerda o no?

8

Recientemente he tenido algunos problemas con el nuevo intérprete de TeaScript . El mayor problema es identificar si una cadena contiene o no caracteres especiales.


Desafío

Un carácter especial se define como un carácter con un punto de código de 160 a 255. Se le dará una entrada que es una cadena de caracteres con puntos de código de 0 a 255, como máximo uno de los cuales es un carácter especial. La entrada consistirá en un prefijo de cero o más caracteres, una cadena entre comillas y un sufijo de cero o más caracteres. Si hay un carácter especial en la cadena entre comillas, debe generar un valor verdadero, de lo contrario, un valor falsey.

Detalles

  • Los personajes "'se consideran citas.
  • Dentro de la cadena entre comillas, \se utilizará una barra invertida para escapar del siguiente carácter. En el prefijo y sufijo, no tiene un significado especial.
  • Las cotizaciones siempre serán equilibradas.
  • Solo habrá una cadena entre comillas.

Ejemplos

"Hello, World¡"
true

"Hello, World"¡
false

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

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

\"foo¡"
true
Downgoat
fuente
1
Esto podría usar un caso de prueba en el que se escapa el carácter Unicode.
Martin Ender
1
También pruebe casos que realmente usan 'cadenas y cadenas múltiples en un solo caso de prueba (idealmente con el carácter Unicode entre ellos).
Martin Ender
@ MartinBüttner Una de las reglas es que "solo habrá un conjunto de citas" pero +1 para las otras ideas de casos de prueba.
user81655
@ user81655 oh cierto, lo pasé por alto. Eso simplifica las cosas.
Martin Ender
66
"Debido a que solo hay 1,114,112 caracteres en Unicode, su código deberá ser lo más corto posible" ................ No tengo palabras para sus justificaciones de golf.
ETHproductions

Respuestas:

5

Retina , 19 17 bytes

Gracias a user81655 por guardar 2 bytes.

El recuento de bytes utiliza ISO 8859-1.

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

La salida es 0 o 1.

Pruébalo en línea.

Explicación

Debido a los supuestos del desafío, el primero 'o "iniciará la única cadena de la entrada y el último 'o lo "finalizará. Tampoco tenemos que preocuparnos de que sean iguales porque de todos modos se garantiza que serán iguales.

Por lo tanto, la expresión regular solo intenta encontrar un carácter con el punto de código 161 a 255, inclusive, precedido por una cita y seguido por otra. Siempre habrá 0 o 1 partido.

Martin Ender
fuente
¿No dará esto un falso positivo "abc"¡'? (Supongo que dependiendo de cómo lea el OP, esa comilla simple nunca puede aparecer en una entrada, pero técnicamente solo hay un conjunto de comillas en esta entrada).
Lynn
@Mauris la especificación dice que las citas siempre estarán equilibradas.
Martin Ender
Aquí hay otra solución de 17 bytes: (['"]).*[¡-ÿ].*\1. Resulta ser más práctico.
Mama Fun Roll
@ ן nɟuɐɯɹɐ ן oɯ sí, lo consideré, pero pensé que era excesivo, dados los supuestos del desafío. ¯ \ _ (ツ) _ / ¯
Martin Ender
4

Nota: Esto se puede hacer con una expresión regular simple. s=>s.match`['"].*[¡-ÿ].*['"]`tiene 29 bytes en JavaScript, pero es más divertido sin expresiones 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

Explicación

Devoluciones 1por truey 0para false. El " "en el código a continuación es un U+00A0 NO-BREAK SPACE(punto 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

Prueba

usuario81655
fuente
¿Maneja el retroceso para escapar de las comillas?
edc65
¿Qué quieres decir? Puedes probarlo usando el fragmento de prueba.
user81655
Derecha. De hecho, lo hace
edc65
Oh, tu expresión regular es incluso más corta que mi solución Retina de dos etapas. ¿Te importa si lo uso?
Martin Ender
@ MartinBüttner Adelante. Es casi lo mismo de todos modos.
user81655