Esolang-Comment-Template-Generator


42

Banyak orang di situs ini menggunakan bahasa esoterik , dan karena bahasa-bahasa ini tidak biasa dan sulit dimengerti, mereka akan sering menulis penjelasan dalam format tertentu. Misalnya, jika kodenya

abcdefghijklmnop

Dan bahasa ini digunakan #untuk komentar, mereka akan menulis penjelasan seperti ini:

a                #Explanation of what 'a' does
 bc              #Bc
   d             #d
    e            #Explanation of e
     fgh         #foobar
        ij       #hello world
          k      #etc.
           l     #so on
            mn   #and
              op #so forth

Saya sering melakukan ini juga, tetapi setiap kali saya melakukan ini, saya merasa seperti membuat tata letak teks benar-benar menjengkelkan dan memakan waktu. Jadi saya ingin Anda membuat "Esolang-Comment-Template-Generator" untuk saya. Misalnya, jika kita mengabaikan komentar, kode sebelumnya memiliki templat ini:

a                #
 bc              #
   d             #
    e            #
     fgh         #
        ij       #
          k      #
           l     #
            mn   #
              op #

Tantangan:

Anda harus menulis program atau fungsi yang mengambil dua string sebagai input, dan menampilkan "Esolang-Comment-Templat" ini. Input pertama adalah kode, tetapi dengan bilah ( |) disisipkan di mana baris baru pergi. Masukan kedua adalah apa yang akan kita gunakan untuk komentar. Jadi contoh terakhir kita akan memiliki ini untuk input:

"a|bc|d|e|fgh|ij|k|l|mn|op", "#"

Sayangnya, ini mengecualikan bilah agar tidak menjadi bagian dari input kode, tetapi tidak apa-apa. Anda dapat mengasumsikan bahwa input komentar akan menjadi satu karakter. Demi kesederhanaan, char komentar tidak akan menjadi bilah. Input kode hanya akan berisi ASCII yang dapat dicetak, dan tidak akan berisi baris baru.

Semoga Anda dapat menyimpulkan apa yang harus dilakukan dari testcases, tetapi saya akan mencoba mengklarifikasi beberapa hal.

Anda harus membagi input kode menjadi "bagian kode" di setiap bilah. Kemudian, setiap bagian dari kode adalah output pada barisnya sendiri dan dibiarkan dengan panjang semua kode sebelumnya (tidak termasuk bar). Kemudian, setiap baris diisi dengan spasi yang cukup sehingga dua karakter terakhir pada setiap baris adalah "Satu ruang tambahan" + "Karakter komentar".

Satu trailing newline diperbolehkan.

Ini adalah contoh lain. Untuk input

"Hello|World", "/"

Pertama bagian dari kode "Hello" dan yang kedua adalah "Dunia". Jadi itu harus memberikan output:

Hello      /
     World /

Berikut beberapa contoh lainnya:

Input:
"a|b|c|d|e|f|g", ","

Output:
a       ,
 b      ,
  c     ,
   d    ,
    e   ,
     f  ,
      g ,

Input:
"abcdefg", ":"

Output:
abcdefg :

Input:
"4|8|15|16|23|42", "%"

Output:
4          %
 8         %
  15       %
    16     %
      23   %
        42 %

Input:
"E|ac|h s|ecti|on is| one c|haracte|r longer| than the| last!", "!"

Output:
E                                                   !
 ac                                                 !
   h s                                              !
      ecti                                          !
          on is                                     !
                one c                               !
                     haracte                        !
                            r longer                !
                                     than the       !
                                              last! !

Input:
"This|Code|has||empty||sections", "@"

Output:
This                     @
    Code                 @
        has              @
                         @
           empty         @
                         @
                sections @

Aturan:

Anda dapat mengambil input dan output ini dalam format apa pun yang masuk akal. Misalnya, membaca / menulis file, STDIN / STOUT, argumen fungsi / nilai pengembalian, dll. Seperti biasa, ini adalah , jadi cobalah membuat kode Anda sesingkat mungkin dan Anda menang jika Anda bisa mendapatkan solusi terpendek dalam bahasa anda! Saya juga akan memilih solusi terpendek sebagai pemenang keseluruhan. Celah standar dilarang.



Apakah trailing blank diperbolehkan?
Titus

30
Langkah berikutnya: representasi 3D untuk bahasa 2D
Aaron

