Memperpendek Paket Java

11

Pengarahan

Diberi nama Kelas / Paket Java yang Sepenuhnya Memenuhi Syarat, Anda harus menyingkatnya seperti:

Setiap bagian dari paket yang dipisahkan titik akan disingkat menjadi huruf pertama, terlepas dari bagian terakhir dan kelas (jika ada).

nama paket semua huruf kecil, dan kelas (jika ada) akan mulai dengan huruf kapital dan menjadi UpperCamelCase. paket datang dalam bentuk:

foo.bar.foo

dan

foo.bar.foo.Class

Contohnya

(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

Aturan

  • Kode terpendek dalam byte menang
  • Celah standar berlaku
Shaun Wild
sumber
1
Apakah nama kelas selalu yang terakhir?
Shaggy
@Shaggy ya itu
Shaun Wild
Terkait
Peter Taylor
Akan fantastic.foo.func.barmenjadi f.f.f.baratau apakah dijamin bahwa 2 paket tidak dapat dimulai dengan huruf yang sama?
Emigna
1
f.f.f.barakan benar.
Shaun Wild

Jawaban:

8

Retina , 17 byte

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

Cobalah online!

Penjelasan

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

Ini diganti dengan $1, yang merupakan periode dan huruf kecil yang tidak boleh dihapus.

Martin Ender
sumber
Saya ingin mencoba jawaban Retina pertama saya tetapi dewa Retina Martin muncul. Cara untuk pergi, Aku!
Matius Roh
4

JavaScript (ES6), 68 53 byte

s=>s.split`.`.map((x,y,z)=>z[y+1]>"["?x[0]:x).join`.`
  • 15 byte disimpan berkat Arnauld .

Lihat solusi saya yang lain di sini .


Cobalah

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>

Shaggy
sumber
1
Bisakah itu disederhanakan s=>s.split`.`.map((x,y,z)=>z[y+1]>"["?x[0]:x).join`.` ?
Arnauld
Sepertinya bisa, terima kasih, @Arnauld.
Shaggy
Solusi inovatif tetapi hanya 2 upvotes. Tapi saya akan mengungguli ini!
Arjun
2

Mathematica, 75 byte

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

Fungsi anonim. Mengambil string sebagai input dan mengembalikan string sebagai output.

LegionMammal978
sumber
JS mendapat skor lebih rendah dari, Mathematica ?! Itu tidak benar - saya telah melakukan sesuatu yang salah, bukan?
Shaggy
@Shaggy Java 7 mencetak skor lebih rendah dari JS dan Mathematica ?! Itu tidak benar - saya telah melakukan sesuatu yang salah, bukan? (Tidak dapat menahannya.;) Semua kredit jatuh ke port Retina MartinEnder btw).
Kevin Cruijssen
1
@KevinCruijssen, terima kasih telah menarik perhatian saya pada jawaban Martin - Saya sekarang telah memperbaiki masalah Java out-scoring JS! : D
Shaggy
2

Japt , 30 27 25 byte

¡Y>Zl -('[>ZgJ)-2?X:Xg}'.

Cobalah online!

Luke
sumber
Yang bagus! Saya pikir Anda dapat menyimpan dua byte dengan('[>ZgJ)
ETHproduksi
Saya baru menyadari itu juga ;-)
Luke
2

Python 2 , 88 81 byte

f=lambda s,d=".":s.count(d)>(s.split(d)[-1]<"[")and s[0]+d+f(s[s.find(d)+1:])or s

Cobalah online!

ovs
sumber
1

JavaScript (ES6), 36 byte

Port lain dari jawaban Retina Martin . Lihat solusi saya yang lain di sini .

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>

Shaggy
sumber
Solusi yang bagus tetapi tidak ada upvotes. Layak lebih dari skor 0. Saya akan mengubahnya menjadi 1! :)
Arjun
1

V , 9 byte

Í쓃…®õÀ!

Cobalah online!

Hexdump:

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

Ini adalah contoh yang indah dari tanda tangan V kompresi regex .

Penjelasan:

Í          " 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
James
sumber
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)

Cobalah online!

-8 dengan banyak terima kasih kepada @ovs untuk tipnya

ElPedro
sumber
for x in range(len(i)+~(i[-1][0]<"[")):i[x]=i[x][0]untuk -8
ovs
0

sed , 57 22 byte

Saya berharap solusi sed menjadi sedikit lebih pendek dari ini ...

Edit:

Solusi yang lebih pendek menggunakan regex dari jawaban Martin Ender .

Kode sumber 21 byte + 1 byte untuk -rflag (atau -Eflag untuk BSD sed).

s|\B\w+(\.[a-z])|\1|g
Maxim Mikhaylov
sumber
Tidak bisakah Anda juga menggunakan substitusi dari jawaban Retina saya? s|\B\w+(\.[a-z])|\1|g?
Martin Ender
@ MartinEnder Saya menghabiskan cukup banyak waktu untuk mencoba membuat satu-liner tanpa melihat jawaban siapa pun terlebih dahulu tetapi gagal. Saya tidak berpikir ada cara yang lebih pendek untuk melakukannya, jadi saya akan menggunakan milik Anda. Terima kasih!
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

Cobalah online! Penggunaan: f "some.string".

lexmem-parsing string sebagai token Haskell, jadi lex "some.string"kembali [("some",".string")]. fberulang atas token dalam string dan selalu menambahkan char pertama adari token saat ini, tetapi sisa ttoken hanya jika string yang tersisa setelah titik dua pdimulai dengan char huruf besar, yaitu x<'a'. Jika kecocokan pola gagal, kami telah mencapai token terakhir dan cukup kembali s.

Laikoni
sumber