Sollte diese Kennung vorgeschlagen werden?

8

Einführung

In Android Studio und anderen IDEs gibt es Code-Vervollständigungen, um das effiziente Einfügen von Code zu unterstützen (insbesondere wenn die Namen der Klassen oder Methoden so ausführlich sind), wie in der Abbildung unten dargestellt.

Geben Sie hier die Bildbeschreibung ein

Es gibt leicht unterschiedliche Logiken zwischen IDEs, um zu bestimmen, welche Klassen, Methoden und Variablen vorgeschlagen werden sollen, aber ansonsten sind sie üblich: Die Eingabe der Anfangsbuchstaben jedes Wortes und die Kennung, die diesen Anfangsbuchstaben entspricht, werden vorgeschlagen.

Herausforderung

Schreiben Sie in dieser Herausforderung ein Programm oder eine Funktion, die zwei Zeichenfolgen empfängt, nämlich inputund identifierbestimmen Sie, ob die Zeichenfolge mit der identifierübereinstimmt input.

Wir teilen uns identifierin Wörter auf, in denen:

  • Auf einen Kleinbuchstaben folgt ein Großbuchstabe ( "SplitHere" -> "Split", "Here").
  • Auf einen Großbuchstaben folgen ein Großbuchstabe und ein Kleinbuchstabe ( "SPLITHere" -> "SPLIT", "Here") oder
  • Es gibt eine Zahl oder einen Unterstrich _( "SPLIT_HERE" -> "SPLIT", "HERE").

Wenn dies immer noch nicht klar genug ist, ist hier der reguläre Ausdruck, der die Bedingung für die Aufteilung darstellt : (?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|[_0-9]. Hier einige Beispiele:

  • theWord_Example, In denen 3 Worte ( the, Word, Example) gefunden werden können.
  • THEWORD2EXAMPLE, in dem nur 2 Wörter ( THEWORD, EXAMPLE) gefunden werden können (weil THEWORDes sich um eine Reihe von Großbuchstaben handelt und dies auch der Fall ist EXAMPLE).
  • THEWordEXAMPLE3, In denen 3 Worte ( THE, Word, Example) gefunden werden ( Wordgilt als hier ein separates Wort sein).
  • THEWORDEXAMPLEFOUR, in dem nur 1 Wort ( THEWORDEXAMPLEFOUR) gefunden werden kann (die gesamte Folge von Großbuchstaben).

Zu diesem Zweck verwenden wir hier eine vereinfachte Version. In Wirklichkeit ist die Logik weitaus komplexer. In dieser Version gibt es nur zwei Regeln:

  1. Wenn es inputnur aus Kleinbuchstaben besteht, identifierstimmt ein mit dem inputnur überein, wenn es eine Aufteilung inputin Teilzeichenfolgen gibt, dass für jede Teilzeichenfolge ein Wort am identifierAnfang mit dieser Teilzeichenfolge in genau dieser Reihenfolge steht.

    Beispieleingabe: sbo

    Truthy Fällen: , , (UPDATE)SQLiteBindOrColumnIndexOutOfRangeExceptionSparseBooleanArray StringIndexOutOfBoundException

    Falsche Fälle: SeekBar(fehlt o), (das steht nicht am Anfang eines Wortes)StatusBarNotificationo

  2. Wenn inputGroßbuchstaben enthalten sind, inputmuss bei Anwendung von Regel 1 vor jedem Großbuchstaben eine Aufteilung vorgenommen werden.

    Beispieleingabe: sbO

    Wahrheitsfälle: SQLiteBindOrColumnIndexOutOfRangeException

    Falsche Fälle: (das muss am Anfang eines Wortes stehen), (falsche Reihenfolge)SparseBooleanArrayOStringIndexOutOfBoundException

I / O.

Eingabe : zwei Zeichenfolgen, eine für inputund eine für identifier. Sie können davon ausgehen , dass die Regex [A-Za-z]+Matches inputund die regex [A-Za-z0-9_]Matches identifier.

Ausgabe : einer der wahrheitsgemäßen oder falschen Werte. Sie können wählen, welcher Wert als wahr und was als falsch zurückgegeben werden soll, aber Ihre Wahl muss in allen Fällen konsistent sein. Zum Beispiel können Sie zurückkehren 1/0, true/false, π/eoder was auch immer, aber sie müssen das gleiche in allen Fällen bleiben.

Testfälle

Jede Zeile besteht aus zwei Zeichenfolgen, nämlich inputund identifier.

Wahrheitsfälle:

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

Falsche Fälle:

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

Gewinnkriterien

Dies ist ein , so dass der kürzeste Code jeder Sprache gewinnt. Standardlücken sind nicht zulässig.

Shieru Asakoto
quelle
1
so "SQLData", "SQLData"ist falsch?
14 m2
@ l4m2 Ja gemäß den vereinfachten Regeln. Ist "sqldata", "SQLData"jedoch wahr.
Shieru Asakoto
1
kann "sbo" "StringIndexOutOfBoundException"passen *S*tringIndexOutOf*Bo*undException?
TFeld
@TFeld Oh, ich habe einen Fehler in den Fällen gemacht, danke für die Erinnerung
Shieru Asakoto

Antworten:

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

Probieren Sie es online aus!

TFeld
quelle
0

JavaScript (ES6), 177 Byte

Erwartet (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))

Probieren Sie es online aus!

Arnauld
quelle