3
Bonus jika Anda berhasil melakukannya tanpa menggunakan |karakter akan menyenangkan, sehingga Anda dapat menjelaskan diri Anda sendiri
WorldSEnder

Bisakah karakter komentar menjadi bilah ( |)?
Ton Hospel

Jawaban:



9

Retina , 35 34 byte

Hitungan byte mengasumsikan penyandian ISO 8859-1.

\|
·$'¶$`±
T0-2`·±|p`___ `.+±.|·.+

Dua string input dipisahkan oleh spasi (yang tidak ambigu karena kita tahu bahwa pembatas komentar selalu berupa karakter tunggal).

Cobalah online!


1
Mengapa Anda membutuhkan ruang untuk membatasi string? Karena itu adalah karakter tunggal, itu bisa jadi yang terakhir.
Adám

1
@ Adám saya menggunakannya kembali sebagai pemisah ruang pada hasil akhir.
Martin Ender

9

Java 10, 189 159 byte

s->c->{var r="";int p=0,i;for(var a:s.split("\\|")){for(i=p;i-->0;r+=" ");r+=a;for(p+=a.length();i++<s.replace("|","").length()-p;r+=" ");r+=c+"\n";}return r;}

-30 byte mengkonversi Java 7 ke Java 10 dan mengoptimalkan loop.

Cobalah online.

Penjelasan:

s->c->{                     // Method with String & char parameters and String return-type
  var r="";                 //  Result-String, starting empty
  int p=0,                  //  Position-integer, starting at 0
      i;                    //  Index integer
  for(var a:s.split("\\|")){//  Loop over the parts split by "|"
    for(i=p;i-->0;r+=" ");  //   Add `p` amount of spaces to the result-String
    r+=a;                   //   Add the current part to the result-String
    for(p+=a.length();      //   Add the length of the current part to the position-integer
        i++<s.replace("|","").length()-p;r+=" ");
                            //   Add the row's trailing spaces to the result-String
    r+=c+"\n";}             //   Add the character and a new-line to the result-String
  return r;}                //  Return the result-String


4

JavaScript (ES6), 92 byte

f=
(s,c)=>s.split`|`.map((_,i,a)=>a.map((e,j)=>i-j?e.replace(/./g,` `):e).join``+` `+c).join`
`
;
<div oninput=o.textContent=f(s.value,c.value)><input id=s placeholder=Code><input id=c size=1 maxlength=1 value=#><pre id=o>


4

GNU sed (85 +1 untuk -r) 86

:s;h;:;s,\|( *)[^ \|](.),|\1 \2,;t;s,\|,,g
p;g;:l;s,^( *)[^ \|],\1 ,;tl;s,\|,,;/\S/bs

Input adalah string yang dipisahkan oleh spasi.

Pengujian:
input.txt:

a|b|c|d|e|f|g ,
abcdefg :
4|8|15|16|23|42 %
E|ac|h s|ecti|on is| one c|haracte|r longer| than the| last! !
This|Code|has||empty||sections @

Keluaran:

$ cat input.txt | sed -rf template
a       ,
 b      ,
  c     ,
   d    ,
    e   ,
     f  ,
      g ,

abcdefg :

4          %
 8         %
  15       %
    16     %
      23   %
        42 %

E                                                   !
 ac                                                 !
   h s                                              !
      ecti                                          !
          on is                                     !
                one c                               !
                     haracte                        !
                            r longer                !
                                     than the       !
                                              last! !

This                     @
    Code                 @
        has              @
                         @
           empty         @
                         @
                sections @

Label tanpa nama :adalah fitur sed GNU / bug dan \Ssaya pikir ekstensi, jadi mungkin judulnya GNU sed. Selain itu, kode yang bagus.
seshoumara

@seshoumara Terima kasih!
Riley

3

Haskell, 139 135 byte

s#p=j$foldl g("",0)s where g(a,n)c|c=='|'=(j(a,n)++"\n"++q n,n)|1>0=(a++[c],n+1);q m=' '<$[1..m];j(a,n)=a++q(sum[1|c<-s,c/='|']-n+1)++p

Disimpan 4 byte dengan menggariskan definisi.

Tidak Disatukan:

template :: String -> String -> String
template code comment = format $ foldl g ("", 0) code
    where g (acc, n) c
            | c == '|' = (format (acc, n) ++ "\n" ++ spaces n, n)
            | otherwise = (acc ++ [c], n+1)
          l = length $ filter (/= '|') code
          spaces n = replicate n ' '
          format (acc, n) = acc ++ spaces (l-n+1) ++ comment

3

Groovy, 120 113 111 Bytes

def m(s,c){s.split(/\|/).inject(0,{e,t->println((' '*e+t).padRight(s.replace('|','').size()+1)+c);e+t.size()})}

tidak berserat *

def m(s,c){
  s.split(/\|/).inject(0, { e, t ->
    println((' '*e+t).padRight(s.replace('|','').size())+' '+c)
    e+t.size()
  })
}

(Draf Pertama dengan 120 Bytes)

def m(s,c){def l=0;s.split(/\|/).collect{l+=it.size();it.padLeft(l).padRight(s.replace('|','').size())+' '+c}.join('\n')}

tidak berserat *

def m(s,c){
  def l=0 // minimized version needs a semicolon here
  s.split(/\|/).collect{
    l+=it.size() // minimized version needs a semicolon here
    it.padLeft(l).padRight(s.replace('|','').size())+' '+c
  }.join('\n')
}

Tes

%> m('a|bc|d|e|fgh|ij|k|l|mn|op', '#')
a                #
 bc              #
   d             #
    e            #
     fgh         #
        ij       #
          k      #
           l     #
            mn   #
              op #

%> m('Hello|World', '/')
Hello      /
     World /

%> m('a|b|c|d|e|f|g', ',')
a       ,
 b      ,
  c     ,
   d    ,
    e   ,
     f  ,
      g ,

%> m('abcdefg', ':')
abcdefg :

%> m('4|8|15|16|23|42', '%')
4          %
 8         %
  15       %
    16     %
      23   %
        42 %

%> m('E|ac|h s|ecti|on is| one c|haracte|r longer| than the| last!', '!')
E                                                   !
 ac                                                 !
   h s                                              !
      ecti                                          !
          on is                                     !
                one c                               !
                     haracte                        !
                            r longer                !
                                     than the       !
                                              last! !

%> m('This|Code|has||empty||sections', '@')
This                     @
    Code                 @
        has              @
                         @
           empty         @
                         @
                sections @

Bagaimana dengan.padRight(s.replace('|','').size()+1)+c)
AmazingDreams

ide bagus! Terima kasih! menyimpan 2 karakter lagi!
norganos

3

Python 2, 125 124 132 byte

-1 byte terima kasih kepada @TuukkaX (tidak ada golf dari ruang i, v)

def g(s,c):x=s.split('|');print((' '+c+'\n').join(' '*len(''.join(x[:i]))+v+' '*len(''.join(x[i+1:]))for i,v in enumerate(x))+' '+c)

Semua uji kasus pada ideone


1
Anda seharusnya menggunakan csebagai komentar char, bukan #.
Oliver Ni

@OliverNi - eh itu adalah hit untuk kode dalam bentuk saat ini.
Jonathan Allan

3

Python 2, 107 105 102 99 byte

Diuji dengan semua kasus uji di atas

EDIT Golfed off 2 byte dengan mengubah d = a.split ("|"); i = 0 ke d, i = a.split ("|"), 0 Tidak yakin bagaimana saya melewatkan yang satu itu. Terima kasih @liver Ni

3 byte lagi hilang. Terima kasih lagi.

Saran dari @Jonathan sebenarnya menyimpan 3 byte dan membawanya ke keajaiban 99. Terima kasih.

def c(a,b):
 d,i=a.split("|"),0
 for e in d:j=i+len(e);print" "*i+e+" "*(len("".join(d))-j+1)+b;i=j

1
Dipotong ke byte lain
Oliver Ni

3
Hai @OliverNi, memberikan kiat untuk menurunkan barang golf sangat dihargai, tetapi kode pengeditan tidak benar-benar sesuai di situs ini ( sumber ), jadi saya telah memutar kembali hasil edit Anda. Jangan ragu untuk mengirimkan kiat-kiat itu sebagai komentar! Saya yakin OP akan menghargainya, tetapi harus mereka yang mengujinya dan memilih jika mereka ingin menggunakannya.
DJMcMayhem

1
Terima kasih untuk kalian berdua. Pertama kepada @Oliver karena tertarik dan waktu untuk meningkatkan upaya saya yang rendah hati dan yang kedua ke DJMcMayhem karena mengklarifikasi apa yang saya yakini sebagai kasusnya tetapi tidak memiliki kesempatan untuk berkomentar. Oliver - terima kasih sekali lagi dan silakan kirim perubahan sebagai komentar sehingga saya dapat belajar dari pengalaman bermain golf Anda.
ElPedro

1
Anda dapat menghapus kurung sekitar " "*ihingga 2 byte
Oliver Ni

1
Anda juga dapat mengatur variabel len(e)suka for e in d:z=len(e)....menyimpan byte karena digunakan dua kali
Oliver Ni

3

05AB1E , 29 38 31 29 byte

'|„ǝʒ:'ǝ¡'ʒмεD®>úsg®+©s}.Bεð²J,

Dapat dipastikan golf, tetapi setidaknya ini berfungsi sekarang ..
+9 byte karena ¡(split) menghapus item kosong secara otomatis, jadi saya harus menambahkan '|„ǝʒ:'ǝ¡'ʒм..
-2 byte berkat @MagicOctopusUrn dengan mengubah '|„ǝʒ:'ǝ¡'ʒмke '|¶:.BεðÜ}(solusi saat ini tidak bekerja pada item dengan spasi tambahan, tapi saya berasumsi itu diizinkan sesuai dengan kasus uji).

Cobalah online.

Penjelasan:

'|¶:           # Take the first input, and replace every "|" with "¶"
               #  i.e. "abc|d|e||fg" → "abc¶d¶e¶¶fg" (¶ are new-lines in 05AB1E)
    .B         # Box all the items (appending trailing whitespace to make it a rectangle)
               #  i.e. "abc¶d¶e¶¶fg" → ['abc','d  ','e  ','   ','fg ']
      εðÜ}     # Remove all trailing spaces from each item
               #  i.e. ['abc','d  ','e  ','   ','fg '] → ['abc','d,'e','','fg']
               #  NOTE: `'|¡` would have resulted in ['abc','d','e','fd'], hence the use of
               #        Box which implicitly splits on new-lines to keep empty items
