Stack Exchangeのコードスニペットをバックシック化する


9

あなたの目標は、次のような任意のテキストを入力することです。

This is some text

次のように、Stack Exchangeで投稿(SE風味のマークダウン)とコメント(ミニマークダウン)のコードとしてフォーマットされたテキストを出力します。

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

ただし、注意が必要です。入力を検討してください:

Perl has a variable called $`

出力は

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

書式設定の完全なルールは次のとおりです。

  • 完全な投稿(完全なSE Markdown)

    • ステップ1:文字列内に連続するバックティックが正確に存在しない最小数をカウントします。これを呼びましょうn。(例えば、文字列potato、n1であるためthis is a backtick: `、n2であり、そしてために` `` ``` ````` ``````、n4です。)

    • 手順2:文字列をnバッククォートで囲みます。文字列がバックティックで開始または終了する場合も、スペースで囲む必要があります。(例えば、potatoなる`potato`、this is a backtick: `となる`` this is a backtick: ` ``、と` `` ``` ````` ``````なります```` ` `` ``` ````` `````` ````。

  • コメント(mini-Markdown)

    • `すべてを包み込み、エスケープ`し\`ます。(例えば、potatoなる`potato`、this is a backtick: `となるthis is a backtick: \`、と` `` ``` ````` ``````なります\` \`\` \`\`\` \`\`\`\`\` \`\`\`\`\`\`。

これはです。バイトカウントで最も短い回答が優先されます。


宇宙はどうですか?``はコードフォーマットを取得しません...
— Justin

@Quincunxうーん...とにかくコードでスペースをフォーマットするにはどうすればいいですか?
— ドアノブ

何も思いつきません。この投稿では、バックティックなどのフォーマット方法を学びました。
— ジャスティン

2
コメントフォームも\; では機能しません。をフォーマットするには\、行う必要があります``\``。また、\ランで終わるものはすべて同じ問題にasdf\ぶつかります:`asdf`が生成されます
— Justin

回答:


4

APL(90)

(はい、APL文字セットは1バイトに収まりません。IBMのコードページ907をご覧ください。)

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

これは文字列を取り、2つの文字列の配列を返す関数です。最初の文字列はコメント表現で、2番目の文字列は完全な投稿表現です。

テスト:

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

注:読みやすくするために関数に名前を付けましたが、これを使用するために厳密に必要なわけではないので(無名関数の横に引数を置くだけでかまいません)、カウントしませんでした。


2

ルビー、119

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

非ゴルフ:

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.