缩短Java程序包


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是它
肖恩野


fantastic.foo.func.bar成为f.f.f.bar或保证2个包装不能以相同字母开头?
Emigna '17

1
f.f.f.bar是正确的。
肖恩·怀尔德

Answers:


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答案,但是Martin出现了Retina神。要走的路,我!
马修·罗

4

JavaScript(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

Mathematica,75个字节

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

匿名函数。将字符串作为输入并返回字符串作为输出。


JS得分低于Mathematica ?!那不可能是对的-我做错了,不是吗?
毛茸茸的

@Shaggy Java 7得分低于JS和Mathematica吗?那不可能是对的-我做错了,不是吗?(无法抗拒。;)所有功劳归功于MartinEnder的Retina港口(顺便说一句)。
凯文·克鲁伊森

1
@KevinCruijssen,感谢您引起我对Martin答案的关注-我现在已经解决了Java JS得分过高的问题!:D
毛茸茸的





1

JavaScript(ES6),36个字节

马丁视网膜的另一个答案在这里查看我的其他解决方案。

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's

1

V,9个字节

Í쓃…®õÀ!

在线尝试!

十六进制转储:

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

sed57 22字节

我希望sed解决方案比这个短一些...

编辑:

较短的解决方案使用Martin Ender的答案中的正则表达式。

21个字节的源代码+ 1个字节的-r标志(或-EBSD sed的标志)。

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

您还不能使用我的Retina答案中的替代词吗?s|\B\w+(\.[a-z])|\1|g
马丁·恩德

@MartinEnder我花了很多时间试图单线提出,但没有先看任何人的回答,但失败了。我认为没有比这更短的方法了,所以我会用你的。谢谢!
Maxim Mikhaylov

0

Haskell,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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.