ย่อแพ็คเกจ Java


11

การบรรยายสรุป

ด้วยชื่อ Java Class / Package ที่มีคุณสมบัติครบถ้วนคุณจะต้องย่อให้สั้นลงเช่น:

แต่ละส่วนของแพ็คเกจที่คั่นด้วยจุดจะถูกตัดให้สั้นลงเป็นอักษรตัวแรกนอกเหนือจากส่วนสุดท้ายและคลาส (ถ้ามี)

ชื่อแพ็กเกจจะเป็นตัวพิมพ์เล็กทั้งหมดและคลาส (ถ้ามี) จะเริ่มต้นด้วยอักษรตัวใหญ่และเป็น UpperCamelCase แพคเกจมาในรูปแบบของ:

foo.bar.foo

และ

foo.bar.foo.Class

ตัวอย่าง

(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

กฎระเบียบ

  • รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ
  • ช่องโหว่มาตรฐานใช้

1
ชื่อของชั้นเรียนมีความคงทนอยู่เสมอหรือไม่?
Shaggy

@Shaggy ใช่มันทำ
Shaun Wild


จะfantastic.foo.func.barกลายเป็นf.f.f.barหรือมันรับประกันว่า 2 แพคเกจไม่สามารถเริ่มต้นด้วยตัวอักษรเดียวกันได้หรือไม่
Emigna

1
f.f.f.barจะถูกต้อง
Shaun Wild

คำตอบ:


8

เรติน่า 17 ไบต์

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

ลองออนไลน์!

คำอธิบาย

\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.
)

นี้จะถูกแทนที่ด้วย$1ซึ่งเป็นระยะเวลาและตัวอักษรตัวพิมพ์เล็กซึ่งไม่ควรลบ


ฉันต้องการลองคำตอบ Retina ครั้งแรก แต่ Retina พระเจ้ามาร์ตินปรากฏตัวขึ้น ไปทางฉัน!
Matthew Roh

4

JavaScript (ES6), 68 53 ไบต์

s=>s.split`.`.map((x,y,z)=>z[y+1]>"["?x[0]:x).join`.`
  • 15 ไบต์บันทึกขอบคุณที่Arnauld

ดูวิธีการแก้ปัญหาอื่น ๆ ของฉันที่นี่


ลองมัน

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
มันง่ายที่จะs=>s.split`.`.map((x,y,z)=>z[y+1]>"["?x[0]:x).join`.` ?
Arnauld

ดูเหมือนว่าจะทำได้ขอบคุณ @Arnauld
Shaggy

วิธีแก้ปัญหาที่เป็นนวัตกรรม แต่เพียง 2 upvotes แต่ฉันจะโหวตขึ้นนี้!
Arjun

2

Mathematica, 75 ไบต์

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

ฟังก์ชั่นไม่ระบุชื่อ รับสตริงเป็นอินพุตและส่งคืนสตริงเป็นเอาต์พุต


JS ให้คะแนนต่ำกว่า Mathematica! มันไม่ถูกต้อง - ฉันทำอะไรผิดไปใช่มั้ย
Shaggy

@Shaggy Java 7 ให้คะแนนต่ำกว่า JS และ Mathematica! มันไม่ถูกต้อง - ฉันทำอะไรผิดไปใช่มั้ย (ไม่สามารถต้านทานได้;) เครดิตทั้งหมดไปที่พอร์ต Retina ของMartinEnder )
Kevin Cruijssen

1
@KevinCruijssen ขอบคุณที่ดึงความสนใจของฉันมาที่คำตอบของ Martin - ตอนนี้ฉันได้แก้ไขปัญหาของ Java out-score JS แล้ว! : D
Shaggy





1

JavaScript (ES6), 36 ไบต์

อีกคำตอบหนึ่งของจอประสาทตาของมาร์ติน ดูวิธีการแก้ปัญหาอื่น ๆ ของฉันที่นี่

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>


ทางออกที่ดี แต่ไม่มี upvotes มันสมควรมากกว่า 0 คะแนน ฉันจะเปลี่ยนเป็น 1! :)
Arjun

1

V , 9 ไบต์

Í쓃…®õÀ!

ลองออนไลน์!

hexdump:

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

นี้เป็นตัวอย่างที่ยอดเยี่ยมของลายเซ็น V ของการบีบอัด regex

คำอธิบาย:

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


0

sed , 57 22 ไบต์

ฉันคาดว่าทางแก้ปัญหาจะสั้นกว่านี้เล็กน้อย ...

แก้ไข:

โซลูชันที่สั้นกว่าใช้ regex จากคำตอบของ Martin Enderคำตอบที่มาร์ตินพลิก

ซอร์สโค้ด 21 ไบต์ + 1 ไบต์สำหรับ-rแฟล็ก (หรือ-Eตั้งค่าสถานะสำหรับ BSD sed)

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

คุณไม่สามารถใช้การทดแทนจากคำตอบ Retina ได้หรือไม่? s|\B\w+(\.[a-z])|\1|g?
Martin Ender

@MartinEnder ฉันใช้เวลาค่อนข้างนานในการลองใช้งานสายการบินเดียวโดยไม่ต้องดูคำตอบของใครก่อน แต่ล้มเหลว ฉันไม่คิดว่าจะมีวิธีที่สั้นกว่าในการทำดังนั้นฉันจะใช้ของคุณ ขอบคุณ!
Maxim Mikhaylov

0

Haskell , 58 ไบต์

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

ลองออนไลน์! การใช้งาน: f "some.string".

lex แยกสตริงเป็นโทเค็น Haskell ดังนั้น lex "some.string"[("some",".string")]ผลตอบแทน frecurses กว่าราชสกุลในสตริงและมักจะผนวกถ่านแรก aของโทเค็นปัจจุบัน แต่ส่วนที่เหลือtของโทเค็นเฉพาะในกรณีที่สตริงที่เหลืออยู่หลังจากลำไส้ใหญ่เริ่มต้นด้วยถ่านพิมพ์ใหญ่ที่เป็นp หากการแข่งขันรูปแบบล้มเหลวที่เราได้มาถึงสุดท้ายโทเค็นและก็กลับมาx<'a's

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.