자바 패키지 단축


11

요약 보고

완전한 Java 클래스 / 패키지 이름이 주어지면 다음과 같이 단축해야합니다.

점으로 구분 된 패키지의 각 부분은 마지막 섹션과 클래스 (있는 경우)를 제외하고 첫 글자로 단축됩니다.

패키지 이름은 모두 소문자이며 클래스 (있는 경우)는 대문자로 시작하고 UpperCamelCase입니다. 패키지 형태는 다음과 같습니다.

foo.bar.foo

foo.bar.foo.Class

(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

규칙

  • 바이트 단위의 최단 코드 승리
  • 표준 허점 적용

1
수업 명은 항상 마지막에 나오는가?
Shaggy

@Shaggy 네, 그렇습니다
Shaun Wild


것인가 fantastic.foo.func.barf.f.f.bar아니면이 개 패키지는 같은 문자로 시작할 수 없다는 보장?
Emigna

1
f.f.f.bar맞을 것입니다.
숀 와일드

답변:


8

레티 나 , 17 바이트

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

온라인으로 사용해보십시오!

설명

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

이것은로 교체 $1기간 및 제거해서는 안 소문자이다.


첫 번째 Retina 답변을 시도하고 싶지만 Retina 신 Martin이 나타났습니다. 갈 길, 나!
Matthew Roh

4

자바 스크립트 (ES6), 68 53 바이트

s=>s.split`.`.map((x,y,z)=>z[y+1]>"["?x[0]:x).join`.`
  • Arnauld 덕분에 15 바이트가 절약되었습니다 .

내 다른 솔루션을 여기에서 참조 하십시오 .


시도 해봐

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
그것은 단순화 될 수 있을까 s=>s.split`.`.map((x,y,z)=>z[y+1]>"["?x[0]:x).join`.` ?
Arnauld

@Arnauld 덕분에 가능합니다.
얽히고 설킨

혁신적인 솔루션이지만 단 2 개의 공감 그러나 나는 이것을 공표 할 것이다!
Arjun

2

수학, 75 바이트

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

익명의 기능. 문자열을 입력으로 받아서 문자열을 출력으로 반환합니다.


JS 점수가 Mathematica보다 낮습니까?! 맞지 않아요-내가 잘못 했어?
Shaggy

@Shaggy Java 7은 JS 및 Mathematica보다 점수가 낮습니까?! 맞지 않아요-내가 잘못 했어? (그것에 저항 할 수 없었다.;) 모든 크레딧은 MartinEnder 의 Retina의 포트 btw에 간다 ).
케빈 크루이 센

1
@KevinCruijssen, Martin의 답변에 관심을 가져 주셔서 감사합니다. 이제 Java out-scoring JS 문제를 해결했습니다! : D
얽히고 설킨 Shaggy





1

자바 스크립트 (ES6), 36 바이트

Martin의 Retina의 또 다른 항구는 대답 합니다. 내 다른 솔루션을 여기에서 참조 하십시오 .

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>


좋은 해결책이지만 공감 율은 없습니다. 점수가 0 점 이상이어야합니다. 나는 그것을 1로 바꿀 것입니다! :)
Arjun

1

V , 9 바이트

Í쓃…®õÀ!

온라인으로 사용해보십시오!

16 진 덤프 :

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

이것은 V의 서명 정규식 압축 의 훌륭한 예입니다. .

설명:

Í          " 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 바이트

sed 솔루션이 이것보다 약간 짧을 것으로 예상했습니다 ...

편집하다:

더 짧은 솔루션은 Martin Ender 's answer의 정규식을 사용합니다 .

21 바이트 소스 코드 + -r플래그의 경우 1 바이트 (또는 -EBSD sed의 경우 플래그)

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

내 Retina 답변의 대체품도 사용할 수 없습니까? s|\B\w+(\.[a-z])|\1|g?
마틴 엔더

@MartinEnder 나는 누군가의 대답을 먼저 보지 않고 하나의 라이너를 만들려고 꽤 시간을 보냈지 만 실패했습니다. 나는 그것을하는 더 짧은 방법이 없다고 생각하므로, 나는 당신을 사용할 것입니다. 감사합니다!
Maxim Mikhaylov

0

하스켈 , 58 바이트

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

온라인으로 사용해보십시오! 사용법 : f "some.string".

lex문자열을 Haskell 토큰으로 구문 분석하므로를 lex "some.string"반환합니다 [("some",".string")]. f는 문자열에서 토큰을 되풀이하고 항상 a현재 토큰 의 첫 번째 문자 를 추가 하지만 t콜론 뒤의 나머지 문자열 p이 대문자로 시작 하는 경우에만 나머지 토큰을 추가합니다 x<'a'. 패턴 일치에 실패하면 마지막 토큰에 도달하고 단순히를 반환 s합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.