Extraits de code Backtickify sur Stack Exchange

9

Votre objectif est de saisir tout texte arbitraire, tel que:

This is some text

Et affichez ce texte au format code pour les publications (Markdown à saveur SE) et les commentaires (mini-Markdown) sur Stack Exchange, tels que:

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

Cependant, cela devient plus délicat. Considérez l'entrée:

Perl has a variable called $`

La sortie doit être

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

Les règles complètes de formatage sont les suivantes:

  • Articles complets (Markdown SE complet)

    • Étape 1: comptez le plus petit nombre pour lequel il n'y a pas exactement autant de retours consécutifs dans la chaîne. Appelons ça n. (Par exemple, pour la chaîne potato, nest 1, pour this is a backtick: `, nest 2 et pour ` `` ``` ````` ``````, nest 4.)

    • Étape 2: enveloppez la chaîne de nguillemets. Si la chaîne commence ou se termine par un backtick, vous devez également encapsuler avec des espaces. (Par exemple, potatodevient `potato`, this is a backtick: `devient `` this is a backtick: ` ``et ` `` ``` ````` ``````devient ```` ` `` ``` ````` `````` ````.

  • Commentaires (mini-Markdown)

    • Envelopper dans `et échapper à tous les `« s avec \`. (Par exemple, potatodevient `potato`, this is a backtick: `devient this is a backtick: \`et ` `` ``` ````` ``````devient \` \`\` \`\`\` \`\`\`\`\` \`\`\`\`\`\`.

C'est ; la réponse la plus courte en nombre d'octets l'emporte.

Poignée de porte
la source
Et l'espace? `` n'obtient pas de formatage de code ...
Justin
@Quincunx Hmm ... comment êtes-vous censé formater de toute façon les espaces dans le code?
Poignée de porte
Je n'ai aucune idée. Ce poste est l'endroit où j'ai appris à formater les backticks et autres.
Justin
2
Le formulaire de commentaire ne fonctionne pas non plus \; pour formater un \, vous devez le faire ``\``. De plus, tout ce qui se termine par un rencontre \le même problème: asdf\produit `asdf`
Justin

Réponses:

4

APL (90)

(Oui, le jeu de caractères APL tient dans un octet, voici la page de codes 907 d' IBM .)

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

Il s'agit d'une fonction qui prend une chaîne et renvoie un tableau de deux chaînes, où la première chaîne est la représentation du commentaire et la deuxième chaîne est la représentation complète du post .

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

Remarque: J'ai donné un nom à la fonction par souci de lisibilité, ce n'est pas strictement nécessaire pour l'utiliser (vous pouvez simplement mettre l'argument à côté de la fonction anonyme), donc je ne l'ai pas compté.

marinus
la source
2

Rubis, 119

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

Non 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
Poignée de porte
la source