Reindent Java / C / C ++ / тощо. код


10

Напишіть програму, яка додає або видаляє пробіли, щоб добре форматувати код. Правила того, як повинен виглядати код, коли ви закінчите:

  • Жоден рядок не повинен містити більше одного {та }.
  • A {завжди має бути останньою справою у рядку.
  • }Завжди повинна бути тільки річ на лінії (крім пробілу , що йде перед ним).
  • Кількість пробілів перед кожним рядком має бути фіксованим кратним поточному кількості вкладень. (Ви можете використовувати будь-яку кількість відступів, що вам потрібно, доки вона не зміниться.)
  • Не слід вставляти чи видаляти пробіли, які не сприяють виконанню одного з цих правил.

Кількість гніздування для першого рядка дорівнює 0. Кількість вкладень для будь-якого іншого рядка - це число вкладення попереднього рядка, плюс одне, якщо попередній рядок містить a {, мінус один, якщо поточний рядок містить a }.

{а }всередині рядкових літералів та коментарів не враховується у вищезазначених правилах. Строковий буквал - це текст, укладений в одиночні або подвійні лапки, де одиничні або подвійні лапки з непарною кількістю зворотних косих ринків безпосередньо перед ними не інтерпретуються як кінець рядкового літералу. Коментар є текст , укладений в /*і */, або текст , йдучи від //кінця лінії. У рядку декількох маркерів початку коментарів рахується лише перший. Коментарі не розбираються всередині літеральних рядків.

Приклади

    main() {printf("Hello!"); // I don't care about the world...
        }

becomes:

main() {
    printf("Hello!"); // I don't care about the world...
}




int main(){
    puts("a");
        puts("b");
}

becomes:

int main(){
    puts("a");
    puts("b");
}


main()
{ printf("{"); /* }
} */
     printf("}//}"); ///*
    }

becomes:

main()
{
    printf("{"); /* }
} */
    printf("}//}"); ///*
}


int test[] = {1, 2, 3};

becomes:

int test[] = {
    1, 2, 3
}
;

Коментарі не для розширеного обговорення; ця розмова була переміщена до чату .
Денніс

Відповіді:


6

JavaScript (ES6), 376 373 378 393 байт

Це було ... досить складною проблемою ...

Дайте мені знати, якщо в виході щось не так, хоча я нічого не міг знайти, нічого більше не можу знайти.

Безгольова версія

Я гольф код, як я його написав, так що давайте подивимося, як це йде ...


мені добре виглядає
tbodt

Я гольф код, як я його написав, це означає, що ви справжній гольфіст ...
Ерік Outgolfer

4

JavaScript (ES6), 260 259 байт

Розбирає вхідний символ за символом. Використовує 4-пробільний відступ.

s=>s.replace(/[^]/g,(x,n)=>(p=s[n-1],a=!l&!c&!e,l|x!='/'?a&x=='*'&p=='/'?c=x:!c&!e&x=='"'?(l^=1,x):x==`
`?(i=e=0,x):a&x=='}'?d--&&i?`
`+x:i=x:a&x=='{'?s[i=!++d,n+1]==`
`?x:x+`
`:i?x:x==' '?'':' '.repeat(!c*d*4,i=1)+x:p==x?e=x:!e&p=='*'?(c=0,x):x),d=i=l=c=e=0)

Це все ще WIP, і в основному його перевіряли лише на підставі поданих прикладів. Якщо ви знайшли помилку, будь ласка, повідомте мене про це у коментарях.

Стан аналізатора повністю описується такими змінними:

  • d → поточна глибина вкладання
  • i → прапор, який говорить про те, що ми знаходимося "всередині" коду (тобто після провідних пробілів рядка)
  • l → рядковий буквальний прапор
  • c → прапор блокування коментарів
  • e → прапор коментаря до рядка

Обов’язкова відмінна версія

s => s.replace(
  /[^]/g,
  (x, n) => (
    p = s[n - 1],
    a = !l & !c & !e,
    l | x != '/' ?
      a & x == '*' & p == '/' ?
        c = x
      :
        !c & !e & x == '"' ?
          (l ^= 1, x)
        :
          x == `\n` ?
            (i = e = 0, x)
          :
            a & x == '}' ?
              d-- && i ? `\n` + x : i = x
            :
              a & x == '{' ?
                s[i = !++d, n + 1] == `\n` ? x : x + `\n`
              :
                i ?
                  x
                :
                  x == ' ' ? '' : ' '.repeat(!c * d * 4, i = 1) + x
    :
      p == x ?
        e = x
      :
        !e & p == '*' ? (c = 0, x) : x
  ),
  d = i = l = c = e = 0
)

Тестові справи

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