Esse identificador deve ser sugerido?

8

Introdução

No Android Studio e em outros IDEs, existem conclusões de código para ajudar na inserção eficiente de código (especialmente quando os nomes das classes ou métodos são muito detalhados), como o da imagem abaixo.

insira a descrição da imagem aqui

Existem lógicas ligeiramente diferentes usadas entre IDEs para determinar quais classes, métodos e variáveis ​​sugerir, mas são comuns: digitar as letras iniciais de cada palavra e o identificador correspondente a essas letras iniciais será sugerido.

Desafio

Neste desafio, escreva um programa ou função que receba duas strings, a saber , inpute identifierdetermine se identifiercorresponde a input.

Dividimos identifierem palavras onde:

  • uma letra minúscula é seguida por uma letra maiúscula ( "SplitHere" -> "Split", "Here"),
  • uma letra maiúscula é seguida por uma letra maiúscula e uma letra minúscula ( "SPLITHere" -> "SPLIT", "Here"), ou
  • existe um número ou um sublinhado _( "SPLIT_HERE" -> "SPLIT", "HERE").

Se isso ainda não é suficientemente clara, aqui é o regex representando a condição de separação: (?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|[_0-9]. Aqui estão algumas amostras:

  • theWord_Example, Em que 3 palavras ( the, Word, Example) pode ser encontrado.
  • THEWORD2EXAMPLE, em que apenas duas palavras ( THEWORD, EXAMPLE) podem ser encontradas (porque THEWORDsão letras maiúsculas e o mesmo acontece EXAMPLE).
  • THEWordEXAMPLE3, Em que 3 palavras ( THE, Word, Example) podem ser encontrados ( Wordé considerado como uma palavra separada aqui).
  • THEWORDEXAMPLEFOUR, em que apenas 1 palavras ( THEWORDEXAMPLEFOUR) podem ser encontradas (toda a série de letras maiúsculas).

Para esse fim, usamos uma versão simplificada. Na realidade, a lógica é muito mais complexa. Nesta versão, existem apenas duas regras:

  1. Se inputconsistir apenas em letras minúsculas, um identifiercorresponderá ao inputúnico se houver uma divisão inputem substrings, que para cada substring existe uma palavra dentro do identifierinício com esse substring, nessa ordem exata.

    Exemplo de entrada: sbo

    Casos Truthy: , , (actualização)SQLiteBindOrColumnIndexOutOfRangeExceptionSparseBooleanArray StringIndexOutOfBoundException

    Casos de falsidade: SeekBar(ausente o), ( não está no início de uma palavra)StatusBarNotificationo

  2. Se inputcontiver letras maiúsculas, uma divisão na inputdeve ser feita antes de cada letra maiúscula ao aplicar a Regra 1.

    Exemplo de entrada: sbO

    Casos verdadeiros: SQLiteBindOrColumnIndexOutOfRangeException

    Casos de falsidade: ( devem aparecer no início de uma palavra), (ordem errada)SparseBooleanArrayOStringIndexOutOfBoundException

I / O

Entrada : duas strings, uma para inpute uma para identifier. Você pode supor que o regex [A-Za-z]+corresponde inpute o regex [A-Za-z0-9_]corresponde identifier.

Saída : um dos valores verdadeiros ou falsos. Você pode escolher qual valor retornar como verdadeiro e qual falso, mas sua escolha deve ser consistente em todos os casos. Por exemplo, você pode retornar 1/0, true/false, π/eou o que quer, mas eles devem permanecer o mesmo em todos os casos.

Casos de teste

Cada linha consiste em duas cadeias, a saber inpute identifierrespectivamente.

Casos verdadeiros:

"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 falsidade:

"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"

Critérios Vencedores

Este é um , portanto o código mais curto de cada idioma vence. As brechas padrão não são permitidas.

Shieru Asakoto
fonte
1
então "SQLData", "SQLData"é falso?
L4m2 12/11/19
@ l4m2 Sim, de acordo com as regras simplificadas. No entanto, "sqldata", "SQLData"é verdade.
Shieru Asakoto 12/11/2018
1
pode "sbo" "StringIndexOutOfBoundException"combinar *S*tringIndexOutOf*Bo*undException?
TFeld
@TFeld Oh eu cometi um erro sobre os casos, graças para lembrar
Shieru Asakoto

Respostas:

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{''}

Experimente online!

TFeld
fonte
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))

Experimente online!

Arnauld
fonte