เยื้องสตริงโดยใช้วงเล็บที่กำหนด


16

กำหนดอินพุตต่อไปนี้ให้กับโปรแกรม:

  1. รายการอักขระเริ่มบล็อก
  2. รายการอักขระสิ้นสุดบล็อก
  3. สตริงที่จะจัดรูปแบบ

จัดรูปแบบสตริงด้วยบล็อกที่คั่นด้วยชุดอักขระสองเยื้อง

การจัดรูปแบบเสร็จสิ้นด้วยสองช่องว่างต่อระดับและวางวงเล็บไว้ตามที่แสดงในตัวอย่างด้านล่าง คุณอาจคิดว่าชุดของการเปิดและปิดตัวละครที่จะ disjoint

เช่นสำหรับ{[(<และ}])>เป็นชุดอักขระการเปิดและปิดและสตริงต่อไปนี้:

abc{xyz{text[note{comment(t{ex}t)abc}]}}

ผลลัพธ์ต่อไปนี้จะถูกคาดหวัง:

abc
{
  xyz
  {
    text
    [
      note
      {
        comment
        (
          t
          {
            ex
          }
          t
        )
        abc
      }
    ]
  }
}

คุณไม่สามารถเขียนรหัสรายการอักขระ“ วงเล็บ” ได้ยาก แม้ว่าจะไม่ได้ระบุอินพุตให้ แต่; นี่อาจเป็นอาร์กิวเมนต์บรรทัดคำสั่งหรือผ่านอินพุตมาตรฐานตามที่คุณต้องการ


5
เราสามารถสันนิษฐานได้ว่าในวงเล็บแต่ละอันมีหนึ่งอันและในลำดับเดียวกันได้หรือไม่
Juan

โปรแกรมจำเป็นต้องสนับสนุนอักขระวงเล็บที่กำหนดเป็นอาร์กิวเมนต์หรือไม่? เช่น./program 'p' 'q' <<< '1p23p45q67q8' หรือต้องการเพียงแค่การสนับสนุน{[(<และ}])>?
Joey Adams

@ โจอี้ฉันไม่คิดว่าจะเป็นสิ่งที่น่าประทับใจกว่า
Neil

joey: อินพุตคือ 1. เปิดวงเล็บอักขระ 2. ปิดอักขระวงเล็บปิด 3. สตริงที่จะเยื้อง Juan: เราสามารถสันนิษฐานได้ว่าถึงแม้ว่ารหัสไม่จำเป็นต้องพึ่งพาสิ่งที่ฉันหมายถึงคือถ้า delim เป็นส่วนหนึ่งของการเปิดเครื่องหมายวงเล็บเพิ่มการเยื้องมิฉะนั้นถ้าส่วนหนึ่งของการปิดวงเล็บวงเล็บลดการเยื้อง
Prashant Bhate

1
@Phasant Bhate: และในการส่งออกหรือไม่
Lowjacker

คำตอบ:


6

ทับทิม, 106 101 96 95