ε              # For-each:
 D             #  Duplicate the current item
  ®>ú          #  Prepend global_variable + 1 amount of spaces
               #  (+1 because the global_variable is -1 by default)
               #   i.e. "e" and 3+1 → "    e"
 sg            #  Swap so the duplicated item is at the top, and take its length
   ®+          #  Sum it with the global_variable
               #   i.e. "e" (→ 1) and 4 → 5
     ©         #  And store it as new global_variable
      s        #  Then swap so the space appended item is at the end again
       }       # And end the for-each loop
.B             # Box all the items (appending the appropriate amount of spaces)
               #  i.e. ['abc','   d','    e','     ','     fg']
               #   → ['abc    ','   d   ','    e  ','       ','     fg']
ε              # For-each again:
 ð             #  A space character
  I            #  The second input-character
   J           #  Join both together with the current item
    ,          #  And print the current row with trailing new-line

Ini tidak valid jika kode berisi ǝʒ. '|¶:.Bbisa bekerja tho.
Magic Gurita Guci

@MagicOctopusUrn Uraian tantangan menyatakan " Input kode hanya akan berisi ASCII yang dapat dicetak, dan tidak akan berisi baris baru. " Selain itu, bagian kode mana yang harus diganti '|¶:.B?
Kevin Cruijssen

