Encurte o pacote Java

11

Briefing

Dado um nome de classe / pacote Java totalmente qualificado, você deve abreviá-lo da seguinte forma:

Cada parte do pacote separado por pontos será reduzida para a primeira letra, além da última seção e da classe (se existir).

os nomes dos pacotes serão todos minúsculos e a classe (se existir) começará com uma letra maiúscula e será UpperCamelCase. pacotes vêm na forma de:

foo.bar.foo

e

foo.bar.foo.Class

Exemplos

(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

Regras

  • Menor código em bytes ganha
  • Aplicam-se brechas padrão
Shaun Wild
fonte
1
O nome da classe sempre vem por último?
Shaggy
@Shaggy sim faz #
Shaun Wild
Relacionado
Peter Taylor
Tornaria- fantastic.foo.func.barse f.f.f.barou é garantido que 2 pacotes não podem começar com a mesma letra?
Emigna 5/05
1
f.f.f.barestaria correto.
Shaun Wild

Respostas:

8

Retina , 17 bytes

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

Experimente online!

Explicação

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

Isso é substituído por $1, que é o período e a letra minúscula que não deve ser removida.

Martin Ender
fonte
Eu queria tentar minha primeira resposta Retina, mas o deus da Retina Martin apareceu. Muito bem, eu!
Matthew Roh
4

JavaScript (ES6), 68 53 bytes

s=>s.split`.`.map((x,y,z)=>z[y+1]>"["?x[0]:x).join`.`
  • 15 bytes economizados graças ao Arnauld .

Veja minha outra solução aqui .


Tente

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>

Shaggy
fonte
1
Poderia ser simplificado para s=>s.split`.`.map((x,y,z)=>z[y+1]>"["?x[0]:x).join`.` ?
Arnauld
Parece que pode, obrigado, @Arnauld.
Shaggy
Solução inovadora, mas apenas 2 upvotes. Mas vou votar isso!
Arjun #
2

Mathematica, 75 bytes

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

Função anônima. Pega uma string como entrada e retorna uma string como saída.

LegionMammal978
fonte
JS com pontuação menor que, Mathematica ?! Isso não pode estar certo - eu fiz algo errado, não fiz?
Shaggy
@Shaggy Java 7 com pontuação menor que JS e Mathematica ?! Isso não pode estar certo - eu fiz algo errado, não fiz? (Não resisti.;) Todo o crédito vai para a porta da Martininand Retina de Martinina ).
Kevin Cruijssen 5/05
1
@KevinCruijssen, obrigado por chamar minha atenção para a resposta de Martin - agora resolvi o problema do JS com pontuação maior do Java! : D
Shaggy
2

Japonês , 30 27 25 bytes

¡Y>Zl -('[>ZgJ)-2?X:Xg}'.

Experimente online!

Lucas
fonte
Agradável! Eu acho que você pode salvar dois bytes com('[>ZgJ)
ETHproductions
Eu só percebi que bem ;-)
Lucas
2

Python 2 , 88 81 bytes

f=lambda s,d=".":s.count(d)>(s.split(d)[-1]<"[")and s[0]+d+f(s[s.find(d)+1:])or s

Experimente online!

ovs
fonte
1

JavaScript (ES6), 36 bytes

Outro porto da resposta da Martin Retina . Veja minha outra solução aqui .

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>

Shaggy
fonte
Uma boa solução, mas sem votos positivos. Merece mais do que uma pontuação 0. Vou transformá-lo em 1! :)
Arjun
1

V , 9 bytes

Í쓃…®õÀ!

Experimente online!

Hexdump:

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

Este é um exemplo maravilhoso da assinatura do V compressão regex .

Explicação:

Í          " 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
James
fonte
1

Python 2 , 108 97 89 bytes

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

Experimente online!

-8 com muito obrigado a @ovs pela dica

ElPedro
fonte
for x in range(len(i)+~(i[-1][0]<"[")):i[x]=i[x][0]para -8
ovs 05/05
0

sed , 57 22 bytes

Eu esperava que a solução sed fosse um pouco mais curta que isso ...

Editar:

A solução mais curta usa regex da resposta de Martin Ender .

Código de origem de 21 bytes + 1 byte para -rsinalizador (ou -Esinalizador para BSD sed).

s|\B\w+(\.[a-z])|\1|g
Maxim Mikhaylov
fonte
Você também não pode usar a substituição da minha resposta da Retina? s|\B\w+(\.[a-z])|\1|g?
Martin Ender
@MartinEnder Passei bastante tempo tentando criar uma linha sem olhar as respostas de ninguém primeiro, mas falhei. Não acho que exista uma maneira mais curta de fazer isso, então usarei o seu. Obrigado!
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

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

lexanalisa uma string como tokens Haskell, então lex "some.string"retorna [("some",".string")]. frecorre sobre os tokens na string e sempre acrescenta o primeiro caractere ado token atual, mas o restante tdo token somente se a string restante após os dois pontos pcomeçar com um caractere maiúsculo x<'a'. Se a correspondência do padrão falhar, alcançamos o último token e simplesmente retornamos s.

Laikoni
fonte