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.