Formatter Penjelasan Kode

32

Pengajuan golf kode yang sukses, pada dasarnya, dipenuhi dengan simbol-simbol gila di semua tempat. Untuk membuat pengajuan mereka lebih mudah dimengerti, banyak pegolf kode memilih untuk memasukkan penjelasan kode mereka. Dalam penjelasan mereka, garis kode diubah menjadi diagram yang meledak secara vertikal.

Misalnya, jika ini adalah kode saya:

1_'[3:~2@+]`

Salah satu dari banyak diagram yang mungkin saya buat akan terlihat seperti ini:

1           
 _'         
   [      ] 
   [3:    ] 
   [  ~   ] 
   [   2@ ] 
   [     +] 
           `

Hasil

Dalam tantangan ini, Anda akan menulis alat pemformatan otomatis penjelasan yang mengambil baris kode dan membuat diagram yang dapat dengan mudah ditambahkan teks penjelasan.

Untuk menjadikan ini tantangan yang lebih bermanfaat , pengguna akan dapat menentukan konten setiap baris, dengan memberikan string pemformatan. String pemformatan akan menjadi baris kedua, hanya berisi huruf A-Za-z, yang panjangnya sama dengan program. Huruf-huruf menunjukkan urutan di mana karakter program harus dicetak dalam penjelasan.

Berikut ini adalah contoh I / O tanpa pemformatan seperti braket :

123423
AabcBC

1     
    2 
     3
 2    
  3   
   4  

Kurung

Jika lebih dari satu karakter dalam program memiliki tingkat prioritas yang sama, maka set karakter tersebut bertindak sebagai satu blok kode (jika mereka membentuk grup) atau seperangkat tanda kurung (jika mereka mengandung karakter lain di antaranya). Aturan umum sederhana:

  1. Karakter tidak muncul dalam garis diagram sampai semua karakter lain yang memiliki prioritas lebih besar telah muncul pada garis di atasnya dalam diagram.

  2. Karakter dengan prioritas yang sama selalu dicetak pada baris yang sama. Jika karakter tertentu muncul di baris, semua karakter lain dengan prioritas yang sama muncul di baris.

  3. Serangkaian karakter dengan prioritas yang sama terus muncul di setiap baris sampai semua karakter lain yang terlampir dengannya muncul setidaknya satu kali. Ini memungkinkan konstruksi "seperti braket". Jika bceabprioritas, maka bkarakter akan muncul di baris kedua (mereka adalah prioritas tertinggi kedua) dan akan terus muncul sampai semua ceakarakter muncul. Jika string prioritas adalah abcadeafga, maka semua bcdefgdianggap terkandung di dalamnya, semua 4 as akan terus muncul sampai gmuncul.

Persyaratan pemformatan lainnya

Semua garis output harus memiliki panjang yang sama (panjang jalur input), diisi dengan spasi sesuai kebutuhan. Baris program input dapat berisi spasi, meskipun spasi tersebut juga akan diberikan surat prioritas. Mengejar baris baru pada output / input adalah opsional.

Mencetak gol

Ini adalah kode golf, byte paling sedikit menang.


Contohnya

Berikut adalah contoh kode yang dikomentari dengan pemformatan yang lebih kompleks.

1_'[3:~2@+]`
abbcddeffgch

1            #highest priority is denoted by the lowercase letter a
 _'          #priority b
   [      ]  #all characters with priority c
   [3:    ]  #priority d, but priority c still printed because it encloses more
   [  ~   ]  #priority e
   [   2@ ]  #priority f
   [     +]  #priority g, last line of c because all enclosed characters have appeared
           ` #priority h

Contoh dalam Perl:

$_=<>;s/[^aeiou\W]/$&o$&/gi;print
aaaaaabbccccccccccbdddddbbbbeeeee

$_=<>;                           
      s/          /     /gi;     
      s/[^aeiou\W]/     /gi;     
      s/          /$&o$&/gi;     
                            print

Berikut adalah beberapa contoh dalam CJam, milik Martin Büttner:

l~2*{_2%{3*)}{2/}?_p_(}g;
aabbcdddefffeeggeehhiiccj

l~                       
  2*                     
    {                 }g 
    {_2%              }g 
    {   {   }{  }?    }g 
    {   {3*)}{  }?    }g 
    {   {   }{2/}?    }g 
    {             _p  }g 
    {               _(}g 
                        ;

q{_eu'[,66>"EIOU"-#)g{'o1$}*}/
abcccddddddeeeeeeefgghiijjhhbb

q                             
 {                          }/
 {_eu                       }/
 {   '[,66>                 }/
 {         "EIOU"-          }/
 {                #         }/
 {                 )g       }/
 {                   {    }*}/
 {                   {'o  }*}/
 {                   {  1$}*}/

Berikut adalah contoh gila hanya untuk mengacaukan Anda:

1_'[3:~2@+]`
azTABACBDCAT

   [ :    ] 
   [3: 2  ] 
   [3:~2 +] 
   [ :~ @+] 
  '        `