Saya berpikir bahwa itu akan menjadi perpecahan yang lebih pendek, tetapi itu tidak akan berhasil dengan kode Anda saat ini hanya membantingnya, Anda harus memotong kelebihannya. ATAU abaikan saja kelebihan dan .Bwaktu kedua setelah menambahkan ruang sebelumnya.
Magic Gurita Guci

@ MagicOctopusUrn Memang mungkin menghemat beberapa byte, karena pekerjaan saya saat ini cukup lama, tetapi akan lebih sulit untuk menghitung jumlah ruang sebelumnya dengan ruang setelah yang .Bsudah ada.
Kevin Cruijssen

1
'|¶:.BεðÜ}εD®>úsg®+©s}.BεðIJ,? 29 byte. Kembali ke iterasi 1 :). .Bterpecah pada baris baru, yang merupakan fitur yang tidak banyak orang tahu. Itu satu-satunya cara saya tahu untuk menjaga elemen kosong. Saya akan meminta ini sebagai fitur. harus berarti terbelah, tetapi tetap elemen kosong ..
Magic Gurita Guci

2

PowerShell v2 +, 103 99 byte

param($a,$b)$a-split'\|'|%{" "*$l+$_+" "*(($a-replace'\|').length+1-$_.length-$l)+$b;$l+=$_.Length}

