Фрагментируйте фрагменты кода на Stack Exchange

9

Ваша цель - ввести любой произвольный текст, например:

This is some text

И выведите этот текст в формате кода для постов (разметка SE) и комментариев (мини-разметка) на Stack Exchange, например:

`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, nравен 1, для this is a backtick: `, nравно 2, и ` `` ``` ````` ``````, nравно 4.)

    • Шаг 2: обернуть строку в nкавычки. Если строка начинается или заканчивается обратным трюком, вы должны также переносить пробелы. (Например, potatoстановится `potato`, this is a backtick: `становится `` this is a backtick: ` ``и ` `` ``` ````` ``````становится ```` ` `` ``` ````` `````` ````.

  • Комментарии (мини-уценка)

    • Wrap в `и избежать всех `«S с \`. (Например, potatoстановится `potato`, this is a backtick: `становится this is a backtick: \`и ` `` ``` ````` ``````становится \` \`\` \`\`\` \`\`\`\`\` \`\`\`\`\`\`.

Это ; выигрывает самый короткий ответ в количестве байтов.

Дверная ручка
источник
А как насчет космоса? `` не получает форматирование кода ...
Джастин
@Quincunx Хмм ... как ты вообще должен форматировать пробелы в коде?
Дверная ручка
Не имею представления. В этом посте я узнал, как форматировать обратные метки и тому подобное.
Джастин
2
Форма комментариев также не работает \; чтобы отформатировать \, нужно сделать ``\``. Кроме того, все, что заканчивается результатом, приводит \к той же самой проблеме: asdf\производит `asdf`
Джастин

Ответы:

4

APL (90)

(Да, кодировка APL вписывается в байт, вот кодовая страница IBM 907. )

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

Это функция, которая принимает строку и возвращает массив из двух строк, где первая строка - это представление комментария, а вторая строка - полное представление поста .

тесты:

      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

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
Дверная ручка
источник