जावा पैकेज को छोटा करें


11

वार्ता

पूरी तरह से योग्य जावा क्लास / पैकेज के नाम को देखते हुए, आपको इसे इस तरह छोटा करना होगा:

डॉट सेपरेट किए गए पैकेज के प्रत्येक भाग को पहले अक्षर, अंतिम खंड और वर्ग (यदि यह मौजूद है) के अलावा छोटा किया जाएगा।

पैकेज के नाम सभी लोअर केस होंगे, और क्लास (यदि यह मौजूद है) एक कैपिटल लेटर के साथ शुरू होगी और अपरकंपेलकेस होगी। पैकेज के रूप में आते हैं:

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
क्या कक्षा का नाम हमेशा अंतिम होता है?
झबरा

@ शैगी हाँ यह करता है
शॉन वाइल्ड


चाहेंगे 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, जो कि अवधि और निचला केस लेटर है जिसे हटाया नहीं जाना चाहिए।


मैं अपना पहला रेटिना जवाब देने की कोशिश करना चाहता था, लेकिन रेटिना भगवान मार्टिन ने दिखाया। रास्ता टू मी, मी!
मैथ्यू रो

4

जावास्क्रिप्ट (ईएस 6), 68 53 बाइट्स

s=>s.split`.`.map((x,y,z)=>z[y+1]>"["?x[0]:x).join`.`
  • 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 upvotes। लेकिन मैं इसे बढ़ा दूंगा!
अर्जुन

2

मैथेमेटिका, 75 बाइट्स

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

अनाम फ़ंक्शन। एक स्ट्रिंग को इनपुट के रूप में लेता है और एक स्ट्रिंग को आउटपुट के रूप में देता है।


जेएस, गणितज्ञ की तुलना में कम स्कोरिंग ?! यह सही नहीं हो सकता - मैंने कुछ गलत किया है, क्या मैंने नहीं किया है?
झबरा

@ जैगी और गणितज्ञ की तुलना में जावा जावा 7 स्कोरिंग कम है ?! यह सही नहीं हो सकता - मैंने कुछ गलत किया है, क्या मैंने नहीं किया है? (इसका विरोध नहीं कर सके;) सारा श्रेय मार्टिनएंडर्स रेटिना के पोर्ट btw को जाता है)।
केविन क्रूज़सेन

1
@KevinCruijssen, मार्टिन के जवाब पर मेरा ध्यान आकर्षित करने के लिए धन्यवाद - मैंने अब जावा आउट स्कोरिंग जेएस की समस्या को ठीक कर दिया है! : डी
झबरा





1

जावास्क्रिप्ट (ईएस 6), 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

वी , 9 बाइट्स

Í쓃…®õÀ!

इसे ऑनलाइन आज़माएं!

Hexdump:

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

यह वी के हस्ताक्षर रेगेक्स संपीड़न का एक अद्भुत उदाहरण है ।

स्पष्टीकरण:

Í          " 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 समाधान इससे थोड़ा कम होगा ...

संपादित करें:

मार्टिन एंडर के जवाब से छोटा समाधान रेगेक्स का उपयोग करता है ।

-rझंडे के लिए 21 बाइट्स सोर्सकोड + 1 बाइट (या -Eबीएसडी sed के लिए झंडा)।

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

क्या आप मेरे रेटिना उत्तर से प्रतिस्थापन का उपयोग नहीं कर सकते? s|\B\w+(\.[a-z])|\1|g?
मार्टिन एंडर

@MartinEnder पहले किसी के जवाब को देखे बिना एक-एक लाइनर के साथ आने की कोशिश में मैंने काफी समय बिताया लेकिन असफल रहा। मुझे नहीं लगता कि ऐसा करने का कोई छोटा तरीका है, इसलिए मैं आपका उपयोग करूंगा। धन्यवाद!
मैक्सिम मिखायलोव

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हास्केल टोकन के रूप में एक स्ट्रिंग को पार्स करता है, इसलिए lex "some.string"रिटर्न करता है [("some",".string")]fस्ट्रिंग में टोकन पर पुनरावृत्ति होती है और हमेशा aचालू टोकन के पहले चार को जोड़ती है, लेकिन शेष tटोकन केवल तभी pहोता है जब बृहदान्त्र के बाद शेष स्ट्रिंग एक बड़े अक्षर के साथ शुरू होता है, अर्थात x<'a'। यदि पैटर्न मैच विफल हो गया, तो हम अंतिम टोकन पर पहुंच गए हैं और बस वापस आ गए हैं s

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.