자바 패키지 단축


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.bar가 f.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.