¿Debería sugerirse este identificador?

8

Introducción

En Android Studio y otros IDE hay compleciones de código para ayudar a la inserción eficiente del código (especialmente cuando los nombres de las clases o métodos son tan detallados), como el de la imagen a continuación.

ingrese la descripción de la imagen aquí

Se utilizan lógicas ligeramente diferentes entre los IDE para determinar qué clases, métodos y variables sugerir, pero de lo contrario son comunes: escribir las letras iniciales de cada palabra y se sugerirá el identificador que coincida con esas letras iniciales.

Desafío

En este desafío, escriba un programa o función que reciba dos cadenas, a saber , inputy identifierdetermine si identifiercoincide con el input.

Nos dividimos identifieren palabras donde:

  • una letra minúscula es seguida por una letra mayúscula ( "SplitHere" -> "Split", "Here"),
  • una letra mayúscula es seguida por una letra mayúscula y una letra minúscula ( "SPLITHere" -> "SPLIT", "Here"), o
  • hay un número o un guión bajo _( "SPLIT_HERE" -> "SPLIT", "HERE").

Si esto todavía no es lo suficientemente claro, aquí es la expresión regular que representa la condición de división: (?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|[_0-9]. Aquí están algunas muestras:

  • theWord_Example, En la que 3 palabras ( the, Word, Example) se pueden encontrar.
  • THEWORD2EXAMPLE, en el que solo se pueden encontrar 2 palabras ( THEWORD, EXAMPLE) (porque THEWORDes una serie de letras mayúsculas y también lo hace EXAMPLE).
  • THEWordEXAMPLE3, En la que 3 palabras ( THE, Word, Example) se pueden encontrar ( Wordse considera que es una palabra separada aquí).
  • THEWORDEXAMPLEFOUR, en el que solo THEWORDEXAMPLEFOURse pueden encontrar 1 palabras ( ) (toda la serie de letras mayúsculas).

Para este propósito aquí usamos una versión simplificada. En realidad, la lógica es mucho más compleja. En esta versión solo hay dos reglas:

  1. Si inputconsiste solo en letras minúsculas, entonces un identifiercoincide con el inputúnico si hay una división inputen subcadenas, que para cada subcadena hay una palabra dentro del identifiercomienzo con esa subcadena, en ese orden exacto.

    Entrada de ejemplo: sbo

    Truthy casos: , , (actualización)SQLiteBindOrColumnIndexOutOfRangeExceptionSparseBooleanArray StringIndexOutOfBoundException

    Casos de falsa: SeekBar(falta o), (el no está al comienzo de una palabra)StatusBarNotificationo

  2. Si inputcontiene letras mayúsculas, se inputdebe hacer una división antes de cada letra mayúscula al aplicar la Regla 1.

    Entrada de ejemplo: sbO

    Casos verdaderos: SQLiteBindOrColumnIndexOutOfRangeException

    Casos falsos: ( deben aparecer al principio de una palabra), (orden incorrecto)SparseBooleanArrayOStringIndexOutOfBoundException

I / O

Entrada : dos cadenas, una para inputy una para identifier. Puede suponer que la expresión regular [A-Za-z]+coincide inputy la expresión regular [A-Za-z0-9_]coincide identifier.

Salida : uno de los valores de verdad o falsedad. Puede elegir qué valor devolver como verdadero y falso, pero su elección debe ser coherente en todos los casos. Por ejemplo, usted puede regresar 1/0, true/false, π/eo lo que sea, pero debe permanecer igual en todos los casos.

Casos de prueba

Cada línea consta de dos cadenas, a saber, inputy identifierrespectivamente.

Casos verdaderos:

"sbo" "SparseBooleanArray"
"sbo" "StringIndexOutOfBoundException"
"sbo" "SQLiteBindOrColumnIndexOutOfRangeException"
"sbO" "SQLiteBindOrColumnIndexOutOfRangeException"
"Al" "ArrayList"
"AL" "ArrayList"
"Al" "ALARM_SERVICE"
"As" "ALARM_SERVICE"
"AS" "ALARM_SERVICE"
"SD" "SQLData"
"SqD" "SQLData"
"SqlD" "SQLData"
"SqDa" "SQLData"
"the" "theWord_Example"
"the" "THEWORD2EXAMPLE"
"the" "THEWordEXAMPLE3"
"the" "THEWORDEXAMPLEFOUR"
"thw" "theWord_Example"
"thw" "THEWordEXAMPLE3"
"te" "theWord_Example"
"te" "THEWORD2EXAMPLE"
"te" "THEWordEXAMPLE3"

Casos de falsa:

"sbo" "SeekBar"
"sbo" "StatusBarNotification"
"sbO" "StringIndexOutOfBoundException"
"sbO" "SparseBooleanArray"
"AL" "ALARM_SERVICE"
"ASE" "ALARM_SERVICE"
"SQD" "SQLData"
"SqLD" "SQLData"
"SLD" "SQLData"
"SQDt" "SQLData"
"SQDA" "SQLData"
"thw" "THEWORD2EXAMPLE"
"thw" "THEWORDEXAMPLEFOUR"
"te" "THEWORDEXAMPLEFOUR"

Criterios ganadores

Este es un , por lo que gana el código más corto de cada idioma. Las lagunas predeterminadas no están permitidas.

Shieru Asakoto
fuente
1
entonces "SQLData", "SQLData"es falso?
l4m2
@ l4m2 Sí, según las reglas simplificadas. Sin embargo "sqldata", "SQLData"es verdad.
Shieru Asakoto
1
puede "sbo" "StringIndexOutOfBoundException"coincidir *S*tringIndexOutOf*Bo*undException?
TFeld
@TFeld Oh, cometí un error en los casos, gracias por recordarlo
Shieru Asakoto el

Respuestas:

1

Python 2 , 239 227 bytes

lambda a,b:any(re.match(w,''.join(map(str.title,re.sub('(?=[A-Z][a-z])|(?<=[a-z])(?=[A-Z])|(\d)','_',b).split('_'))))for w in g(a))
import re
g=lambda s:s and{c+w for w in g(s[1:])for c in[s[0],'.*'+s[0].upper()][s<'[':]}or{''}

Pruébalo en línea!

TFeld
fuente
0

JavaScript (ES6), 177 bytes

Espera (identifier)(input).

S=>g=([c,...s],l=[],o='')=>c?g(s,o?[...l,o]:l,c)|c>{}&g(s,l,o+c):eval(`/~${[...l,o].join`.*~`}/i`).test(S.replace(/./g,(c,i)=>!i|(!/[A-Z]/.test(l)|S[i+1]>'_')&(l=c)<{}?'~'+c:c))

Pruébalo en línea!

Arnauld
fuente