Skróć pakiet Java


11

Odprawa

Biorąc pod uwagę w pełni kwalifikowaną nazwę klasy / pakietu Java, należy ją tak skrócić:

Każda część pakietu oddzielonego kropkami zostanie skrócona do pierwszej litery, z wyjątkiem ostatniej sekcji i klasy (jeśli istnieje).

nazwy pakietów będą pisane małymi literami, a klasa (jeśli istnieje) rozpocznie się od dużej litery i będzie UpperCamelCase. pakiety są w formie:

foo.bar.foo

i

foo.bar.foo.Class

Przykłady

(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

Zasady

  • Najkrótszy kod w bajtach wygrywa
  • Obowiązują standardowe luki

1
Czy nazwa klasy zawsze pojawia się na końcu?
Kudłaty

@ Shaggy tak to robi
Shaun Wild


Czy fantastic.foo.func.barstałoby się, f.f.f.barczy jest gwarantowane, że 2 paczki nie mogą zaczynać się od tej samej litery?
Emigna

1
f.f.f.barbyłoby poprawne.
Shaun Wild,

Odpowiedzi:


8

Siatkówka , 17 bajtów

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

Wypróbuj online!

Wyjaśnienie

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

Jest to zamienione na $1, czyli kropkę i małą literę, których nie należy usuwać.


Chciałem spróbować mojej pierwszej odpowiedzi na siatkówkę, ale pojawił się bóg siatkówki, Martin. Dobra droga, ja!
Matthew Roh,

4

JavaScript (ES6), 68 53 bajtów

s=>s.split`.`.map((x,y,z)=>z[y+1]>"["?x[0]:x).join`.`

Zobacz moje inne rozwiązanie tutaj .


Spróbuj

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
Czy można to uprościć s=>s.split`.`.map((x,y,z)=>z[y+1]>"["?x[0]:x).join`.` ?
Arnauld

Wygląda na to, że może, dzięki, @Arnauld.
Kudłaty

Innowacyjne rozwiązanie, ale tylko 2 głosy poparcia. Ale będę to głosować!
Arjun

2

Mathematica, 75 bajtów

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

Funkcja anonimowa. Pobiera ciąg jako dane wejściowe i zwraca ciąg jako dane wyjściowe.


Wynik JS niższy niż, Mathematica ?! To nie może być prawda - zrobiłem coś złego, prawda?
Kudłaty

@Shaggy Java 7 punktacja niższa niż JS i Mathematica ?! To nie może być prawda - zrobiłem coś złego, prawda? (Nie mogłem się oprzeć.;) Całe uznanie należy do portu Retina w MartinEnder ).
Kevin Cruijssen

1
@KevinCruijssen, dziękuję za zwrócenie mojej uwagi na odpowiedź Martina - naprawiłem problem JS-a! : D
Shaggy





1

JavaScript (ES6), 36 bajtów

Kolejny port odpowiedzi Martina Retina . Zobacz moje inne rozwiązanie tutaj .

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>


Dobre rozwiązanie, ale brak pozytywnych opinii. Zasługuje na więcej niż 0 punktów. Zamienię to w 1! :)
Arjun

1

V , 9 bajtów

Í쓃…®õÀ!

Wypróbuj online!

Hexdump:

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

Jest to wspaniały przykład podpis V za kompresji regex .

Wyjaśnienie:

Í          " 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 bajtów

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

Wypróbuj online!

-8 z wieloma podziękowaniami dla @ovs za wskazówkę


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

0

sed , 57 22 bajtów

Spodziewałem się, że rozwiązanie sed będzie trochę krótsze niż to ...

Edytować:

Krótsze rozwiązanie wykorzystuje wyrażenie regularne z odpowiedzi Martina Endera .

21 bajtów kod źródłowy + 1 bajt dla -rflagi (lub -Eflaga dla BSD sed).

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

Nie możesz również użyć substytucji z mojej odpowiedzi Retina? s|\B\w+(\.[a-z])|\1|g?
Martin Ender

@MartinEnder Spędziłem sporo czasu próbując wymyślić jedną linijkę, nie patrząc najpierw na czyjeś odpowiedzi, ale zawiodłem. Nie sądzę, że istnieje krótszy sposób, aby to zrobić, więc użyję twojego. Dziękuję Ci!
Maxim Mikhaylov,

0

Haskell , 58 bajtów

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

Wypróbuj online! Zastosowanie: f "some.string".

lexanalizuje ciąg jako tokeny Haskell, więc lex "some.string"zwraca [("some",".string")]. fpowtarza się nad tokenami w ciągu i zawsze dołącza pierwszy znak abieżącego tokena, ale resztę ttokena tylko wtedy, gdy pozostały ciąg po dwukropku pzaczyna się od dużej litery, to znaczy x<'a'. Jeśli dopasowanie wzorca nie powiodło się, osiągnęliśmy ostatni token i po prostu wróciliśmy s.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.