Rút ngắn gói Java


11

Cuộc họp

Đưa ra một tên Gói / Lớp Java đủ điều kiện, bạn phải rút ngắn nó như sau:

Mỗi phần của gói được phân tách bằng dấu chấm sẽ được rút ngắn thành chữ cái đầu tiên, ngoài phần cuối cùng và lớp (nếu nó tồn tại).

tên gói sẽ là tất cả chữ thường và lớp (nếu nó tồn tại) sẽ bắt đầu bằng chữ in hoa và là UpperCamelCase. gói đến dưới dạng:

foo.bar.foo

foo.bar.foo.Class

Ví dụ

(No Class)
Input com.stackoverflow.main
Output c.s.main

(Class)
Input com.google.parser.Gson
Output c.g.parser.Gson

(Class)
Input com.google.longer.package.TestClass
Output c.g.l.package.TestClass

Quy tắc

  • Mã ngắn nhất tính bằng byte thắng
  • Áp dụng sơ hở tiêu chuẩn

1
Có phải tên lớp luôn luôn đến cuối cùng?
Xù xì

@Shaggy đúng vậy
Shaun Wild


Sẽ fantastic.foo.func.bartrở thành f.f.f.barhoặc được đảm bảo rằng 2 gói không thể bắt đầu bằng cùng một chữ cái?
Emigna

1
f.f.f.barsẽ đúng
Shaun Wild

Câu trả lời:


8

Võng mạc , 17 byte

\B\w+(\.[a-z])
$1

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

Giải trình

\B         # Start from a position that isn't a word boundary. This ensures that
           # the first letter of the package name is skipped.
\w+        # Match one or more word characters. This is the remainder of the
           # package name which we want to remove.
(          # Capture the next part in group 1, because we want to keep it...
  \.[a-z]  #   Match a period and a lower-case letter. This ensures that we
           #   don't match the package that precedes the class, or the package or
           #   class at the end of the input.
)

Điều này được thay thế bằng $1, đó là khoảng thời gian và chữ thường không nên xóa.


Tôi muốn thử câu trả lời Retina đầu tiên của mình nhưng vị thần Retina Martin đã xuất hiện. Con đường để đi, tôi!
Matthew Roh

4

JavaScript (ES6), 68 53 byte

s=>s.split`.`.map((x,y,z)=>z[y+1]>"["?x[0]:x).join`.`
  • 15 byte được lưu nhờ Arnauld .

Xem giải pháp khác của tôi ở đây .


Thử nó

f=
s=>s.split`.`.map((x,y,z)=>z[y+1]>"["?x[0]:x).join`.`
i.addEventListener("input",_=>o.innerText=f(i.value))
console.log(f("com.stackoverflow.main"))
console.log(f("c.g.parser.Gson"))
console.log(f("com.google.longer.package.TestClass"))
<input id=i><pre id=o>


1
Nó có thể được đơn giản hóa để s=>s.split`.`.map((x,y,z)=>z[y+1]>"["?x[0]:x).join`.` ?
Arnauld

Có vẻ như nó có thể, cảm ơn, @Arnauld.
Xù xì

Giải pháp sáng tạo nhưng chỉ có 2 upvote. Nhưng tôi sẽ nâng cao điều này!
Arjun

2

Toán học, 75 byte

#[[;;-3]]~StringTake~1~Join~#[[-2;;]]~StringRiffle~"."&[#~StringSplit~"."]&

Chức năng ẩn danh. Lấy một chuỗi làm đầu vào và trả về một chuỗi là đầu ra.


Điểm số thấp hơn so với, Mathicala?! Điều đó không thể đúng - Tôi đã làm điều gì sai, phải không?
Xù xì

@Shaggy Java 7 đạt điểm thấp hơn so với JS và Mathicala?! Điều đó không thể đúng - Tôi đã làm điều gì sai, phải không? (Không thể cưỡng lại được .;) Tất cả tín dụng được chuyển đến cổng Retina của MartinEnder btw).
Kevin Cruijssen

1
@KevinCruijssen, cảm ơn vì đã thu hút sự chú ý của tôi đến câu trả lời của Martin - Bây giờ tôi đã khắc phục vấn đề về việc chấm điểm Java! : D
Xù xì





1

JavaScript (ES6), 36 byte

Một cổng khác của câu trả lời Retina của Martin . Xem giải pháp khác của tôi ở đây .

s=>s.replace(/\B\w+(\.[a-z])/g,"$1")

f=
s=>s.replace(/\B\w+(\.[a-z])/g,"$1")
i.addEventListener("input",_=>o.innerText=f(i.value))
console.log(f("com.stackoverflow.main"))
console.log(f("c.g.parser.Gson"))
console.log(f("com.google.longer.package.TestClass"))
<input id=i><pre id=o>


Một giải pháp tốt nhưng không có upvote. Nó xứng đáng nhiều hơn 0 điểm. Tôi sẽ biến nó thành 1! :)
Arjun

1

V , 9 byte

Í쓃…®õÀ!

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

Hexdump:

00000000: cdec 9383 85ae f5c0 21                   ........!

Đây là một ví dụ tuyệt vời của chữ ký V nén regex .

Giải trình:

Í          " Remove every match on every line:
 ì         " A lower case letter
  “ …      "   *ONLY MATCH THIS PART:*
   ƒ       "   As few characters as possible
      ®    " Followed by a dot
       õÀ! " Not followed by an uppercase letter

1

Python 2 , 108 97 89 byte

i=input().split(".")
for x in range(len(i)+~(i[-1][0]<"[")):i[x]=i[x][0]
print".".join(i)

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

-8 với nhiều lời cảm ơn đến @ovs cho tiền boa


for x in range(len(i)+~(i[-1][0]<"[")):i[x]=i[x][0]cho -8
OVS

0

sed , 57 22 byte

Tôi dự kiến ​​giải pháp sed sẽ ngắn hơn một chút so với ...

Biên tập:

Giải pháp ngắn hơn sử dụng regex từ câu trả lời của Martin Ender .

21 byte sourcecode + 1 byte cho -rcờ (hoặc -Ecờ cho BSD sed).

s|\B\w+(\.[a-z])|\1|g

Bạn cũng có thể sử dụng thay thế từ câu trả lời Retina của tôi? s|\B\w+(\.[a-z])|\1|g?
Martin Ender

@MartinEnder Tôi đã dành khá nhiều thời gian để cố gắng đưa ra một lớp lót mà không xem câu trả lời của ai trước nhưng không thành công. Tôi không nghĩ có một cách ngắn hơn để làm điều đó, vì vậy tôi sẽ sử dụng của bạn. Cảm ơn bạn!
Maxim Mikhaylov

0

Haskell , 58 byte

f s|[(a:t,p:x:r)]<-lex s=a:concat[t|x<'a']++p:f(x:r)|1<3=s

Hãy thử trực tuyến! Cách sử dụng : f "some.string".

lexphân tích một chuỗi dưới dạng mã thông báo Haskell, do đó lex "some.string"trả về [("some",".string")]. fđệ quy trên các mã thông báo trong chuỗi và luôn nối thêm char đầu tiên acủa mã thông báo hiện tại, nhưng phần còn lại tcủa mã thông báo nếu chuỗi còn lại sau dấu hai chấm pbắt đầu bằng char chữ hoa, nghĩa là x<'a'. Nếu khớp mẫu không thành công, chúng tôi đã đạt được mã thông báo cuối cùng và chỉ cần trả lại s.

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.