重新缩进Java / C / C ++ / etc。码


10

编写一个添加或删除空格以很好地格式化代码的程序。完成后代码外观的规则:

  • 没有行应包含一个以上的{}
  • A {应该永远是一行中的最后一件事。
  • 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
}
;

评论不作进一步讨论;此对话已转移至聊天
丹尼斯,

Answers:


6

JavaScript(ES6),376 373 378 393字节

这是...相当大的挑战...

让我知道输出是否有问题,尽管我找不到任何东西。

非高尔夫版本

我在编写代码时喜欢它,所以让我们看看它是怎么回事...


对我看起来很好
tbodt

我按照编写的代码打高尔夫球这意味着您是一名真正的高尔夫球手...
Egg the 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
)

测试用例

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.