Java / C / C ++ / 등을 다시 들여 쓰기 암호


10

공백을 추가하거나 제거하여 코드를 멋지게 형식화하는 프로그램을 작성하십시오. 완료되면 코드 모양에 대한 규칙 :

  • 행은 {과 중 하나 이상을 포함해서는 안됩니다 }.
  • A {는 항상 마지막 줄이어야합니다.
  • A }는 항상 줄의 유일한 항목 이어야합니다 (앞에 공백이 있음).
  • 각 줄 앞의 공백은 고정 된 현재 중첩 수의 배수 여야합니다. (변경되지 않는 한 원하는만큼 들여 쓰기를 사용할 수 있습니다.)
  • 이러한 규칙 중 하나를 충족시키는 데 기여하지 않는 공백은 삽입하거나 제거해서는 안됩니다.

첫번째 라인의 중첩 수는 이전의 라인이 포함되어있는 경우 다른 광고의 중첩 횟수가 중첩 이전 행의 수 더하기 하나 0이고 {현재의 라인이 포함되어있는 경우, 뺀 }.

{}내부 문자열 리터럴 및 의견은 위의 규칙에 포함되지 않습니다. 문자열 리터럴은 작은 따옴표 나 큰 따옴표로 묶인 텍스트입니다. 여기서 작은 따옴표 나 큰 따옴표는 백 슬래시가 홀수이고 문자열 리터럴의 끝으로 해석되지 않습니다. 주석은 /*및로 묶은 텍스트 */또는 //줄 끝 에서 시작 하는 텍스트 입니다. 한 줄에 여러 개의 주석 시작 마커는 첫 번째 주석 만 계산됩니다. 문자열 리터럴 내에서는 주석이 구문 분석되지 않습니다.

    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

자바 스크립트 (ES6), 376 373 378 393 바이트

이것은 ... 매우 어려운 도전이었습니다 ...

출력에 아무것도 잘못이 있다면 내가 비록 나, 알려 아무것도 찾을 수 없습니다 더 아무것도 찾을 수 있습니다.

언 골프 버전

코드를 작성하면서 골프를 쳤으므로 어떻게 진행되는지 봅시다 ...


나에게 좋아 보인다
tbodt

내가 작성한 코드 는 당신이 진정한 골퍼라는 것을 의미합니다.
Erik the Outgolfer

4

자바 스크립트 (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.