Ridurre il pacchetto Java


11

Riunione

Dato un nome di classe / pacchetto Java pienamente qualificato, è necessario accorciarlo in quanto tale:

Ogni parte del pacchetto separato da punti verrà accorciata alla sua prima lettera, a parte l'ultima sezione e la classe (se esiste).

i nomi dei pacchetti saranno tutti in minuscolo e la classe (se esiste) inizierà con una lettera maiuscola e sarà UpperCamelCase. i pacchetti si presentano sotto forma di:

foo.bar.foo

e

foo.bar.foo.Class

Esempi

(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

Regole

  • Vince il codice più breve in byte
  • Si applicano scappatoie standard

1
Il nome della classe viene sempre per ultimo?
Shaggy,

@Shaggy sì, lo fa
Shaun Wild


Sarebbe fantastic.foo.func.bardiventato f.f.f.baro è garantito che 2 pacchetti non possono iniziare con la stessa lettera?
Emigna,

1
f.f.f.barsarebbe corretto.
Shaun Wild,

Risposte:


8

Retina , 17 byte

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

Provalo online!

Spiegazione

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

Questo è sostituito da $1, che è il punto e la lettera minuscola che non devono essere rimossi.


Volevo provare la mia prima risposta Retina, ma il dio Retina Martin si è presentato. Ben fatto, io!
Matthew Roh,

4

JavaScript (ES6), 68 53 byte

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

Vedi la mia altra soluzione qui .


Provalo

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

Sembra che possa, grazie, @Arnauld.
Shaggy,

Soluzione innovativa ma solo 2 voti. Ma valuterò questo!
Arjun,

2

Mathematica, 75 byte

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

Funzione anonima. Accetta una stringa come input e restituisce una stringa come output.


Punteggio JS inferiore a, Mathematica ?! Non può essere giusto - ho fatto qualcosa di sbagliato, no?
Shaggy,

@Shaggy Java 7 con un punteggio inferiore a JS e Mathematica ?! Non può essere giusto - ho fatto qualcosa di sbagliato, no? (Non potevo resistere.;) Tutto il merito va al porto Retina di MartinEnder tra l'altro).
Kevin Cruijssen,

1
@KevinCruijssen, grazie per aver attirato la mia attenzione sulla risposta di Martin: ora ho risolto il problema del superamento del punteggio di JS in Java! : D
Shaggy,





1

JavaScript (ES6), 36 byte

Un altro porto della risposta Retina di Martin . Vedi la mia altra soluzione qui .

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>


Una buona soluzione ma nessun voto. Merita più di un punteggio di 0. Lo trasformerò in 1! :)
Arjun,

1

V , 9 byte

Í쓃…®õÀ!

Provalo online!

hexdump:

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

Questo è un meraviglioso esempio della firma del V compressione regex .

Spiegazione:

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

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

Provalo online!

-8 con molte grazie a @ovs per l'informazione


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

0

sed , 57 22 byte

Mi aspettavo che la soluzione sed fosse un po 'più corta di questa ...

Modificare:

La soluzione più breve utilizza regex dalla risposta di Martin Ender .

21 byte codice sorgente + 1 byte per -rflag (o -Eflag per BSD sed).

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

Non puoi usare anche la sostituzione dalla mia risposta Retina? s|\B\w+(\.[a-z])|\1|g?
Martin Ender,

@MartinEnder Ho passato un bel po 'di tempo a cercare di creare una riga senza prima guardare le risposte di nessuno ma non ci sono riuscito. Non penso che ci sia un modo più breve per farlo, quindi userò il tuo. Grazie!
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

Provalo online! Uso: f "some.string".

lexanalizza una stringa come token Haskell, quindi lex "some.string"ritorna [("some",".string")]. fricorre sui token nella stringa e aggiunge sempre il primo carattere adel token corrente, ma il resto tdel token solo se la stringa rimanente dopo i due punti pinizia con un carattere maiuscolo, ovvero x<'a'. Se la corrispondenza del modello fallisce, abbiamo raggiunto l'ultimo token e semplicemente ritorniamo s.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.