1           
 _          

Berikut adalah contoh yang lebih eksplisit tentang apa yang terjadi ketika tanda kurung bertumpuk abab. (Biasanya, ini bukan cara Anda memilih untuk memformat penjelasan Anda.)

aabbccddaaeebb
aabbccddaaeebb

aa      aa    
aabb    aa  bb
aabbcc  aa  bb
aabb  ddaa  bb
  bb      eebb #"aa" no longer appears because all of "bbccdd" have already appeared.
PhiNotPi
sumber

Jawaban:

14

Pyth, 33 40 byte

JwFHS{Js.e?@zk&gHYsm&gdH}d>_>JxJYx_JYJdJ

Cobalah secara online: Pyth Compiler / Executor

Penjelasan:

Dihasilkan dengan string aabbbbbzccdeeegfffqhjiiikkpnmmllloooohec:

                                          implicit: z = first input line
Jw                                        J = second input line
  FHS{J                                   for H in sorted(set(J)):
        .e                             J    map each k,Y of enumerate(J) to:
        .e?                            J      .... if ... else ...
        .e @zk                        dJ      z[k] if ... else " "
                                              condition: 
        .e @zk gHY                    dJ        H >= Y
        .e @zk&                       dJ        and
        .e @zk     m                 JdJ        map each d of J to:
        .e @zk     m gdH             JdJ          d >= H
        .e @zk     m&                JdJ          and
        .e @zk     m    }d           JdJ          d in ...
        .e @zk     m          xJY    JdJ          index of Y in J
        .e @zk     m        >J       JdJ          substring of J (from index to end)
        .e @zk     m       _         JdJ          reverse substring
        .e @zk     m             x_JYJdJ          index of Y in reversed J
        .e @zk     m      >          JdJ          substring of reversed (from index to end)
        .e @zk    s                   dJ       sum up the booleans (acts as any)
       s                                    sum up the chars and print

Jadi jalur input pertama adalah z, jalur input kedua adalah J.

Loop berulang di atas semua karakter Jdalam urutan dan tanpa duplikat. Char saat ini disebut H.

Kemudian untuk masing-masing Ydari Jsaya mencetak karakter koresponden zatau spasi putih, tergantung pada apakah kedua kondisi berikut dipenuhi:

  • Y <= H(char pertama kali muncul di baris H)
  • ada char d >= H, yang muncul di blok dimulai dan diakhiri dengan Y(tanda kurung).

Contohnya

Ini menunjukkan bagaimana baris keempat dari input abcdaeb, abcdaebdicetak. Baris keempat adalah representasi yang baik, karena sebagian besar kasus yang mungkin terjadi:

code input:  "abcdaeb"
order input: "abcdaeb"

printing the fourth line, H = "d":

   "a" is printed, because "a" <= "d" and ("d" >= "d" and "d" is in "abcda")
   "b" is printed, because "b" <= "d" and ("d" >= "d" and "d" is in "bcdaeb")
   "c" are not printed, because neither "d" nor "e" (chars >= "d") are not in "c"
   "d" is printed, because "d" <= "d" and ("d" >= "d" and "d" is in "d")
   "a" is printed, because "a" <= "d" and ("d" >= "d" and "d" is in "abcda")
   "e" is not printed, because "e" > "d"
   "b" is printed, because "b" <= "d" and ("d" >= "d" and "d" is in "bcdaeb")

therefore the fourth line is: aabb__ddaa__bb

Dan contoh lain berdasarkan pada test-case, @Optimizer memberi saya. (yang menghancurkan solusi saya).

code input:  "acab"
order input: "acab"

printing the second line, H = "b":

   "a" is printed, because "a" <= "b" and ("c" >= "b" and "c" is in "aca")
   "c" is not printed, because "c" > "b"
   "a" is printed, because "a" <= "b" and ("c" >= "b" and "c" is in "aca")
   "b" is printed, because "b" <= "b" and ("b" >= "b" and "b" is in "b")

therefore the second line is: a_ab

Versi lama: 58 57 52 byte

