Backtickify cuplikan kode di Stack Exchange

9

Tujuan Anda adalah memasukkan teks arbitrer, seperti:

This is some text

Dan output teks yang diformat sebagai kode untuk posting (Markdown rasa SE) dan komentar (Markdown mini) di Stack Exchange, seperti:

`This is some text`
`This is some text`

Namun, itu semakin rumit. Pertimbangkan input:

Perl has a variable called $`

Outputnya harus

`` Perl has a variable called $` ``
`Perl has a varaible called $\``

Aturan lengkap untuk pemformatan adalah:

  • Posting lengkap (Markdown SE penuh)

    • Langkah 1: hitung jumlah terkecil yang tidak ada banyak backtick berturut-turut dalam string. Sebut ini n. (Misalnya, untuk string potato, nadalah 1, untuk this is a backtick: `, nadalah 2, dan untuk ` `` ``` ````` ``````, nadalah 4.)

    • Langkah 2: bungkus string dalam nbackticks. Jika string dimulai atau diakhiri dengan backtick, Anda juga harus membungkusnya dengan spasi. (Misalnya, potatomenjadi `potato`, this is a backtick: `menjadi `` this is a backtick: ` ``, dan ` `` ``` ````` ``````menjadi ```` ` `` ``` ````` `````` ````.

  • Komentar (Mini-Markdown)

    • Bungkus `dan lepaskan semuanya `dengan \`. (Misalnya, potatomenjadi `potato`, this is a backtick: `menjadi this is a backtick: \`, dan ` `` ``` ````` ``````menjadi \` \`\` \`\`\` \`\`\`\`\` \`\`\`\`\`\`.

Ini adalah ; jawaban terpendek dalam hitungan byte menang.

Gagang pintu
sumber
Bagaimana dengan ruang? `` tidak mendapatkan pemformatan kode ...
Justin
@ Quincunx Hmm ... bagaimana Anda bisa memformat spasi dalam kode?
Gagang Pintu
Saya tidak punya ide. Posting ini adalah tempat saya belajar bagaimana memformat backticks dan semacamnya.
Justin
2
Formulir komentar juga tidak berfungsi untuk \; untuk memformat \, yang perlu Anda lakukan ``\``. Juga, apa pun yang berakhir dengan \berjalan ke masalah yang sama: asdf\menghasilkan `asdf`
Justin

Jawaban:

4

APL (90)

(Ya, rangkaian aplikasi APL cocok dengan satu byte, inilah codepage 907 IBM .)

{⎕ML←3⋄(,/m,m,⍨{⍵=m:'\`'⋄⍵}¨⍵),⊂(⌽g),⍵,g←(''↑⍨∨/t[1,⍴t]),m/⍨0⍳⍨z∊⍨⍳⌈/0,z←,⊃⍴¨⍵⊂⍨t←⍵=m←'`'}

Ini adalah fungsi yang mengambil string, dan mengembalikan array dari dua string, di mana string pertama adalah representasi komentar dan string kedua adalah representasi posting penuh .

Tes:

      backtickify←{⎕ML←3⋄(,/m,m,⍨{⍵=m:'\`'⋄⍵}¨⍵),⊂(⌽g),⍵,g←(''↑⍨∨/t[1,⍴t]),m/⍨0⍳⍨z∊⍨⍳⌈/0,z←,⊃⍴¨⍵⊂⍨t←⍵=m←'`'}
      ↑backtickify 'potato'
`potato`
`potato`

      ↑backtickify 'this is a backtick: `'
`this is a backtick: \``   
`` this is a backtick: ` ``

      ↑backtickify '` `` ``` ````` ``````'
`\` \`\` \`\`\` \`\`\`\`\` \`\`\`\`\`\``
```` ` `` ``` ````` `````` ````  

      ⍝ testcase for not wrapping with spaces
      ↑backtickify 'no`spaces``at````the`edges'
`no\`spaces\`\`at\`\`\`\`the\`edges`
```no`spaces``at````the`edges``` 

Catatan: Saya memberi nama fungsi untuk keterbacaan, fungsi ini tidak sepenuhnya diperlukan untuk menggunakannya (Anda bisa menempatkan argumen di sebelah fungsi anonim) jadi saya tidak menghitungnya.

marinus
sumber
2

Ruby, 119

s=gets.chop
c=1
c+=1while s=~/([^`]|\A)#{?`*c}([^`]|\z)/
puts ?`+s.gsub('`','\\\\`')+'`
'+?`*c+(s=~/$`|`^/?" #{s} ":s)+?`*c

Tidak Disatukan:

def backtickify str, comment = false
  return "`#{str.gsub '`', '\\\\`'}`" if comment
  c = 1
  c += 1 while str =~ /([^`]|\A)#{?` * c}([^`]|\z)/
  str = ' ' + str + ' ' if str[0] == ?` || str[-1] == ?`
  return ?` * c + str + ?` * c
end
Gagang pintu
sumber