Reindent Java / C / C ++ / vb. kod


10

Kodu güzel biçimlendirmek için boşluk ekleyen veya silen bir program yazın. İşiniz bittiğinde kodun nasıl görünmesi gerektiğine ilişkin kurallar:

  • Hiçbir satır birden fazla {ve içermemelidir }.
  • A {her zaman bir satırdaki son şey olmalıdır.
  • A }her zaman bir satırdaki tek şey olmalıdır (ondan önce gelen boşluk dışında).
  • Her satırın önündeki boşluk, mevcut yuvalama sayısının sabit bir katı olmalıdır. (Değişmediği sürece istediğiniz miktarda girinti kullanabilirsiniz.)
  • Bu kurallardan birini karşılamaya katkıda bulunmayan hiçbir boşluk yerleştirilmemeli veya kaldırılmamalıdır.

İlk satırın iç içe yerleştirme sayısı 0'dır. Başka herhangi bir satırın iç içe yerleştirme sayısı, önceki satırın iç içe yerleştirme sayısı, artı önceki satırda {bir varsa, eksi geçerli satırda bir eksi bulunur }.

{ve }dize değişmezleri ve yorumları içinde yukarıdaki kurallar sayılmaz. Bir dize hazır bilgisi, tek veya çift tırnak içine alınmış metindir; burada tek veya çift tırnak, tek sayı ters eğik çizgiden hemen önce, dize hazır bilgisinin sonu olarak yorumlanmaz. Bir açıklama metni içine alınır /*ve */veya metin giden //satırın sonuna kadar. Bir satırda birden çok yorum başlatma işaretçisi, yalnızca ilki sayılır. Yorumlar dize değişmez değerleri içinde ayrıştırılmaz.

Örnekler

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

Yorumlar uzun tartışmalar için değildir; bu sohbet sohbete taşındı .
Dennis

Yanıtlar:


6

JavaScript (ES6), 376 373 378 393 bayt

Bu ... oldukça zordu ...

Çıktının yanlış bir şey olup olmadığını bana bildirin, ancak hiçbir şey bulamadım, daha fazla bir şey bulamıyorum.

Ungolfed sürümü

Kodu yazarken golf oynadım, bu yüzden bunun nasıl gittiğini görelim ...


bana iyi görünüyor
tbodt

Ben yazarken kodu golf. Ben gerçek bir golfçü demektir ...
Outgolfer Erik

4

JavaScript (ES6), 260 259 bayt

Giriş karakterini karakter ayrıştırır. 4 boşluklu girinti kullanır.

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)

Bu hala bir WIP'dir ve temel olarak sadece sağlanan örneklere göre test edilmiştir. Herhangi bir hata bulursanız, lütfen yorumlarda bana bildirin.

Ayrıştırıcının durumu aşağıdaki değişkenler tarafından tamamen açıklanmıştır:

  • d → mevcut yuvalama derinliği
  • i → kodun içinde 'bulunduğumuzu' bildiren bayrak (yani satırın önde gelen boşluklarından sonra)
  • l → dizgi değişmez bayrağı
  • c → yorum işaretini engelle
  • e → satır yorum işareti

Zorunlu girintili versiyon

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
)

Test senaryoları

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.