JwKNFHS{J=K.e?eS>_>[email protected]?@zknYNdK=KXKHN

Cobalah secara online: Pyth Compiler / Executor

Ini menciptakan topeng, yang akan saya modifikasi sebelum dan sesudah mencetak setiap baris. Untuk informasi lebih lanjut lihat riwayat edit.

Jakube
sumber
8

CJam, 82 byte

Cukup lama saat ini dan saya pikir saya bisa mencukur beberapa byte lagi.

leel:F]z::+F$_&\f{{W=1$=},\;}{]_{0f=_W=),\0=>Lf&Ra#)},F,S*\:+{~;1$L+:L;t}%oNo~}%];

Algoritma

Algoritma dasar adalah sebagai berikut:

  • leel:F]z::+ : Kelompokkan kode, pemformatan, dan indeks masing-masing karakter secara bersamaan
  • F$_&\f{{W=1$=},\;}: Kelompokkan kembar tiga di atas ke dalam prioritas pencetakan menggunakan string pemformatan. Kode ini juga memastikan bahwa prioritas diurutkan.
  • ]_{0f=_W=),\0=>Lf&Ra#)},: Untuk setiap grup prioritas kembar tiga, dapatkan rentang indeks terikat dan lihat apakah indeks apa pun belum dicetak. Jika ada indeks yang belum dicetak, sertakan grup prioritas ini ke dalam grup "yang akan dicetak dalam langkah ini".
  • F,S*\:+{~;1$L+:L;t}%oNo~}%: Setelah membuat semua grup untuk dicetak dalam langkah ini, isi kode ke dalam indeks yang benar dari string spasi kosong dan kemudian cetak string itu. Perbarui juga larik yang berisi daftar indeks yang dicetak.

Penjelasan kode harus diikuti ketika saya selesai bermain golf ini.

Contoh

Berikut adalah kode yang dijalankan pada kode itu sendiri:

Memasukkan:

leel:F]z::+F$_&\f{{W=1$=},\;}{]_{0f=_W=),\0=>Lf&Ra#)},F,S*\:+{~;1$L+:L;t}%oNo~}%];
aaabbbcccccdddddeefgghhiffggejkklmmmnoooopppqrrrssssllttttuuuvwwxxxxxxxyvvzzzzjjjj

Keluaran:

lee                                                                               
   l:F                                                                            
      ]z::+                                                                       
           F$_&\                                                                  
                f{          }                                                     
                f{{     },  }                                                     
                f{{W=   },\;}                                                     
                f{{W=1$ },\;}                                                     
                f{{W=  =},\;}                                                     
                             {                                                }%];
                             {]_                                              }%];
                             {  {                   },                        }%];
                             {  {0f=                },                        }%];
                             {  {   _               },                        }%];
                             {  {    W=),           },                        }%];
                             {  {        \0=        },                        }%];
                             {  {           >       },                        }%];
                             {  {            Lf&    },                        }%];
                             {  {               Ra#)},                        }%];
                             {                        F,S*                    }%];
                             {                            \:+                 }%];
                             {                               {          }%    }%];
                             {                               {~;        }%    }%];
                             {                               {  1$L+:L; }%    }%];
                             {                               {         t}%    }%];
                             {                                            oNo~}%];

Cobalah online di sini

Pengoptimal
sumber
oNodapat diganti dengan ndi TIO .
Buah Esolanging
8

CJam, 48 byte

