Java Paketini Kısaltın


11

Bilgilendirme

Tam Nitelikli Java Sınıfı / Paket adı verildiğinde, bu şekilde kısaltmanız gerekir:

Noktadan ayrılmış paketin her bir parçası, son bölüm ve sınıf dışında (varsa) ilk harfine kısaltılır.

paket adlarının tamamı küçük olacak ve sınıf (varsa) büyük harfle başlayacak ve UpperCamelCase olacaktır. paketler şu şekilde gelir:

foo.bar.foo

ve

foo.bar.foo.Class

Örnekler

(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

kurallar

  • Bayt cinsinden en kısa kod kazanır
  • Standart boşluklar geçerlidir

1
Sınıf adı her zaman en sonuncusu mu?
Shaggy

@Shaggy evet öyle
Shaun Wild


2 paketin aynı harfle başlayamayacağı garanti mi fantastic.foo.func.barolacaktı f.f.f.bar?
Emigna

1
f.f.f.bardoğru olur.
Shaun Wild

Yanıtlar:


8

Retina , 17 bayt

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

Çevrimiçi deneyin!

açıklama

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

Bu, $1kaldırılmaması gereken nokta ve küçük harf olan değiştirilir.


İlk Retina cevabımı denemek istedim ama Retina tanrısı Martin geldi. Gidilecek yol, Ben!
Matthew Roh

4

JavaScript (ES6), 68 53 bayt

s=>s.split`.`.map((x,y,z)=>z[y+1]>"["?x[0]:x).join`.`
  • Arnauld sayesinde 15 bayt tasarruf etti .

Diğer çözümümü burada görebilirsiniz .


Dene

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
Basitleştirilebilir s=>s.split`.`.map((x,y,z)=>z[y+1]>"["?x[0]:x).join`.` mi?
Arnauld

Olabilir gibi görünüyor, teşekkürler, @Arnauld.
Shaggy

Yenilikçi bir çözüm ama sadece 2 oy. Ama ben bunu onaylayacağım!
Arjun

2

Mathematica, 75 bayt

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

Anonim işlev. Bir dizeyi girdi olarak alır ve bir dizeyi çıktı olarak döndürür.


JS, Mathematica'dan daha mı düşük ?! Bu doğru olamaz - yanlış bir şey yaptım, değil mi?
Shaggy

@Shaggy Java 7, JS ve Mathematica'dan daha mı düşük ?! Bu doğru olamaz - yanlış bir şey yaptım, değil mi? (Karşı koyamadım.) Tüm kredi MartinEnder Retina'nın limanına gider .
Kevin Cruijssen

1
@KevinCruijssen, dikkatimi Martin'in cevabına çektiğiniz için teşekkürler - Artık Java puanlama JS sorununu çözdüm! : D
Shaggy





1

JavaScript (ES6), 36 bayt

Martin Retina'nın başka bir limanı cevap verdi . Diğer çözümümü burada görebilirsiniz .

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>


İyi bir çözüm ama upvotes yok. 0'dan fazla puanı hak eder. Onu 1'e çevireceğim! :)
Arjun

1

V , 9 bayt

Í쓃…®õÀ!

Çevrimiçi deneyin!

HexDump:

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

Bu, V'nin imzalı normal ifade sıkıştırmasının harika bir örneğidir .

Açıklama:

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

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

Çevrimiçi deneyin!

@Ovs bahşiş için çok teşekkürler -8


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

0

sed , 57 22 bayt

Sed çözümünün bundan biraz daha kısa olmasını bekliyordum ...

Düzenle:

Daha kısa çözüm, Martin Ender'in cevabından normal ifadeyi kullanır .

21 bayt kaynak kodu + bayrak için 1 bayt -r(veya -EBSD sed için bayrak ).

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

Retina cevabımdaki değişikliği de kullanamaz mısınız? s|\B\w+(\.[a-z])|\1|g?
Martin Ender

@MartinEnder İlk önce kimsenin cevaplarına bakmadan bir astar bulmak için biraz zaman harcadım ama başarısız oldum. Bunu yapmanın daha kısa bir yolu olduğunu sanmıyorum, bu yüzden seninkini kullanacağım. Teşekkür ederim!
Maxim Mikhaylov

0

Haskell , 58 bayt

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

Çevrimiçi deneyin! Kullanımı: f "some.string".

lexbir dizeyi Haskell jetonları olarak ayrıştırır, dolayısıyla lex "some.string"geri döner [("some",".string")]. fdizedeki jetonları geri alır ve her zaman ageçerli jetonun ilk karakterini ekler , ancak jetonun geri kalanını tyalnızca iki nokta üst üste pbir büyük karakterle başlıyorsa, diğer bir karakterle başlar x<'a'. Kalıp eşleşmesi başarısız olursa, son jetona ulaştık ve geri dönelim s.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.