s,e,i=$*
i.scan(/[#{z=Regexp.quote s+e}]|[^#{z}]*/){|l|puts'  '*(s[l]?~-$.+=1:e[l]?$.-=1:$.)+l}

อินพุตถูกจัดเตรียมผ่านบรรทัดรับคำสั่ง


1
คุณสามารถบันทึก 4 ตัวอักษรโดยใช้แทน~-j+=1 (j+=1;j-1)นอกจากนี้การใช้$.ทุกที่แทนที่จะjอนุญาตให้คุณลบj=0ซึ่งจะบันทึกอักขระอื่น
Ventero

6

Perl - 131 96 94 ตัวอักษร

$i="";for$_(split/([\Q$ARGV[0]$ARGV[1]\E])/,$ARGV[2]){$i=~s/..// if/[\Q$ARGV[1]\E]/;print "$i$_\n"if$_;$i.='  'if/[\Q$ARGV[0]\E]/;}

ดูเหมือนว่าควรมีที่ว่างสำหรับการกำจัดนิพจน์ทั่วไปอย่างน้อยที่สุด แต่มันก็เป็นวิธีที่รวดเร็วในการจัดการกับตัวอย่างเช่นเดียวกับ Joey Adams ที่มีสมมุติฐานเกี่ยวกับวงเล็บโดยพลการ


มีห้องมากมายสำหรับการปรับปรุง:

$_=pop;($s,$e)=map"[\Q$_\E]",@ARGV;for(split/($s|$e)/){print"  "x($i-=/$e/),"$_\n"if$_;$i+=/$s/}

... และยังมีอีก:

$_=pop;($s,$e)=map"[\Q$_\E]",@ARGV;map{print"  "x($i-=/$e/),"$_\n"if$_;$i+=/$s/}split/($s|$e)/

3

Mathematica (ไม่ใช่รหัสกอล์ฟ)

indent[str_String]:=Module[{ind,indent,f},
ind=0;
indent[i_]:="\n"<>Nest["    "<>ToString[#]&,"",i];
f[c_] :=  (indent[ind] <> c <> indent[++ind]) /; StringMatchQ["[({",___~~c~~___];
f[c_] := ( indent[--ind] <> c <>indent[ind])  /; StringMatchQ["])}",___~~c~~___];
f[c_] := (c <>indent[ind])       /; StringMatchQ[";,",___~~c~~___];
f[c_] := c  ;
f /@ Characters@ str//StringJoin
]

ทดสอบ

indent["abc{xyz{text[note{comment(t{ex}t)abc}]}}"]
abc
{
    xyz
    {
        text
        [
            note
            {
                comment
                (
                    t
                    {
                        ex
                    }
                    t
                )
                abc
            }

        ]

    }

}

เป็นโบนัสสามารถใช้ฟังก์ชันต่อไปนี้เพื่อจัดรูปแบบนิพจน์ทางคณิตศาสตร์

format[expr_] := indent[expr // FullForm // ToString]

EDIT (ไม่ใช่โค้ดกอล์ฟ) อัปเดตด้วยการควบคุมที่ละเอียดกว่าวิธีการแสดงบรรทัดใหม่

indent[str_String, ob_String, cb_String, delim_String] := 
  Module[{ind, indent, f, tab}, ind = 0; tab = "    ";
   indent[i_, tab_, nl_] := nl <> Nest[tab <> ToString[#] &, "", i];
   f[c_] := (indent[ind, "", " "] <> c <> indent[++ind, tab, "\n"]) /;StringMatchQ[ob, ___ ~~ c ~~ ___];
   f[c_] := (indent[--ind, "", " "] <> c <> indent[ind, tab, "\n"]) /;StringMatchQ[cb, ___ ~~ c ~~ ___];
   f[c_] := (c <> indent[ind, tab, "\n"]) /;StringMatchQ[delim, ___ ~~ c ~~ ___];
   f[c_] := c;
   f /@ Characters@str // StringJoin];
format[expr_] := indent[expr // InputForm // ToString, "[({", "])}", ";"];

format[Hold@Module[{ind, indent, f, tab}, ind = 0; tab = "    ";
 indent[i_, tab_, nl_] := nl <> Nest[tab <> ToString[#] &, "", i];
 f[c_] := (indent[ind, "", " "] <> c <> indent[++ind, tab, "\n"]) /;StringMatchQ[ob, ___ ~~ c ~~ ___];
 f[c_] := (indent[--ind, "", " "] <> c <> indent[ind, tab, "\n"]) /;StringMatchQ[cb, ___ ~~ c ~~ ___];
 f[c_] := (c <> indent[ind, tab, "\n"]) /;StringMatchQ[delim, ___ ~~ c ~~ ___];
 f[c_] := c;
 f /@ Characters@str // StringJoin]]

เอาท์พุต

Hold [
    Module [
         {
            ind, indent, f, tab }
        , ind = 0;
         tab = "    ";
         indent [
            i_, tab_, nl_ ]
         := StringJoin [
            nl, Nest [
                StringJoin [
                    tab, ToString [
                        #1 ]
                     ]
                 & , "", i ]
             ]
        ;
         f [
            c_ ]
         := StringJoin [
            indent [
                ind, "", " " ]
            , c, indent [
                ++ind, tab, "\n" ]
             ]
         /;
         StringMatchQ [
            ob, ___~~c~~___ ]
        ;
         f [
            c_ ]
         := StringJoin [
            indent [
                --ind, "", " " ]
            , c, indent [
                ind, tab, "\n" ]
             ]
         /;
         StringMatchQ [
            cb, ___~~c~~___ ]
        ;
         f [
            c_ ]
         := StringJoin [
            c, indent [
                ind, tab, "\n" ]
             ]
         /;
         StringMatchQ [
            delim, ___~~c~~___ ]
        ;
         f [
            c_ ]
         := c;
         StringJoin [
            f / @
                 Characters [
                    str ]
                 ]
             ]
         ]

นั่นคือรหัสกอล์ฟที่แทบจะไม่มีชื่อที่มีหลายตัวละครเหมือนindentกัน เป้าหมายของคุณคือการย่อโค๊ตสูงสุดหรือสามารถอ่านได้หรือไม่ มีหลายวิธีในการทำให้รหัสนั้นสั้นลงหากเป็นเป้าหมายของคุณ นอกจากนี้: "คุณไม่สามารถเขียนรหัสรายการอักขระ" วงเล็บ "ได้ยาก แต่นั่นไม่ใช่สิ่งที่คุณทำที่นี่หรือ อย่างไรก็ตามขอโทษที่ฟังดูแย่มาก มันทำให้ฉันเป็นคำตอบที่แปลกสำหรับความท้าทายของคุณเอง
Mr.Wizard

1
@ Mr.Wizard ไม่ใช่รหัสกอล์ฟฉันได้เพิ่มไว้เพื่อการอ้างอิงของฉันเอง [อัพเดตเพื่อให้ชัดเจน] ฉันใช้มันบ่อยๆเพื่อทำความเข้าใจกับรหัส mathematica ที่ยังไม่ฟอร์แมตซึ่งมีขนาดใหญ่กว่าหน้าหนึ่ง
Prashant Bhate

3

JavaScript, 255 227 205 ตัวอักษร

เฮ้ความยาวของมันพอดีเป็นไบต์! : D

function(s,e,t){R=eval.bind(0,"Array(n).join(' ')");for(i=n=0,b=r='';c=t[i++];)~s.indexOf(c)?(r+=b,b='\n'+R(++n)+c+'\n '+R(++n)):~e.indexOf(c)?b+='\n'+((n-=2)?R()+' ':'')+c+'\n'+(n?R()+' ':''):b+=c;return r+b}

มันคือฟังก์ชั่นส่งผ่านตัวอักษรเริ่มต้นตัวอักษรสุดท้ายแล้วตัวอักษร


ความคิดเห็นการแก้ไขของคุณเองถูกนำมาใช้กับคุณ : D
Doorknob

@ Doorknob: ฉัน ... ฉันคิดว่าฉันไม่เคยทำแบบนั้น D: ฉันขอโทษ (คุณถูกล่าสัตว์?)
Ry-

@ Doorknob: และขอบคุณสำหรับการเตือนฉันเกี่ยวกับเรื่องนี้; สั้นลง :)
Ry-

ไม่ฉันไม่ได้ล่าสัตว์เพิ่งสะดุดกับคำถามนี้ แต่ฉันตัดสินใจแล้วและฉันพบสิ่งนี้ : O: P
Doorknob

2

Python - 162 ตัวอักษร

i=f=0
s=""
l,r,z=[raw_input()for c in'   ']
o=lambda:s+("\n"+"  "*i)*f+c
for c in z:
 if c in l:f=1;s=o();i+=1
 elif c in r:i-=1;f=1;s=o()
 else:s=o();f=0
print s

โปรดทราบว่างานเรียกใช้วงเล็บสองชุดให้เป็นส่วนหนึ่งของอินพุตไม่ใช่ฮาร์ดโค้ด
Joey

@ โจอี้ตั้งข้อสังเกตว่าฉันจะได้รับการแก้ไขในขณะที่ ขอบคุณ
Juan

2

Python 2.7.X - 136 ตัวอักษร

import sys
a,c=sys.argv,0
for i in a[3]:
 if not(i in a[2]):print ' '*c+i
 else:print ' '*(c-4)+i
 if i in a[1]:c+=4
 if i in a[2]:c-=4

การใช้งาน : $ ./foo.py '(' ')' '(ab (cd (ef) gh) ij)'

ผลลัพธ์ที่ได้:

(
    a
    b
    (
        c
        d
        (
            e
            f
        )
        g
        h
    )
    i
    j
)

คุณต้องการช่องว่างหลังprintข้อความหรือไม่
Zacharý

2

C - 213 209

ฉันเกลียดความผิดพลาดโง่ ๆ ... >. <

#include<stdio.h>
#include<string.h>
int main(int i,char**s){for(char q,r,c,t,a=0;~(c=getchar());t=q|r){q=!!strchr(s[1],c);a-=r=!!strchr(s[2],c);for(i=0;t|q|r&&i<2*a+1;putchar(i++?' ':'\n'));a+=q;putchar(c);}}

อ่าน parens ซ้ายจากอาร์กิวเมนต์บรรทัดคำสั่งแรก, parens ขวาจากอาร์กิวเมนต์ที่สอง, และอินพุตเพื่อเยื้องบน stdin

พิมพ์สวย & แสดงความคิดเห็น:

int main(int i, char **s) {
  for (char q, r, /* is left-paren? is right-paren? */
            c,    /* character read from input */
            t,    /* last char was a paren-char */
            a=0;  /* indentation */
       ~(c = getchar());
       t = q|r) {
         q = !!strchr(s[1],c);
    a -= r = !!strchr(s[2],c);
    for (i=0; t|q|r && i<2*a+1; putchar(i++? ' ' : '\n'));
    a += q;
    putchar(c);
  }
}

1

C ( 159 225 ตัวอักษร)

#define q(s,c)strchr(s,c)
#define p(i,j,k)printf("\n%*s%c%c%*s",i,"",*s,k,j,"")
g(char*b,char*e,char*s){int i;for(i=0;*s;s++)q(b,*s)?p(i-2,i+=2,'\n'):q(e,*s)?q(b,*(s+1))||q(e,*(s+1))?p(i-=2,i-2,0):p(i-=2,i-2,'\n'):putchar(*s);}

มันมีค่าใช้จ่ายเพิ่ม 66 ตัวอักษรเพียงเพื่อแก้ไขข้อบกพร่องด้วยบรรทัดว่าง :( ตรงไปตรงมาฉันต้องการวิธีการใหม่ แต่ฉันจะเรียกมันว่าวันสำหรับตอนนี้

#define p(i,j)printf("\n%*s%c\n%*s",i,"",*s,j,"")
f(char*b,char*e,char*s){int i;for(i=0;*s;s++){strchr(b,*s)?p(i-2,i+=2):strchr(e,*s)?p(i-=2,i-2):putchar(*s);}}

วิธีที่รวดเร็วและสกปรก มันมีข้อผิดพลาดในการสร้างบรรทัดว่างระหว่างวงเล็บปิดที่ต่อเนื่องกัน แต่อย่างอื่นมันก็ทำงาน (หรืออย่างนั้นฉันก็คิด) ฉันจะกลับมาอีกครั้งเพื่อหาทางออกที่ดีกว่า & สะอาดกว่าในช่วงสัปดาห์นี้

ถ่าน * bคือชุดวงเล็บเปิด, ถ่าน * eเป็นชุดวงเล็บปิดและถ่าน * sคือสตริงอินพุต


1

Perl - 69 ไบต์

TMTOWTDI ทำให้โค้ดง่าย

#!perl -p
s/([[{(<])|([]})>])|\w+/"  "x($1?$t++:$2?--$t:$t)."$&
"/ge

3
คุณควรใช้วงเล็บเป็นตัวป้อนข้อมูลไม่ใช่ hardcode พวกมัน
Gareth

1

สกาลา (2.9), 211 ตัวอักษร

object P extends App{def x(j:Int)={"\n"+"  "*j}
var(i,n)=(0,"")
for(c<-args(2)){if(args(0).exists(_==c)){print(x(i)+c)
i+=1
n=x(i)}else{if(args(1).exists(_==c)){i-=1
print(x(i)+c)
n=x(i)}else{print(n+c)
n=""}}}}

1

Perl - 89 85 ไบต์

เวอร์ชันของคำตอบของ Hojung Youn ซึ่งยอมรับอักขระบล็อกผ่านอาร์กิวเมนต์สองตัว

#!perl -p
BEGIN{$b=pop;$a=pop}s/([$a])|([$b])|\w+/"  "x($1?$t++:$2?--$t:$t)."$&
"/ge

เรียกว่า:

perl golf.pl<<<'abc{xyz{text[note{comment(t{ex}t)abc}]}}' '[{(<' ']})>'

แนวคิดที่ดีมาก @Hojung และ Sorpigal แม้ว่ามันจะเปราะบางนิดหน่อย ตัวอย่างเช่นสลับ] และ} ในอาร์กิวเมนต์โคลสอัพและ] ปิดคลาสของตัวละครซึ่งนำไปสู่ข้อผิดพลาดของพาเรนที่ไม่ตรงกัน ในทำนองเดียวกันสมมติว่าชุดเปิดเริ่มต้นด้วย ^ อาจจะตรงกับ v ในชุดปิด; คุณจะได้รับส่วนเสริมของชั้น [$ a] นั่นเป็นเหตุผลที่ฉันใช้ \ Q ... \ E ในคำตอบของฉัน \ w + สำหรับอักขระที่ไม่ใช่แบบ Paren ใช้งานได้สำหรับตัวอย่าง แต่สิ่งที่เกี่ยวกับอินพุตเช่น 'x (foo-bar) y' '(' ')'? แน่นอนมันไม่ชัดเจนว่ารหัสต้องจัดการกับอะไรแบบนั้น
DCharness

1

Python3, 184 182 ตัวอักษร

import sys
_,p,q,t=sys.argv
i,f,x=0,1,print
for e in t:
 if e in p:f or x();x(' '*i+e);i+=2;f=1
 elif e in q:f or x();i-=2;f=1;x(' '*i+e)
 else:not f or x(' '*i,end='');f=x(e,end='')

ตัวอย่าง:

$ python3 ./a.py '{[(<' '}])>' 'abc{xyz{text[note{comment(t{ex}t)abc}]}}'
abc
{
  xyz
  {
    text
    [
      note
      {
        comment
        (
          t
          {
            ex
          }
          t
        )
        abc
      }
    ]
  }
}

heinrich5991แนะนำให้บันทึกอักขระสองตัวโดยเปลี่ยนบรรทัดที่สองเป็น_,p,q,t=sys.argv
Peter Taylor

1

Groovy, 125

p=args;i=0;s={a,b->"\n"+"\t"*(b?i++:--i)+a+"\n"+"\t"*i};p[0].each{c->print p[1].contains(c)?s(c,1):p[2].contains(c)?s(c,0):c}

คุณสามารถบันทึกสคริปต์ในไฟล์ indent.groovy และลองด้วย:
groovy indent.groovy "abc {xyz {ข้อความ [หมายเหตุ {ความคิดเห็น (t {ex} t) abc}]}}" "[[" ") ]}"


ฉันลองใช้ Groovy เป็นเวลาหนึ่งชั่วโมงก่อนที่จะเห็นคำตอบของคุณฉันใช้ aproach ที่คล้ายกัน แต่ของฉันนั้นยาวกว่าของคุณมากดังนั้นฉันจะไม่รำคาญที่จะโพสต์ .. ดีมาก! :)
Fels

1

Python - 407

from sys import*;o=argv[1];c=argv[2];t=argv[3];p=0;n=False;a=lambda:h not in e;b=lambda s:print(s+(" "*p)+h);r="";e=o+c
for h in t:
 for k in o:
  if h==k:
   if(r in e)and(r!=""):b("")
   else:b("\n")
   p+=2;n=True;break
 for k in c:
  if h==k:
   p-=2
   if(r in e)and(r!=""):b("")
   else:b("\n")
   n=True;break
 if a()and n:print((" "*p)+h,end="");n=False
 elif a():print(h,end="")
 r=h

โปรแกรมเวอร์ชันที่ไม่ดีขึ้น:

import sys

open_set = sys.argv[1]
close_set = sys.argv[2]
text = sys.argv[3]
spaces = 0
newline = False
a = lambda : char not in b_set
b = lambda s: print(s + (" " * spaces) + char)
prev = ""
b_set = open_set + close_set

for char in text:
    for bracket in open_set:
        if char == bracket:
            if (prev in b_set) and (prev != ""):
                b("")
            else:
            b("\n")
        spaces += 2
        newline = True
        break
    for bracket in close_set:
        if char == bracket:
            spaces -= 2
            if (prev in b_set) and (prev != ""):
                b("")
            else:
                b("\n")
            newline = True
            break
    if a() and newline:
        print((" " * spaces) + char, end="")
        newline = False
    elif a():
        print(char, end="")
    prev = char

อาร์กิวเมนต์ของโปรแกรมคือ (ตามลำดับ): วงเล็บเปิด, วงเล็บปิดและข้อความที่จะเยื้อง

ตัวอย่าง ($ เป็นพรอมต์บรรทัดคำสั่ง):

$ python indent.py "{[(<" "}])>" "abc{xyz{text[note{comment(t{ex}t)abc}]}}"
abc
{
  xyz
  {
    text
    [
      note
      {
        comment
        (
          t
          {
            ex
          }
          t
        )
        abc
      }
    ]
  }
}

0

D (300)

C[] i(C,S)(ref S s,C p){if(!*s)return[];static C[] w;w~=" ";C[] r;C c=s[0];while(c!=p){s=s[1..$];r~=(c=='{'||c=='['||c=='<'?"\n"~w~c~"\n"~i(s,cast(char)(c+2)):c=='('?"\n"~w~c~"\n"~i(s,')'):[c]);c=*s;}w=w[1..$];if(*s)s=s[1..$];c=*s;return" "~w~r~"\n"~w~(c=='}'||c==']'||c=='>'||c==')'?[p]:p~"\n"~w);}

ต้องการสตริงที่สิ้นสุดด้วยค่า null สำหรับการตรวจสอบขอบเขต (มิฉะนั้นif(*s)จะต้องเปลี่ยนเป็นif(s.length))


โปรดทราบว่างานเรียกใช้วงเล็บสองชุดให้เป็นส่วนหนึ่งของอินพุตไม่ใช่ฮาร์ดโค้ด
Joey

0

ชวา

ไม่ใช่codegolf version! สมมติว่าเรามีsplit ()รุ่นนี้ที่มี delims

public static String indent(String input, String openPars,
        String closingPars) {
    String re = "["
            + (openPars + closingPars).replace("[", "\\[").replace("]",
                    "\\]") + "]";
    String[] split = inclusiveSplit(input, re, 0);
    int indent = 0;
    StringBuilder sb = new StringBuilder();
    for (String string : split) {
        if (StringUtils.isEmpty(string))
            continue;
        if (closingPars.indexOf(string) != -1) {
            indent--;
        }
        sb.append(StringUtils.repeat(" ", indent * 2));
                    sb.append(string);
                    sb.append("\n");
        if (openPars.indexOf(string) != -1) {
            indent++;
        }
    }
    String string = sb.toString();
    return string;
}

2
StringUtilsไม่ได้เป็นส่วนหนึ่งของ Standard JDK
st0le

0

C 284 อักขระที่ไม่ใช่ white space

ฉันเป็นแฟนตัวยงของความสับสน แต่ไม่ดี ...

#include<cstdio>
#include<cstring>
#define g printf
#define j char
int main(int a,j**b){int c=0;for(j*f=b[3];*f!='\0';++f){if(strchr(b[1],*f)!=0){g("\n%*c\n%*c",c,*f,c+2,'\0');c+=2;}else if(strchr(b[2],*(f))!=0){c-=2;g("\n%*c",c,*f);if(strchr(b[2],*(f+1))==0)g("\n%*c",c,'\0');}else putchar(*f);}}

การใช้งาน: ./program start_brackets end_brackets string_to_parse


0

php (187) (153)

function a($s,$o,$e){while(''!=$c=$s[$i++]){$a=strpbrk($c,$o)?2:0;$b=strpbrk($c,$e)?2:0;echo ($a+$b||$r)?"\n".str_pad('',$t-=$b):'',$c;$t+=$a;$r=$a+$b;}}

ฟังก์ชั่นใช้สตริงการเปิดตัวคั่นสิ้นสุดตัวคั่นเป็นอาร์กิวเมนต์


0

C, 256

พารามิเตอร์:

  • eคือตัวละครสุดท้าย
  • nคือการเยื้อง
  • bวงเล็บเปิด
  • dวงเล็บปิด

ฉันทำลายรหัสขึ้นเพื่อหลีกเลี่ยงแถบเลื่อนแนวนอน

#define r char
#define P(c) putchar(c);
#define N P(x)
#define W printf("%*s",n,"");
r*s,x='\n';i(r e,int n,r*b,r*d){r*t=s,*p;int l=0;W while(*s!=e)    
{if(p=strchr(b,*s)){if(s!=t){N W}P(*s++)N i(d[p-b],n+2,b,d); N W 
P(*s++);l=1;}else{if(l){N W l=0;}P(*s++)}}}

โปรแกรมที่สมบูรณ์คือ 363 ตัวอักษร

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define r char
#define P(c) putchar(c);
#define N P(x)
#define W printf("%*s",n,"");
r*s,x='\n';i(r e,int n,r*b,r*d)
{r*t=s,*p;int l=0;W while(*s!=e)
{if(p=strchr(b,*s)){if(s!=t){N W}
P(*s++)N i(d[p-b],n+2,b,d); N W
P(*s++);l=1;}else{if(l){N W l=0;}
P(*s++)}}}main(int c,r*v[]){s =
v[3];i('\0',0,v[1],v[2]);}

0

VB.net (? c)

ภาษาไม่เหมาะกับการเขียนโปรแกรมกอล์ฟดังนั้นฉันจึงใช้วิธีการที่ผิดปกติ การใช้ listener การติดตามเพื่อส่งออกไปยังคอนโซล

Imports System.Diagnostics.Debug
Module Module1
  Sub Main(args() As String)
    IndentText(args(0), args(1), args(2)) 'openings, closings, text)
  End Sub
  Sub IndentText(o As String, e As String, t As String)
    Dim x = 0
    Listeners.Add(New Diagnostics.ConsoleTraceListener)
    IndentSize = 2
    For Each c In t
      If o.Contains(c) Then
        WriteLine("")
        WriteLine(c)
        Indent()
        x = 1
      ElseIf e.Contains(c) Then
        If x = 0 Then WriteLine("")
        Unindent()
        WriteLine(c)
        x = 1
      Else
        Write(c)
        x = 0
      End If
    Next
  End Sub
End Module

ใช้ commandline args สำหรับอินพุต

args(0) is the indenting chars
args(1) is the undenting chars
args(2) is the text to be indented.

0

Powershell, 146 ไบต์

param([char[]]$s,[char[]]$e,[char[]]$f)$f|%{}{if($_-in$s){$o;'  '*$i+$_;$o='  '*++$i;}elseif($_-in$e){$o;'  '*--$i+$_;$o='  '*$i}else{$o+=$_}}{$o}

คำอธิบายที่ไม่ดี

param([char[]]$start,             # Cast as array of Chars
      [char[]]$end,
      [char[]]$string)
$string | foreach-object { } {    # For every char in string. Empty Begin block
    if ( $_ -in $start ) {        # If char is in start
        $o                        # Print stack ($o)
        '  ' * $i + $_            # Newline, indent, insert start char
        $o = '  ' * ++$i          # Set stack to ident (incremented)
    } elseif ( $_ -in $end ) {    # If char is in end
        $o                        # Print stack
        '  ' * --$i + $_          # Newline, decrement indent, insert end char
        $o = '  ' * $i            # Set stack to indent
    } else {
        $o+ = $_                  # Otherwise add character to stack
    }
} { $o }                          # Print remaining stack (if any)

0

C, 181 ตัวอักษร

#define d(m,f)if(strchr(v[m],*s)){puts("");for(j=f;j--;)printf("  ");}
i;main(j,v,s)char**v,*s;{for(s=v[3];*s;s++){d(1,i++)d(2,--i)putchar(*s);d(1,i)if(!strchr(v[2],*(s+1)))d(2,i)}}

วิธีที่ตรงไปตรงมาที่สุดเท่าที่จะจินตนาการได้ วนซ้ำผ่านสตริง (v [3]) หากเป็นวงเล็บปีกกาซ้าย (ตามที่กำหนดใน v [1]) ให้เพิ่มระดับการเยื้องถ้าเป็นวงเล็บปีกกาที่ถูกต้อง (ตามที่นิยามไว้ใน v [2]) ลดระดับการเยื้อง .


-1

C, 114 121

main(i,x,s,c){while(~(c=getchar()))(s=x)|(x=2*!!strchr("(){}[]<>",c))?s=c-1&x,i-=x-2*s,printf("\n%*c",i-s,c):putchar(c);}

ไม่ดีมาก แต่วิธีแก้ไข .. บรรทัดว่างอาจปรากฏขึ้นก่อน / หลังขึ้นอยู่กับว่าอินพุตเริ่มต้น / เสร็จสิ้นด้วยวงเล็บ

ด้วยข้อ จำกัด ใหม่วิธีนี้เกือบไร้ประโยชน์สำหรับการเล่นกอล์ฟ


ไม่เยื้องวงเล็บเปิดมากพอและเอาท์พุทบรรทัดว่างเปล่าระหว่างวงเล็บปิดติดต่อกัน
Joey

@ แก้ไขแล้วขอบคุณสำหรับความคิดเห็น!
esneider

มันยังคงยากรหัสวงเล็บในขณะที่พวกเขาควรจะเป็นส่วนหนึ่งของการป้อนข้อมูล ปัจจุบันคำตอบทั้งหมดไม่เป็นไปตามข้อกำหนด
Joey
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.