ll:i:T.{___T#TW%@#~T<>+:e>)1$-@*123Se]m>}z_|(;N*

Penjelasan

l                                                Code.
 l                                               Priority.
  :i                                             Convert priority to integer.
    :T                                           Save to T.
      .{                                }        For corresponding items:
      .{___                             }        Copy the current priority 3 times.
      .{   T#                           }        First position with this priority.
      .{     TW%                        }        Reverse T.
      .{        @#                      }        First (last) position with this priority.
      .{          ~T<                   }        Cut T at the end of this priority.
      .{             >                  }        Cut at the beginning of this priority.
      .{              +                 }        Insert the current priority to
                                                 prevent the array being empty.
      .{               :e>              }        Array maximum.
      .{                  )1$-          }        Count of integers between the current
                                                 priority and the maximum, inclusive.
      .{                      @*        }        That number of the current character.
      .{                        123Se]  }        Fill irrelevant priorities with spaces.
      .{                              m>}        Rotate the array to make non-spaces
                                                 starting at the current priority.
                                                 Returns a column containing 123 items.
                                         z       Zip to get the rows from columns.
                                          _|     Remove duplicate rows, including
                                                 unused priorities and all-space rows.
                                            (;   Remove the first row (an all-space row).
                                              N* Insert newlines.
jimmy23013
sumber
6

IDL 8.4, 316 318 304 byte

Versi baru, masih terlalu panjang, tetapi lebih pendek! Dan, dalam semangat sejati IDL, sepenuhnya vektor, yang berarti (karena tidak ada untuk loop) bahwa saya sekarang dapat melakukannya sebagai satu baris, dan menjalankannya sendiri, setelah saya mendapatkan versi saya sepenuhnya ditingkatkan menjadi 8,4. Itu akan diedit nanti.

Versi satu baris:

c=(f='')&read,c,f&l=[0:strlen(f)-1]&c=strmid(c,l,1)&s=strmid(f,l,1)&u=s.uniq()&k=value_locate(u,s)&n=[0:max(k)]&d=hash(n,u.map(lambda(x,y,z:max(z[(r=stregex(y,'('+x+'(.*))?'+x,len=w)):r+w-1])),f,k))&print,n.map(lambda(n,l,c,d,i:i.reduce(lambda(x,i,l,c,d,n:x+(d[l[i]]ge n?c[i]:' ')),l,c,d,n)),k,c,d,l)&end

Dengan jeda baris (jumlah byte yang sama, subtitle \ n vs &), dan berkomentar:

c=(f='') ;initialize code and format as strings
read,c,f ;read two lines of input from the prompt
l=[0:strlen(f)-1] ;index array for the strings
c=strmid(c,l,1) ;split the code string into an array, via substrings of length 1
s=strmid(f,l,1) ;same for the format string, saving f for regex later
u=s.uniq() ;get the sorted unique values in the format string (sorts A->a)
k=value_locate(u,s) ;assign layer values to the format characters
n=[0:max(k)] ;index array for the unique format characters
d=hash(n,u.map(lambda(x,y,z:max(z[(r=stregex(y,'('+x+'(.*))?'+x,len=w)):r+w-1])),f,k))
print,n.map(lambda(n,l,c,d,i:i.reduce(lambda(x,i,l,c,d,n:x+(d[l[i]]ge n?c[i]:' ')),l,c,d,n)),k,c,d,l)
end ;end the script

Berikut ini rincian algoritmik untuk saluran 9:

r=stregex(y,'('+x+'(.*))?'+x,len=w) ; r, w = starting position & length of substring in y {format string} bracketed by x {character} (inclusive)
z[(r=...):r+w-1] ; grab a slice of z {layer array} from r to r+w-1 -> layer values for each character in the substring
max(z[...]) ; max layer (depth) of any characters in that slice
u.map(lambda(x,y,z:max(...)),f,k) ;map an inline function of the above to every element of the unique-formatting-character array
d=hash(n,u.map(...)) ; create a hash using the unique indices, the result is a hash of (character:max_substring_depth)

... dan 10:

x+(d[l[i]]ge n?c[i]:' ')) ; ternary concatenation: if maxdepth for this character >= current depth, add the character, otherwise add ' '
i.reduce(lambda(x,i,c,d,l,n:...)),,l,c,d,n) ;accumulate elements of i {code/format index array} by passing them through the inline ternary concatenation function
print,n.map(lambda(n,l,c,d,i:i.reduce(...)),k,c,d,l) ;map the depth index through the reduction, ending up with a string for each depth layer, then print it

Baris 9 dan 10 melakukan pekerjaan nyata, sisanya mengatur variabel yang Anda butuhkan untuk akhir. Saya pikir ini tentang golf seperti yang akan didapat, saya tidak dapat menemukan tempat lain untuk melakukannya dengan lebih baik.

Versi lama (semua yang ada di bawah ini sudah usang):

Ini tidak cukup pendek untuk menang, karena ini adalah bahasa golf yang mengerikan, tetapi tidak ada yang pernah menjawab di IDL jadi saya hanya akan melakukannya.

a=(b='')
read,a,b
c=[0:strlen(b)-1]
d=strmid(b,c,1)
a=strmid(a,c,1)
e=d[uniq(d,sort(d))]
f=list(value_locate(e,d),/e)
s=hash()
for i=0,max(f)do begin
g=stregex(b,'('+e[i]+'(.*))?'+e[i],l=l)
s[i]=max(f[g:g+l-1])
print,f.reduce(lambda(x,y,z:x+(s.haskey(y)?z[y]:' '),s,a)
s=s.filter(lambda(x,y:x[1]gt y),i)
endfor
end

Saya tidak yakin apakah ada cara saya bisa mengurangi lebih banyak ... Saya bisa memanggil strmid pada a dan b pada saat yang sama, tetapi kemudian saya menghabiskan lebih banyak byte pengindeksan d dan hasilnya sama. Tapi aku akan terus mengusahakannya! (Dan besok saya akan mengedit penjelasan algoritmanya.)

Sirpercival
sumber