Mengambil input sebagai dua string, -split yang pertama pada pipa literal (karena split menggunakan sintaks regex), dan mengumpankan elemen ke dalam sebuah loop |%{...}.

Setiap iterasi, kami membangun string sebagai sejumlah ruang yang ditentukan oleh $ldigabungkan dengan elemen saat ini. Untuk loop pertama,$l inisialisasi ke $null, yang akan dievaluasi di sini sebagai 0.

String itu selanjutnya digabungkan dengan jumlah spasi lain (ditentukan oleh berapa lama $ajika kita -replaced setiap pipa tanpa apa-apa, plus 1untuk padding tambahan antara kode dan komentar, minus .lengthelemen saat ini, minus$l berapa banyak ruang yang kita isi tersisa di iterasi ini), disatukan dengan karakter komentar kami $b. Tersisa di saluran pipa.

Kami kemudian memperbarui $l untuk iterasi berikutnya.

Semua string yang dihasilkan ditinggalkan di pipeline, dan output melalui implisit Write-Outputterjadi pada eksekusi program, dengan baris baru di antara mereka secara default.

Contohnya

PS C:\Tools\Scripts\golfing> .\esolang-comment-template-generator.ps1 "This|Code|has||empty||sections" "@"
This                     @
    Code                 @
        has              @
                         @
           empty         @
                         @
                sections @

PS C:\Tools\Scripts\golfing> .\esolang-comment-template-generator.ps1 "a|bc|def|ghi|h" "|"
a          |
 bc        |
   def     |
      ghi  |
         h |

2

Vim, 39 38 penekanan tombol

-1 byte berkat DJMcMayhem

Diharapkan sebagai input buffer (misalnya file) yang karakter pertamanya adalah pembatas komentar, diikuti oleh kode, misalnya #foo|bar|baz.

"cxqaf|m`Yp<Ctrl+o>v$r jv0r x@aq@a$p<Ctrl+v>gg$C <Ctrl+r>c<Esc>

Penjelasan

(" _" menunjukkan ruang literal.)

