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つのパッケージが同じ文字で開始できないことが保証されていますか?
— エミグナ

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が現れました。行く方法、私!
— マシュー盧

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さん、ありがとうございます。
— シャギー

革新的なソリューションですが、たった2回の投票で済みます。しかし、私はこれを支持します!
— アルジュン

2

Mathematica、75バイト

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

無名関数。入力として文字列を受け取り、出力として文字列を返します。


JSスコアがMathematicaより低い?!それは正しくありません-私は何か間違ったことをしましたよね?
— シャギー

@Shaggy Java 7はJSやMathematicaよりも低いスコアですか?!それは正しくありません-私は何か間違ったことをしましたよね?(それに抵抗することはできませんでした。;)すべてのクレジットはMartinEnderのRetinaのポートに送られます。
— ケビンCruijssen

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に変えます!:)
— アルジュン

1

V、9バイト

Í쓃…®õÀ!

オンラインでお試しください!

Hexdump:

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の答えの正規表現を使用します。

21バイトのソースコード+ フラグ用の1バイト-r(または-EBSD sed 用のフラグ)。

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

Retina回答からの代替も使用できませんか?s|\B\w+(\.[a-z])|\1|g?
— マーティンエンダー

@MartinEnder最初に誰かの答えを見ずにワンライナーを考え出すことにかなりの時間を費やしましたが、失敗しました。もっと短い方法はないと思うので、あなたのものを使います。ありがとうございました!
— マキシムミハイロフ

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"。

lexHaskellトークンとして文字列を解析するため、をlex "some.string"返します[("some",".string")]。f文字列内のトークンを超える再帰的に、常に最初の文字追加し a、現在のトークンのを、しかし、残りの部分tだけで、残りの文字列の場合、トークンのコロンの後にpある大文字の文字で始まりますx<'a'。パターンマッチが失敗した場合、最後のトークンに到達し、単に戻りsます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.