Скоротіть пакет 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 так це
Shaun Wild


Це fantastic.foo.func.barстане f.f.f.barабо гарантується, що 2 пакунки не можуть починатись з того самого листа?
Емінья

1
f.f.f.barбуло б правильно.
Shaun Wild

Відповіді:


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

JavaScript (ES6), 68 53 байти

s=>s.split`.`.map((x,y,z)=>z[y+1]>"["?x[0]:x).join`.`

Дивіться моє інше рішення тут .


Спробуй це

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

Математика, 75 байт

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

Анонімна функція. Приймає рядок як вхідний і повертає рядок як вихідний.


JS забив нижче, ніж Mathematica ?! Це не може бути правильно - я зробив щось не так, чи не так?
Кудлатий

@Shaggy Java 7 забив менше, ніж JS та Mathematica ?! Це не може бути правильно - я зробив щось не так, чи не так? (Не втримався.;) Всі кредити надходять до порту Retina MartinEnder 's btw).
Кевін Круїссен

1
@KevinCruijssen, дякую, що звернув мою увагу на відповідь Мартіна - я тепер вирішив проблему випередження JS на Java! : D
Shaggy





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 буде трохи коротшим, ніж це ...

Редагувати:

Коротше рішення використовує регулярний вираз із відповіді Мартіна Ендера .

21 байт вихідного коду + 1 байт для -rпрапора (або -Eпрапор для BSD 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аналізує рядок як лексеми Haskell, тому lex "some.string"повертається [("some",".string")]. fповторюється над лексемами в рядку і завжди додає першу таблицю aпоточного маркера, але решту символів tлише в тому випадку, якщо решта рядка після двокрапки pпочинається з великої літери, тобто x<'a'. Якщо збіг шаблону не вдався, ми дійшли до останнього маркера і просто повернемося s.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.