"cx          " Delete the first character (the comment delimiter) and store in register 'c'
qa           " Start recording macro 'a'
f|m`         " Advance to the first '|' on the line and set mark
Yp<Ctrl+o>   " Duplicate this line and return to mark
v$r_         " Replace everything after the cursor on this line (inclusive) with spaces
jv0r_x       " Go down a line and replace everything before the cursor on this line (inclusive) with
             "   spaces, then delete one space
@a           " Call macro recursively
q@a          " Stop recording and immediately call the macro
$p           " Paste the deleted space at the end of the last line
<Ctrl+v>gg$       " Highlight the column where the comment delimiters will go and all trailing spaces
C_<Ctrl+r>c<Esc>  " Replace the highlighted text on each line with a space and the contents of
                  "   register 'c' (the comment delimiter)

1
: DI selalu upvote vim! Saya pikir Anda bisa mengambil satu byte off jika Anda mengubah mmke m`dan kemudian mengubah `mke<C-o>
DJMcMayhem

@DJMcMayhem Terima kasih! Saya suka bermain golf di Vim karena saya selalu belajar sesuatu tentang alat yang saya gunakan setiap hari.
Jordan

2

Floroid - 94 byte

Ah(a,b):c=a.fn("|");z(" "+b+"\n".y(' '*Z("".y(c[:j]))+l+" "*Z("".y(c[j+1:]))Kj,lIai(c))+' '+b)

Menggunakan pendekatan yang mirip dengan @ JonathanAllan solusi Python '.

Testcases

Call: h("a|bc|d|e|fgh|ij|k|l|mn|op", "#")
Output: 
a                #
 bc              #
   d             #
    e            #
     fgh         #
        ij       #
          k      #
           l     #
            mn   #
              op #

2

C # 176 167 154 byte

string f(string s,char x){var c=s.Split('|');var d="";int i=0;foreach(var b in c)d+=b.PadLeft(i+=b.Length).PadRight(s.Length+2-c.Length)+x+"\n";return d;}

Tidak disatukan

string f(string s, char x)
{
    var c = s.Split('|');
    var d = "";
    int i = 0;
    foreach (var b in c)
        d += b.PadLeft(i += b.Length).PadRight(s.Length + 2 - c.Length) + x + "\n";
    return d;
}

Solusi LINQ seharusnya 146 tetapi perlu using System.Linq;membawanya kembali ke 164:

string f(string s,char x){var c=s.Split('|');int i=0;return c.Aggregate("",(g,b)=>g+b.PadLeft(i+=b.Length).PadRight(s.Length+2-c.Length)+x+"\n");}

Solusi lama:

167 byte:

string f(string s,char x){var c=s.Split('|');var d="";int i=0;foreach(var b in c){d+=b.PadLeft(i+b.Length).PadRight(s.Length+2-c.Length)+x+"\n";i+=b.Length;}return d;}

176 byte menggunakan interpolasi string

string f(string s,char x){var c=s.Split('|');var d="";int i=0;foreach(var b in c){d+=string.Format($"{{1,{i}}}{{0,-{s.Length+2-c.Length-i}}}{x}\n",b,"");i+=b.Length;}return d;}

1

PHP, 120 117 116 110 109 byte

foreach($a=split('\|',$argv[1])as$i=>$t){$c=preg_replace('#.#',' ',$a);$c[$i]=$t;echo join($c)," $argv[2]
";}

atau

foreach($a=split('\|',$argv[1])as$t){$c=preg_replace('#.#',' ',$a);$c[$i++|0]=$t;echo join($c)," $argv[2]
";}

1

MATL , 33 31 byte

'\|'0'|'hYXo8M&YbY:&YdtaZ)0ihYc

Cobalah online!

Penjelasan

Fungsi builtin Yd( blkdiag), yang membangun matriks blok-diagonal dari inputnya, melakukan sebagian besar pekerjaan. Nilai isi dalam matriks adalah 0, dan karakter 0 diperlakukan sebagai ruang untuk menampilkan tujuan. Kode hanya akan terpecah| , membangun matriks dari blok yang dihasilkan, dikonversi ke char, dan menambahkan dua kolom dengan simbol spasi dan komentar.

Namun, kemungkinan bagian kosong di string input menjadi rumit menjadi membuat masalah lebih menarik: blok yang dihasilkan akan kosong dan dengan demikian tidak akan ditampilkan dalam matriks yang dihasilkan.

Untuk mengatasi ini, kami memperkenalkan char 0 sebelum masing-masing |, jadi tidak ada blok yang kosong; dan kemudian dalam matriks char yang dihasilkan, kami menghapus kolom yang dibentuk oleh char 0 saja. Bagian kode yang tidak kosong akan memiliki beberapa karakter ASCII yang dapat dicetak, dan dengan demikian kolom yang dibentangnya akan bertahan. Bagian kosong akan menyumbang satu baris, tetapi tidak akan memperkenalkan kolom tambahan.

'\|'    % Push this string: source for regexp matching. It's just | escaped
0'|'h   % Push a string formed by char 0 followed by | (no escaping needed)
YX      % Input string implicitly. Replace first of the above string by the second
o       % Convert from chars to code points. Gives a numeric vector
8M      % Push '|' again
&Yb     % Split numeric vector at occurences of | (the latter is automatically
        % converted  to its code point). This gives a cell array of numeric vectors
Y:      % Unbox cell array: pushes the numeric vectors it contains
&Yd     % Form a block-diagonal matrix from those vectors
ta      % Duplicate. Compute vector that equals true for columns that have some
        % nonzero value
Z)      % Used that as a logical index (mask) for the columns of the matrix.
        % This removes columns that contain only zeros
0ih     % Input comment symbol and prepend char 0 (which will be displayed as space)
Yc      % Append that to each row of the matrix. The matrix is automatically 
        % converted from code points to chars
        % Display implicitly

1
Saya agak kecewa karena Anda tidak memasukkan penjelasan Anda dalam format yang disebutkan OP
Random832

1
@ Random832 Saya tidak sering menggunakan format itu. Ini menghabiskan banyak ruang, menyisakan sedikit ruang untuk penjelasan
Luis Mendo

Mengapa pelarian dibutuhkan dalam string pertama?
Conor O'Brien

@ ConorO'Brien Pertanyaan bagus. Saya tidak pernah tahu mana / kapan simbol khusus perlu melarikan diri dan mana / kapan tidak. Dalam hal ini, |( cocokkan subekspresi sebelum atau sesudah| ) benar-benar membutuhkannya, setidaknya di mesin regexp Matlab / Octave
Luis Mendo

1

Pyth, 30 byte

VJcE\|s[*ZdN*h--lsJZlNdQ)=+ZlN

atau

jm+dQ.t.t+MC,.u*l+NYdJc+Ed\|kJ

Keduanya adalah program penuh yang mengambil input pada STDIN dari string komentar, dan kemudian string program, dipisahkan oleh baris baru.

Coba versi pertama online

Coba versi kedua daring

Bagaimana mereka bekerja

VJcE\|s[*ZdN*h--lsJZlNdQ)=+ZlN  Program. Inputs: E, Q
  cE\|                          Split E on "|"
 J                              Assign to J
                                Implicit Z=0
V                               For N in that:
       [                )        Create a list with elements:
        *Zd                       Z spaces
           N                      N
               -lsJZ              len(concatenate(J))-Z
              -     lN             -len(N)
             h                     +1
            *         d            spaces
                       Q          Q
      s                          Concatenate the list
                                 Implicitly print
                        =+ZlN    Z=Z+len(N)

jm+dQ.t.t+MC,.u*l+NYdJc+Ed\|kJ  Program. Inputs: E, Q
                       +Ed      Add a trailing space to E
                      c   \|    Split that on "|"
                     J          Assign to J
             .u                 Cumulatively reduce J with:
                            k    starting value empty string and
                                 function N, Y ->
                l+NY              len(N+Y)
               *    d             spaces
            ,                J  Two-element list of that and J
           C                    Transpose
         +M                     Map concatenation over that
       .t                       Transpose, padding with spaces
     .t                         Transpose again
 m+dQ                           Map concatenation with Q over that
j                               Join on newlines
                                Implicitly print

1

Dyalog APL 16.0 (non-bersaing), 43 37 byte

Meminta karakter komentar, lalu untuk kode.

↑(↓↑((-(⍸'|'∘=),≢)↑¨'|'∘≠⊆⊢)⍞),¨⊂¯2↑⍞

Non-bersaing karena versi 16.0 lebih baru dari tantangan ini.


Bagaimana dyalog APL masih non-bersaing? Apakah masih di-dev?
DJMcMayhem

@DJMcMayhem Ya. Saya bekerja untuk Dyalog dan telah memiliki akses ke 16.0 bahkan sebelum 15.0 dirilis. 16.0 dijadwalkan untuk rilis pada 2017Q1.
Adám

Bagaimana cara kerjanya?
Conor O'Brien

1

Perl, 63 byte

Termasuk +5 untuk -Xpi

Jalankan dengan masukan pada STDIN dan karakter komentar setelah -i:

perl -Xpi% esolang.pl <<< "Ab|Cd||ef"

esolang.pl:

s/
/|/;s%(.*?)\|%$"x$`=~y/|//c.$1.$"x$'=~y/|//c." $^I
"%eg

