Backtickify đoạn mã trên Stack Exchange


9

Mục tiêu của bạn là nhập bất kỳ văn bản tùy ý, chẳng hạn như:

This is some text

Và xuất văn bản đó được định dạng dưới dạng mã cho các bài đăng (Markdown có hương vị SE) và nhận xét (mini-Markdown) trên Stack Exchange, chẳng hạn như:

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

Tuy nhiên, nó trở nên khó khăn hơn. Xem xét đầu vào:

Perl has a variable called $`

Đầu ra phải là

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

Các quy tắc đầy đủ cho định dạng là:

  • Bài viết đầy đủ (SE Markdown đầy đủ)

    • Bước 1: đếm số lượng ít nhất mà không có chính xác nhiều backticks liên tiếp trong chuỗi. Hãy gọi nó là n. (Ví dụ: đối với chuỗi potato, nlà 1, for this is a backtick: `, nlà 2 và for ` `` ``` ````` ``````, nlà 4.)

    • Bước 2: quấn chuỗi trong nbackticks. Nếu chuỗi bắt đầu hoặc kết thúc bằng một backtick, bạn cũng phải bọc bằng khoảng trắng. (Ví dụ, potatotrở thành `potato`, this is a backtick: `trở thành `` this is a backtick: ` ``` `` ``` ````` ``````trở thành ```` ` `` ``` ````` `````` ````.

  • Nhận xét (đánh dấu nhỏ)

    • Bọc `và thoát khỏi tất cả `với \`. (Ví dụ, potatotrở thành `potato`, this is a backtick: `trở thành this is a backtick: \`` `` ``` ````` ``````trở thành \` \`\` \`\`\` \`\`\`\`\` \`\`\`\`\`\`.

Đây là ; câu trả lời ngắn nhất trong số byte thắng.


Còn không gian thì sao? `` không nhận được định dạng mã ...
Justin

@Quincunx Hmm ... bạn định định dạng khoảng trắng trong mã bằng cách nào?
Doorknob

Tôi không có ý kiến. Bài đăng này là nơi tôi đã học cách định dạng backticks và như vậy.
Justin

2
Mẫu bình luận cũng không hoạt động \; để định dạng a \, bạn cần làm ``\``. Ngoài ra, bất cứ điều gì kết thúc với một \vấn đề tương tự: asdf\tạo ra 'asdf`
Justin

Câu trả lời:


4

APL (90)

(Có, bộ ký tự APL phù hợp với một byte, đây là bảng mã 907 của IBM .)

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

Đây là một hàm lấy một chuỗi và trả về một mảng gồm hai chuỗi, trong đó chuỗi thứ nhất là biểu diễn nhận xét và chuỗi thứ hai là biểu diễn bài đầy đủ .

Các xét nghiệm:

      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``` 

Lưu ý: Tôi đã đặt tên hàm cho mục đích dễ đọc, điều này không thực sự cần thiết để sử dụng nó (bạn chỉ có thể đặt đối số bên cạnh hàm ẩn danh) vì vậy tôi đã không đếm nó.


2

Ruby, 119

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

Ung dung:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.