Java / C / C ++ / etcの再インデント。コード


10

コードを適切にフォーマットするために空白を追加または削除するプログラムを記述します。完了したときのコードの外観に関する規則:

  • 行には、{およびの2つ以上を含めることはできません}
  • A {は常に行の最後にある必要があります。
  • A }は常に行の唯一のものでなければなりません(その前にある空白以外)。
  • 各行の前の空白の量は、現在のネスト数の固定倍数である必要があります。(変更しない限り、好きなだけインデントを使用できます。)
  • これらのルールのいずれかを満たすことに寄与しない空白を挿入または削除しないでください。

最初の行のネストカウントは0です。他の行のネストカウントは、前の行のネストカウントに、前の行にが含まれている場合は1を加算し{、現在の行にが含まれている場合は1を減算し}ます。

{そして、}内部の文字列リテラルやコメントは、上記のルールではカウントされません。文字列リテラルは、一重引用符または二重引用符で囲まれたテキストです。単一引用符または二重引用符の直前に奇数個のバックスラッシュが含まれていると、文字列リテラルの終わりとして解釈されません。コメントは、/*および*/で囲まれたテキスト、または行//の終わりまで続くテキストです。複数行コメント開始マーカーでは、最初のマーカーのみがカウントされます。コメントは文字列リテラル内では解析されません。

    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
}
;

コメントは詳細な議論のためのものではありません。この会話はチャットに移動しました
Dennis

回答:


6

JavaScript(ES6)、376 373 378 393バイト

これは...かなりの挑戦でした...

出力に問題がある場合はお知らせください。何も見つからなかったため、これ以上見つけることができません。

非ゴルフバージョン

私はコードを書いたのでゴルフをしましたので、これがどうなるか見てみましょう...


私にはよさそうだ
tbodt 2017年

私がコードを書いたとき私はあなたが本当のゴルファーあることを意味するコードをゴルフしました ...
Erik the Outgolfer 2017年

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
)

テストケース

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.