Solusi langsung yang benar-benar membosankan


1

Turtlèd , 35 byte (tidak bersaing)

Mengambil satu input, karakter terakhir adalah karakter komentar. Tidak berfungsi dengan karakter komentar sebagai spasi, tetapi saya menganggap itu tidak perlu.

!' [*.+(|' dl)r_]' r[*+.(|u)_][ .d]

Penjelasan:

!                                  take input into string variable
 '                                 write space over current cell
   [*           ]                  while cell is not *
     .+                            write pointed char of string, stringpointer+1 (starts 0)
       (|    )                     if current cell is |
         ' dl                      write space (over |), move down, left
              r_                   move right, write * if pointed char is
                                   last char, else space

                 ' r               write space, move right
                    [*       ]     while cell is not *
                      +.           increment pointer and write pointed char
                        (|u)       if cell is |, move up
                            _      write * if the pointed char is the last char

                              [   ] while cell is not space
                                .d  write the pointed char from string, move down 


0

Scala, 123 byte

def?(i:String,c:String)={var b=0
i.split('|').map{s=>println(" "*b+s+" "*(i.replace("|","").size-b-s.size+1)+c)
b+=s.size}}

Kode tes + Output:

?("a|b|c|d|e|f|g", ",")
a       ,
 b      ,
  c     ,
   d    ,
    e   ,
     f  ,
      g ,

