Правая скобка - это стиль брекетинга кода, при котором фигурные скобки и точки с запятой выровнены по одной точке на правой стороне файла.
Как правило, это считается плохой практикой по нескольким причинам.
Соревнование
Возьмите многострочную строку с помощью любого метода и преобразуйте ее стиль скобок в правую скобку.
Для этой задачи вам нужно, чтобы он работал только с кодом Java, однако теоретически он должен работать с любым кодом, который использует фигурные скобки и точки с запятой.
Вы должны захватить все {};
символы подряд с любым количеством пробелов между ними. НАПРИМЕР. }}
, ; }
}\n\t\t}
И выстроить их на правой стороне файла через использование пробелов.
например:
a {
b;
{c
должен стать
a {
b ;{
c
Или, если говорить более абстрактно, сдвиньте все пробелы слева от всех {};
символов вправо.
Отступы строк должны быть сохранены в противном случае. Строки, содержащие только пробелы после перемещения {};
символов, могут быть удалены.
Например:
a{
b{
c;
}
}
d;
Может стать либо
a {
b {
c;}}
d ;
или
a {
b {
c;}}
d ;
Выдвинутый вправо относится ко всем {};
символам, выравниваемым по точке, не короче самой длинной линии. Любое количество места после этого приемлемо.
Так что все нижеприведенное приемлемо:
a {
bc;
a {
bc ;
a {
bc ;
так далее...
Строки в любом коде могут содержать {};
символы между другими непробельными символами, обработка этого случая не требуется, хотя, если вы склонны, вы должны оставить их на месте. Строки могут также вообще не содержать {};
символов, и это должно быть обработано правильно. Как показано ниже.
a {
b ;
c
d }
Поскольку мы не хотим, чтобы Code Review видел ужасные вещи, которые мы делаем, вы должны сделать свой код как можно меньше.
Примеры / Тестовые случаи
Универсальная Java
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello, World!");
}
}
становится ...
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!") ;}}
Само изображение
public class Permuter{
private static void permute(int n, char[] a){
if (n == 0){
System.out.println(String.valueOf(a));
}else{
for (int i=0; i<= n; i++){
permute(n-1, a);
swap(a, n % 2 == 0 ? i : 0, n);
}
}
}
private static void swap(char[] a, int i, int j){
char saved = a[i];
a[i] = a[j];
a[j] = saved;
}
}
становится ...
public class Permuter {
private static void permute(int n, char[] a) {
if (n == 0) {
System.out.println(String.valueOf(a)) ;}
else {
for (int i=0; i<= n; i++) {
permute(n-1, a) ;
swap(a, n % 2 == 0 ? i : 0, n) ;}}}
private static void swap(char[] a, int i, int j) {
char saved = a[i] ;
a[i] = a[j] ;
a[j] = saved ;}}
Не так идеально универсальный Python
Для контраста
def Main():
print("Hello, World!");
Main();
становится ...
def Main():
print("Hello, World!") ;
Main() ;
Заметки
- Стандартные лазейки применяются
- Стандартное IO применяется
- Это код-гольф , поэтому выигрывает самая короткая программа в байтах!
- Я не несу ответственности за ущерб, связанный с программированием в стиле Right Hand Brace
- Повеселись!
Редактировать заметки
Я перефразировал детали соревнования. Надеюсь, я не нарушил чью-то точку зрения на правила, уверяю вас, это было непреднамеренно. Это должно быть гораздо более ясным и менее противоречивым.
int a=0;System.out.println(a);
;{}
символы собирались, если они находятся на отдельных строках (это видно только из примера, а не из правил, и на самом деле, если строка состоит из\t}
сохранения отступа, это означало бы не двигаться}
до конца). предыдущей строки)Ответы:
Утилиты V + Bash,
6462616062 байта1 байт сохранен благодаря @DJMcMayhem за соединение ex-команд
^R
символьный литерал для<C-r>
(0x12
) и<84>
есть0x84
и<94>
есть0x94
.wc -L
работает на большинстве систем * nix, но не на macOS. Для macOS вы должны сделать этоgwc -L
после получения coreutils, используя brew, если вы этого еще не сделали.Попробуйте онлайн! (Джава)
Попробуйте онлайн! (Python)
Попробуйте онлайн! (Опять ява)
Это сохраняет все пустые строки и не обрабатывает вкладки, только пробелы.
HexDump:
объяснение
Сначала мы должны иметь возможность переместить курсор в любое место в буфере, поэтому мы используем
и мы связываем это с другой командой ex, используя
|
Нам нужно получить длину самой длинной строки на входе. Это можно сделать с помощью команды оболочки
wc -L
.Это перезаписывает текущий буфер (содержащий входные данные) с результатом
wc -L
. Это дает что-то вроде:и курсор попадает на
4
ин42
. Затем мы копируем это число с помощьюy$
: yank текста с позиции курсора до конца строки. Это удобно хранит этот номер в реестре0
. Но об этом чуть позже. Вход заменяется на этот номер, поэтому, чтобы вернуться назад, мы возвращаемсяu
.Теперь скажите, что вход выглядел примерно так:
нам нужно переместить фигурные скобки
}
от конца буфера сразу послеprintln
оператора.Если регулярное выражение не может быть найдено, возникает ошибка прерывания и прерывание рекурсии, вызванное
ò
.Теперь перейдем к основной части этой программы, переместите все скобки и точки с запятой и выровняйте их, как указано в вопросе.
Опять же, эта рекурсия будет остановлена из-за ошибки прерывания, вызванной невозможностью найти регулярное выражение в буфере.
Правки
D
вместоd$
(я даже не знаю, почему я пропустил это в первую очередь)[^
(в регулярном выражении) до<84>
\zs
(сжатие его в<93>
) и удалением$
ин$xk$pò
источник
:se ve=all|%!wc -L
Рубин,
100114108 байтЧитает имя файла в качестве аргумента командной строки. Если имя файла не указано, оно будет считано из STDIN. Не обрабатывает вкладки.
Попробуйте онлайн!
источник
catch
Заявление с отступом и Б. Точка с запятой, которая была слишком много отступа, в самой длинной строке кода. Я думаю, я знаю только то, что мне нужно, чтобы это исправить, дай мне секунду. (Также я обновил спецификацию, чтобы упомянуть, что она не может обрабатывать вкладки, а в вашем файле есть вкладки.)Perl , 90 байт
88 байт кода +
-p0
флаги.Попробуйте онлайн!
Краткие пояснения:
\@a[y///c]for/.*/g;
подсчитывает длину самой длинной строки: для каждой строки он определяет элемент по индексуy///c
(то есть по размеру строки) массива@a
. В конце, максимальный индекс@a
(т.е. размер@a
) - это размер самой длинной строки.s/(.*?)\K[{};]$/$"x(@a-$1=~y%%%c).$&/gme
размещает{};
символы в конце строк.1while s/ *\n *([{};]+)$/$1/m
make заставляет скобки на пустых строках идти в строке выше.Благодаря @primo, откуда я частично «украл» начало моего кода отсюда, чтобы посчитать длину самой длинной строки.
источник
Python 2: 228 байт
источник
;{}
должны идти в конце предыдущих строк.сложено , 133 байта
Попробуйте онлайн! Я мог бы сильно обдумать это ... но что угодно. Я посмотрю на это снова завтра. Несколько хороших советов:
"!
часто может использоваться вместоmap
сохранения одного или двух байтов, в зависимости от того, начинается ли следующий токен со слова. Тем не менее, он может использоваться только тогда, когда каждый атом массива хочет отображаться. Это похоже на глубокую карту.$MAXmap
эквивалентен$MAX map
, что, в свою очередь, эквивалентно[MAX] map
. (Сопоставляет каждый массив с его максимальным элементом.)источник
JavaScript (предложение ES),
139121 байтТребуется Firefox 48 / Chrome 57 / Opera 44 / Safari 10 / Edge 15 для
padEnd
. Изменить: Сохранено 18 байт благодаря @ValueInk.источник
s.replace(r,`$1`)
при расчете длины линии? Любого количества разумных правых отступов должно быть достаточно, поэтому подсчет длины строки с помощью точек с запятой и скобок должен быть в порядке.PHP,
201194185172167 байтпринимает данные из файла f; предполагает однобайтовые разрывы строк и отсутствие вкладок; сохраняет пустые строки.
+1
ко второмуstr_pad
параметру.0
:удалить
""<
и заменить""==
на!
.сломать
источник
{}
скобок в регулярном выражении?Java 8,
312305 байтОбъяснение:
Попробуй это здесь.
источник