Có nên đề xuất định danh này?


8

Giới thiệu

Trong Android Studio và các IDE khác, có các mã hoàn thành để hỗ trợ chèn mã hiệu quả (đặc biệt là khi tên của các lớp hoặc phương thức quá dài), giống như tên trong hình bên dưới.

nhập mô tả hình ảnh ở đây

Có một số logic khác nhau được sử dụng giữa các IDE để xác định các lớp, phương thức và biến nào cần đề xuất, nhưng mặt khác là phổ biến: nhập các chữ cái ban đầu của mỗi từ và định danh khớp với các chữ cái ban đầu đó sẽ được đề xuất.

Thử thách

Trong thử thách này, hãy viết một chương trình hoặc hàm nhận hai chuỗi, cụ thể inputidentifier, xác định xem các chuỗi có identifierkhớp với hay không input.

Chúng tôi chia identifierthành các từ trong đó:

  • một chữ cái viết thường được theo sau bởi một chữ cái viết hoa ( "SplitHere" -> "Split", "Here"),
  • một chữ cái viết hoa được theo sau bởi một chữ cái viết hoa và một chữ cái viết thường ( "SPLITHere" -> "SPLIT", "Here"), hoặc
  • có một số hoặc một dấu gạch dưới _( "SPLIT_HERE" -> "SPLIT", "HERE").

Nếu điều này vẫn chưa đủ rõ ràng, đây là regex đại diện cho điều kiện để phân chia : (?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|[_0-9]. Sau đây là một vài ví dụ:

  • theWord_Example, Trong đó có 3 chữ ( the, Word, Example) có thể được tìm thấy.
  • THEWORD2EXAMPLE, trong đó chỉ có thể tìm thấy 2 từ ( THEWORD, EXAMPLE) (vì THEWORDlà một chữ cái viết hoa và cũng vậy EXAMPLE).
  • THEWordEXAMPLE3, Trong đó có 3 chữ ( THE, Word, Example) có thể được tìm thấy ( Wordđược coi là một từ riêng biệt ở đây).
  • THEWORDEXAMPLEFOUR, trong đó chỉ THEWORDEXAMPLEFOURcó thể tìm thấy 1 từ ( ) (toàn bộ dòng chữ in hoa).

Đối với mục đích này ở đây, chúng tôi sử dụng một phiên bản đơn giản hóa. Trong thực tế logic phức tạp hơn nhiều. Trong phiên bản này chỉ có hai quy tắc:

  1. Nếu chỉ inputbao gồm các chữ cái viết thường, thì chỉ identifierkhớp với inputnếu có sự phân tách inputthành các chuỗi con, mà đối với mỗi chuỗi con có một từ trong chuỗi identifierbắt đầu với chuỗi con đó, theo thứ tự chính xác đó.

    Ví dụ đầu vào: sbo

    Trường hợp Truthy: , , (UPDATE)SQLiteBindOrColumnIndexOutOfRangeExceptionSparseBooleanArray StringIndexOutOfBoundException

    Các trường hợp giả mạo: SeekBar(thiếu o), ( không phải ở đầu từ)StatusBarNotificationo

  2. Nếu inputchứa các chữ cái viết hoa, thì một phân chia trên inputphải được thực hiện trước mỗi chữ cái viết hoa khi áp dụng Quy tắc 1.

    Ví dụ đầu vào: sbO

    Trường hợp thật SQLiteBindOrColumnIndexOutOfRangeException

    Các trường hợp giả mạo: ( phải xuất hiện ở đầu từ), (sai thứ tự)SparseBooleanArrayOStringIndexOutOfBoundException

Tôi / O

Đầu vào : hai chuỗi, một cho inputvà một cho identifier. Bạn có thể giả định rằng regex [A-Za-z]+khớp inputvà regex [A-Za-z0-9_]khớp identifier.

Đầu ra : một trong những giá trị trung thực hoặc giả. Bạn có thể chọn giá trị nào để trả về là trung thực và giá trị giả, nhưng lựa chọn của bạn phải nhất quán trong tất cả các trường hợp. Ví dụ, bạn có thể trở lại 1/0, true/false, π/ehoặc bất cứ điều gì, nhưng họ phải giữ nguyên trên tất cả các trường hợp.

Các trường hợp thử nghiệm

Mỗi dòng bao gồm hai chuỗi, cụ thể inputidentifiertương ứng.

Trường hợp thật

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

Trường hợp giả

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

Tiêu chí chiến thắng

Đây là một , vì vậy mã ngắn nhất của mỗi ngôn ngữ sẽ thắng. Lỗ hổng mặc định không được phép.


1
vậy "SQLData", "SQLData"là sai?
l4m2

@ l4m2 Có theo quy tắc đơn giản hóa. Tuy nhiên "sqldata", "SQLData"là sự thật.
Shieru Asakoto

1
có thể "sbo" "StringIndexOutOfBoundException"phù hợp *S*tringIndexOutOf*Bo*undException?
TFeld

@TFeld Oh tôi đã mắc lỗi trong các trường hợp, cảm ơn vì đã nhắc nhở
Shieru Asakoto

Câu trả lời:


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

Hãy thử trực tuyến!


0

JavaScript (ES6), 177 byte

Mong đợi (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))

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.