?("abcdefg", ":")
abcdefg :

?("4|8|15|16|23|42", "%")
4          %
 8         %
  15       %
    16     %
      23   %
        42 %

?("E|ac|h s|ecti|on is| one c|haracte|r longer| than the| last!", "!")
E                                                   !
 ac                                                 !
   h s                                              !
      ecti                                          !
          on is                                     !
                one c                               !
                     haracte                        !
                            r longer                !
                                     than the       !
                                              last! !

?("This|Code|has||empty||sections", "@")
This                     @
    Code                 @
        has              @
                         @
           empty         @
                         @
                sections @

0

Ruby, 96 80 byte

->s,c{s.gsub(/(^|\|)([^|]*)/){" "*$`.count(t="^|")+$2+" "*(1+$'.count(t))+c+$/}}

Lihat di eval.in: https://eval.in/639012

Saya benar-benar harus belajar Retina.


0

Jelly , 41 byte

Sepertinya ini memiliki banyak peningkatan, dan mungkin terlalu banyak tautan ...

ṫø⁹‘‘µFL‘⁶ẋ
‘ị
ḣFL⁶ẋ$;ç@;1ŀ
J’ç@€
ṣ”|Ç;€Y

Uji di TryItOnline

Bagaimana?

ṫø⁹‘‘µFL‘⁶ẋ  - link 1: get the spaces for after the code, dyadic(split string, index)
 ø           - next chain as a nilad
  ⁹‘‘        - right argument incremented twice (the index we actually want)
ṫ            - tail (get the rest of the split string)
     µ       - next chain as a monad
      FL‘    - flatten, get its length and increment
         ⁶   - a space character " "
          ẋ  - repeat the space character that many times

‘ị           - Link 2: get the code for a line dyadic(index, split string)
‘            - increment the index
 ị           - retrieve the string at that index

ḣFL⁶ẋ$;ç@;1ŀ - Link 3: get the code and join with spaces, dyadic (index, split string)
ḣ            - head: split string[index:]
 FL          - flatten and get its length
     $       - previous two atoms as a monad
   ⁶         - a space character, " "
    ẋ        - repeat the space that many times
      ;      - concatenate with
       ç@    - the result of the previous link (the code) - reverse inputs
         ;   - concatenate with
          1ŀ - the result of Link 1 (the spaces after the code)

J’ç@€        - Link 3: a for loop, monadic(split string)
J’           - [0,...,Len(split string)-1]
  ç@€        - the result of the previous link, with revered inputs, for each

ṣ”|Ç;€Y      - Main Link: dyadic(code string, comment character)
ṣ”|          - split on "|"
   Ç         - the result of the previous link
    ;€       - concatenate each with the comment character
      Y      - join with line feeds
             - implicit print

0

CJam, 32 byte

l'|/_s,)L@{1$,S*\+}%@f{Se]}lN+f+

Penjelasan

l                                  get code string
 '|/                               split into code parts
    _s,)                           length of all the parts +1
        L@{1$,S*\+}%               left pad spaces to every part for the length of the previous parts
                    @f{Se]}        right pad spaces
                           lN+f+   add comment character and newline

Cobalah online


0

GolfScript, 85 byte

{(;);}:r;", "%(r\(r n+:c;;.,\'|'%.,@\-)):l;0:m;{.,0>}{" "m*\(.,m+:m l\-" "\*+c@}while

Cobalah online

Pembaruan 2017 - GolfScript - 71 byte

', '/~~:c;~1/.,\.{'|'=},,@\-):l;['|']/0:i;{.,i+:i l i-' '*c+\' '*"
"\}/

Penjelasan

', '/~~:c;~1/        # Parses input
.,\.{'|'=},,@\-):l;  # Computes string length without '|'
['|']/               # Splits the array
0:i;                 # Counter
{.,                  # Length of the substring
i+:i                 # Counter update
l i-' '*c+\          # Adds spaces after the substring 
' '*"\n"\            # Adds spaces before the next substring
}/                   # ...For each substring

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.