Backtickify trechos de código no Stack Exchange

9

Seu objetivo é inserir qualquer texto arbitrário, como:

This is some text

E produza esse texto formatado como código para postagens (Markdown com sabor SE) e comentários (mini Markdown) no Stack Exchange, como:

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

No entanto, fica mais complicado. Considere a entrada:

Perl has a variable called $`

A saída deve ser

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

As regras completas para a formatação são:

  • Postagens completas (Markdown SE completo)

    • Etapa 1: conte o menor número para o qual não existem exatamente tantos backticks consecutivos na string. Vamos chamar assim n. (Por exemplo, para a sequência potato, né 1, para this is a backtick: `, né 2 e para ` `` ``` ````` ``````, né 4.)

    • Etapa 2: enrole a corda nas ncostas. Se a sequência começar ou terminar com um backtick, você também deverá quebrar os espaços. (Por exemplo, potatotorna-se `potato`, this is a backtick: `torna `` this is a backtick: ` ``- ` `` ``` ````` ``````se e torna - se ```` ` `` ``` ````` `````` ````.

  • Comentários (mini-Markdown)

    • Enrole `e escape de tudo `com \`. (Por exemplo, potatotorna-se `potato`, this is a backtick: `torna this is a backtick: \`- ` `` ``` ````` ``````se e torna - se \` \`\` \`\`\` \`\`\`\`\` \`\`\`\`\`\`.

Isso é ; a resposta mais curta na contagem de bytes vence.

Maçaneta da porta
fonte
E o espaço? `` Não fica de formatação de código ...
Justin
@ Quincunx Hmm ... como você deve formatar espaços no código?
Maçaneta
Eu não faço ideia. Este post é onde eu aprendi como formatar backticks e tal.
Justin
2
O formulário de comentários também não funciona \; para formatar um \, você precisa fazer ``\``. Além disso, qualquer coisa que termine com \o mesmo problema: asdf\produz `asdf`
Justin

Respostas:

4

APL (90)

(Sim, o conjunto de caracteres APL cabe em um byte, aqui está a página de código 907 da IBM .)

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

Essa é uma função que pega uma string e retorna uma matriz de duas strings, onde a primeira string é a representação do comentário e a segunda string é a representação completa da postagem .

Testes:

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

Nota: Dei à função um nome para facilitar a leitura, não é estritamente necessário usá-la (você pode colocar o argumento ao lado da função anônima) para não contar.

marinus
fonte
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
Maçaneta da porta
fonte