Haruskah pengidentifikasi ini disarankan?

8

pengantar

Di Android Studio dan IDE lain ada pelengkapan kode untuk membantu penyisipan kode yang efisien (terutama ketika nama-nama kelas atau metode sangat verbose), seperti yang ada pada gambar di bawah ini.

masukkan deskripsi gambar di sini

Ada beberapa logika berbeda yang digunakan antara IDE untuk menentukan kelas, metode, dan variabel apa yang disarankan, tetapi sebaliknya umum: mengetikkan huruf awal dari setiap kata, dan pengidentifikasi yang cocok dengan huruf-huruf awal tersebut akan disarankan.

Tantangan

Dalam tantangan ini, tulis sebuah program atau fungsi yang menerima dua string, yaitu inputdan identifier, tentukan apakah identifiercocok input.

Kami membagi identifierkata-kata di mana:

  • huruf kecil diikuti oleh huruf besar ( "SplitHere" -> "Split", "Here"),
  • huruf besar diikuti oleh huruf besar dan kecil ( "SPLITHere" -> "SPLIT", "Here"), atau
  • ada angka atau garis bawah _( "SPLIT_HERE" -> "SPLIT", "HERE").

Jika ini masih tidak cukup jelas, di sini adalah regex mewakili kondisi perpecahan: (?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|[_0-9]. Berikut beberapa contoh:

  • theWord_Example, Di mana 3 kata ( the, Word, Example) dapat ditemukan.
  • THEWORD2EXAMPLE, di mana hanya 2 kata ( THEWORD, EXAMPLE) dapat ditemukan (karena THEWORDmerupakan huruf besar dan begitu juga EXAMPLE).
  • THEWordEXAMPLE3, Di mana 3 kata ( THE, Word, Example) dapat ditemukan ( Worddianggap kata terpisah di sini).
  • THEWORDEXAMPLEFOUR, di mana hanya 1 kata ( THEWORDEXAMPLEFOUR) dapat ditemukan (seluruh huruf besar).

Untuk tujuan ini di sini kami menggunakan versi yang disederhanakan. Pada kenyataannya, logikanya jauh lebih kompleks. Dalam versi ini hanya ada dua aturan:

  1. Jika inputhanya terdiri dari huruf kecil, maka identifiercocok dengan inputhanya jika ada pemisahan inputmenjadi substring, bahwa untuk setiap substring ada kata dalam identifierawal dengan substring itu, dalam urutan yang tepat.

    Input contoh: sbo

    Kasus truthy: , , (UPDATE)SQLiteBindOrColumnIndexOutOfRangeExceptionSparseBooleanArray StringIndexOutOfBoundException

    Kasus palsu: SeekBar(hilang o), ( bukan di awal kata)StatusBarNotificationo

  2. Jika inputberisi huruf besar, maka perpecahan pada inputharus dilakukan sebelum setiap huruf besar saat menerapkan Aturan 1.

    Input contoh: sbO

    Kasus kebenaran: SQLiteBindOrColumnIndexOutOfRangeException

    Kasus palsu: ( harus muncul di awal kata), (urutan salah)SparseBooleanArrayOStringIndexOutOfBoundException

I / O

Input : dua string, satu untuk inputdan satu untuk identifier. Anda dapat mengasumsikan bahwa regex [A-Za-z]+cocok inputdan regex [A-Za-z0-9_]cocok identifier.

Output : salah satu nilai truey atau falsy. Anda dapat memilih nilai apa yang akan dikembalikan sebagai benar dan salah, tetapi pilihan Anda harus konsisten di semua kasus. Misalnya Anda dapat kembali 1/0, true/false, π/eatau apa pun, tetapi mereka harus tetap sama di semua kasus.

Uji kasus

Setiap baris terdiri dari dua string, yaitu inputdan identifiermasing - masing.

Kasus kebenaran:

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

Kasus palsu:

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

Kriteria Menang

Ini adalah , sehingga kode terpendek dari setiap bahasa menang. Celah default tidak diizinkan.

Shieru Asakoto
sumber
1
jadi "SQLData", "SQLData"adalah palsu?
14m2
@ l4m2 Ya sesuai aturan yang disederhanakan. Namun "sqldata", "SQLData"itu benar.
Shieru Asakoto
1
bisa "sbo" "StringIndexOutOfBoundException"cocok *S*tringIndexOutOf*Bo*undException?
TFeld
@Tfeld Oh saya membuat kesalahan pada kasus-kasus, terima kasih sudah mengingatkan
Shieru Asakoto

Jawaban:

1

Python 2 , 239 227 byte

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

Cobalah online!

TFeld
sumber
0

JavaScript (ES6), 177 byte

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

Cobalah online!

Arnauld
sumber