Kürzen Sie das Java-Paket


11

Einweisung

Wenn Sie einen vollständig qualifizierten Java-Klassen- / Paketnamen angeben, müssen Sie ihn als solchen kürzen:

Jeder Teil des durch Punkte getrennten Pakets wird auf den ersten Buchstaben gekürzt, abgesehen vom letzten Abschnitt und der Klasse (falls vorhanden).

Paketnamen werden alle in Kleinbuchstaben geschrieben, und die Klasse (falls vorhanden) beginnt mit einem Großbuchstaben und lautet UpperCamelCase. Pakete kommen in Form von:

foo.bar.foo

und

foo.bar.foo.Class

Beispiele

(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

Regeln

  • Der kürzeste Code in Bytes gewinnt
  • Es gelten Standardlücken

1
Kommt der Klassenname immer zuletzt?
Shaggy

@ Shaggy ja, das tut es
Shaun Wild


Würde fantastic.foo.func.barworden f.f.f.baroder ist sichergestellt , dass zwei Pakete nicht mit dem gleichen Buchstaben beginnen?
Emigna

1
f.f.f.barwäre richtig.
Shaun Wild

Antworten:


8

Netzhaut , 17 Bytes

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

Probieren Sie es online aus!

Erläuterung

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

Dies wird durch $1den Punkt und den Kleinbuchstaben ersetzt , die nicht entfernt werden sollten.


Ich wollte meine erste Retina-Antwort versuchen, aber der Retina-Gott Martin tauchte auf. Gut gemacht, ich!
Matthew Roh

4

JavaScript (ES6), 68 53 Byte

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

Sehen Sie meine andere Lösung hier .


Versuch es

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
Könnte es vereinfacht werden s=>s.split`.`.map((x,y,z)=>z[y+1]>"["?x[0]:x).join`.` ?
Arnauld

Scheint so, danke @Arnauld.
Shaggy

Innovative Lösung, aber nur 2 positive Stimmen. Aber ich werde das positiv bewerten!
Arjun

2

Mathematica, 75 Bytes

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

Anonyme Funktion. Nimmt eine Zeichenfolge als Eingabe und gibt eine Zeichenfolge als Ausgabe zurück.


JS erzielt weniger Punkte als Mathematica?! Das kann nicht richtig sein - ich habe etwas falsch gemacht, oder?
Shaggy

@Shaggy Java 7 erzielt weniger Punkte als JS und Mathematica?! Das kann nicht richtig sein - ich habe etwas falsch gemacht, oder? (Konnte nicht widerstehen .;) Alle Kredite gehen übrigens an MartinEnders Retina-Hafen.
Kevin Cruijssen

1
@ KevinCruijssen, danke, dass Sie mich auf Martins Antwort aufmerksam gemacht haben - ich habe jetzt das Problem behoben, dass Java JS übertrifft! : D
Shaggy





1

JavaScript (ES6), 36 Byte

Ein weiterer Hafen von Martins Retina-Antwort . Sehen Sie meine andere Lösung hier .

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>


Eine gute Lösung, aber keine Gegenstimmen. Es verdient mehr als 0 Punkte. Ich werde es in 1 verwandeln! :)
Arjun

1

V , 9 Bytes

Í쓃…®õÀ!

Probieren Sie es online aus!

Hexdump:

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

Dies ist ein wunderbares Beispiel für V Unterschrift regex Kompression .

Erläuterung:

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

Ich habe erwartet, dass die sed-Lösung etwas kürzer ist ...

Bearbeiten:

Die kürzere Lösung verwendet Regex aus Martin Enders Antwort .

21 Bytes Quellcode + 1 Byte für -rFlag (oder -EFlag für BSD sed).

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

Können Sie nicht auch die Substitution aus meiner Retina-Antwort verwenden? s|\B\w+(\.[a-z])|\1|g?
Martin Ender

@MartinEnder Ich habe einige Zeit damit verbracht, einen Einzeiler zu entwickeln, ohne zuerst die Antworten von irgendjemandem zu lesen, bin aber gescheitert. Ich glaube nicht, dass es einen kürzeren Weg gibt, also werde ich Ihren verwenden. Vielen Dank!
Maxim Mikhaylov

0

Haskell , 58 Bytes

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

Probieren Sie es online aus! Verwendung : f "some.string".

lexanalysiert eine Zeichenfolge als Haskell-Token und lex "some.string"kehrt daher zurück [("some",".string")]. frekursiv über die Token in der Zeichenfolge und hängt immer das erste aZeichen des aktuellen Tokens an, den Rest tdes Tokens jedoch nur, wenn die verbleibende Zeichenfolge nach dem Doppelpunkt pmit einem Großbuchstaben beginnt x<'a'. Wenn die Musterübereinstimmung fehlgeschlagen ist, haben wir das letzte Token erreicht und kehren einfach zurück s.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.