Code-Snippets in Stack Exchange zurückticken

9

Ihr Ziel ist es, einen beliebigen Text einzugeben, z.

This is some text

Und geben Sie diesen Text aus, der als Code für Posts (Markdown mit SE-Geschmack) und Kommentare (Mini-Markdown) in Stack Exchange formatiert ist, z.

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

Es wird jedoch schwieriger. Betrachten Sie die Eingabe:

Perl has a variable called $`

Die Ausgabe muss sein

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

Die vollständigen Regeln für die Formatierung sind:

  • Vollständige Beiträge (vollständiger SE Markdown)

    • Schritt 1: Zählen Sie die kleinste Zahl, für die es nicht genau so viele aufeinanderfolgende Backticks in der Zeichenfolge gibt. Nennen wir das n. (Beispielsweise für die Zeichenfolge potato, n1 ist , für this is a backtick: `, n2 ist , und für die ` `` ``` ````` ``````, nist 4.)

    • Schritt 2: Wickeln Sie die Zeichenfolge in nBackticks. Wenn die Zeichenfolge mit einem Backtick beginnt oder endet, müssen Sie auch Leerzeichen einschließen. (Zum Beispiel potatowird `potato`, this is a backtick: `wird `` this is a backtick: ` ``und ` `` ``` ````` ``````wird ```` ` `` ``` ````` `````` ````.

  • Kommentare (Mini-Markdown)

    • Wickeln Sie sich ein `und entkommen Sie allen `mit \`. (Zum Beispiel potatowird `potato`, this is a backtick: `wird this is a backtick: \`und ` `` ``` ````` ``````wird \` \`\` \`\`\` \`\`\`\`\` \`\`\`\`\`\`.

Das ist ; Die kürzeste Antwort in Byte-Anzahl gewinnt.

Türknauf
quelle
Was ist mit dem Weltraum? `` bekommt keine Code-Formatierung ...
Justin
@Quincunx Hmm ... wie soll man Leerzeichen im Code überhaupt formatieren?
Türknauf
Ich habe keine Ahnung. In diesem Beitrag habe ich gelernt, wie man Backticks und dergleichen formatiert.
Justin
2
Das Kommentarformular funktioniert auch nicht für \; Um a zu formatieren \, müssen Sie dies tun ``\``. Auch alles, was mit einem endet, stößt auf \dasselbe Problem: asdf\produziert "asdf"
Justin

Antworten:

4

APL (90)

(Ja, der APL-Zeichensatz passt in ein Byte. Hier ist die IBM Codepage 907. )

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

Dies ist eine Funktion, die eine Zeichenfolge verwendet und ein Array aus zwei Zeichenfolgen zurückgibt, wobei die erste Zeichenfolge die Kommentardarstellung und die zweite Zeichenfolge die vollständige Postdarstellung ist .

Tests:

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

Hinweis: Ich habe der Funktion aus Gründen der Lesbarkeit einen Namen gegeben. Dies ist für die Verwendung nicht unbedingt erforderlich (Sie können das Argument einfach neben die anonyme Funktion stellen), daher habe ich es nicht gezählt.

Marinus
quelle
2

Ruby, 119

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

Ungolfed:

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
Türknauf
quelle