Backtickify fragmentos de código en Stack Exchange

9

Su objetivo es ingresar cualquier texto arbitrario, como:

This is some text

Y envíe ese texto formateado como código para publicaciones (Markdown con sabor SE) y comentarios (mini Markdown) en Stack Exchange, como:

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

Sin embargo, se vuelve más complicado. Considere la entrada:

Perl has a variable called $`

La salida debe ser

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

Las reglas completas para el formato son:

  • Publicaciones completas (Markdown completo de SE)

    • Paso 1: cuente el menor número para el que no hay exactamente tantos backticks consecutivos en la cadena. Llamemos esto n. (Por ejemplo, para la cadena potato, nes 1, para this is a backtick: `, nes 2 y para ` `` ``` ````` ``````, nes 4.)

    • Paso 2: envuelve la cuerda en ncomillas. Si la cadena comienza o termina con una marca de retroceso, también debe envolver con espacios. (Por ejemplo, se potatoconvierte `potato`, se this is a backtick: `convierte `` this is a backtick: ` ``y se ` `` ``` ````` ``````vuelve ```` ` `` ``` ````` `````` ````.

  • Comentarios (mini-Markdown)

    • Envoltura en `y escapar de todos los `'s con \`. (Por ejemplo, se potatoconvierte `potato`, se this is a backtick: `convierte this is a backtick: \`y se ` `` ``` ````` ``````vuelve \` \`\` \`\`\` \`\`\`\`\` \`\`\`\`\`\`.

Este es el ; la respuesta más corta en bytes cuenta gana.

Pomo de la puerta
fuente
¿Qué hay del espacio? `` No recibe el formato de código ...
Justin
@Quincunx Hmm ... ¿cómo se supone que formatear espacios en el código de todos modos?
Pomo de la puerta
No tengo idea. Esta publicación es donde aprendí a formatear backticks y demás.
Justin
2
El formulario de comentarios tampoco funciona \; para formatear a \, debes hacer ``\``. Además, cualquier cosa que termine con a se \encuentra con el mismo problema: asdf\produce `asdf`
Justin

Respuestas:

4

APL (90)

(Sí, el juego de caracteres APL cabe en un byte, aquí está la página de códigos 907 de IBM ).

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

Esta es una función que toma una cadena y devuelve una matriz de dos cadenas, donde la primera cadena es la representación del comentario y la segunda cadena es la representación posterior completa .

Pruebas:

      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: Le di un nombre a la función por razones de legibilidad, esto no es estrictamente necesario para usarla (solo puede poner el argumento al lado de la función anónima), así que no lo conté.

marinus
fuente
2

Ruby, 119

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

Sin golf:

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
Pomo de la puerta
fuente