Сократить пакет 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, который является точкой и строчной буквой, которая не должна быть удалена.

Мартин Эндер
источник
Я хотел попробовать свой первый ответ на сетчатку, но появился бог сетчатки Мартин. Путь, я!
Мэтью Ро,
4

JavaScript (ES6), 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 отзыва. Но я буду голосовать за это!
Арджун
2

Mathematica, 75 байт

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

Анонимная функция. Принимает строку в качестве ввода и возвращает строку в качестве вывода.

LegionMammal978
источник
JS забил ниже, чем Mathematica ?! Это не может быть правильно - я сделал что-то не так, не так ли?
Лохматый
@ Шагги Java 7 баллов ниже, чем JS и Mathematica ?! Это не может быть правильно - я сделал что-то не так, не так ли? (Не смог устоять.;) Все кредиты идут к порту Retina MartinEnder , кстати).
Кевин Круйссен
1
@KevinCruijssen, спасибо, что обратили мое внимание на ответ Мартина - теперь я исправил проблему Java, превосходящую JS! : D
Лохматый
2

Japt , 30 27 25 байт

¡Y>Zl -('[>ZgJ)-2?X:Xg}'.

Попробуйте онлайн!

Люк
источник
Хороший! Я думаю, что вы можете сохранить два байта с('[>ZgJ)
ETHproductions
Я тоже это понял ;-)
Лука,
1

JavaScript (ES6), 36 байт

Еще один порт Мартина 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! :)
Арджун
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
Джеймс
источник
1

Python 2 , 108 97 89 байт

i=input().split(".")
for x in range(len(i)+~(i[-1][0]<"[")):i[x]=i[x][0]
print".".join(i)

Попробуйте онлайн!

-8 большое спасибо @ovs за подсказку

ElPedro
источник
for x in range(len(i)+~(i[-1][0]<"[")):i[x]=i[x][0]для -8
овс
0

sed , 57 22 байта

Я ожидал, что решение sed будет немного короче этого ...

Редактировать:

Более короткое решение использует регулярное выражение из ответа Мартина Эндера .

21 байт исходного кода + 1 байт для -rфлага (или -Eфлага для BSD 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" .

lexанализирует строку как токены Haskell, поэтому lex "some.string"возвращает [("some",".string")]. fрекурсивно обрабатывает токены в строке и всегда добавляет первый символ aтекущего токена, но оставшуюся tчасть токена, только если оставшаяся строка после двоеточия pначинается с символа верхнего регистра, то есть x<'a'. Если совпадение с образцом не удалось, мы достигли последнего токена и просто вернулись s.

Laikoni
источник