Ułamkowe fragmenty kodu w usłudze Stack Exchange

9

Twoim celem jest wprowadzenie dowolnego dowolnego tekstu, takiego jak:

This is some text

I wyślij ten tekst sformatowany jako kod dla postów (Markdown o smaku SE) i komentarzy (mini-Markdown) na Stack Exchange, takich jak:

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

Jest jednak trudniej. Rozważ dane wejściowe:

Perl has a variable called $`

Dane wyjściowe muszą być

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

Pełne zasady formatowania to:

  • Pełne posty (pełne SE Markdown)

    • Krok 1: policz najmniejszą liczbę, dla której nie ma dokładnie tylu kolejnych ciągów wstecznych w ciągu. Nazwijmy to n. (Na przykład, w ciągu potato, nwynosi 1, w this is a backtick: `, noznacza 2, i ` `` ``` ````` ``````, njest 4)

    • Krok 2: zawiń sznurek w nbackticks. Jeśli ciąg zaczyna się lub kończy tylnym kliknięciem, musisz również zawinąć spacje. (Na przykład potatostaje się `potato`, this is a backtick: `staje się `` this is a backtick: ` ``i ` `` ``` ````` ``````staje się ```` ` `` ``` ````` `````` ````.

  • Komentarze (mini-Markdown)

    • Wrap w `i uciec wszystkie `„sz \`. (Na przykład potatostaje się `potato`, this is a backtick: `staje się this is a backtick: \`i ` `` ``` ````` ``````staje się \` \`\` \`\`\` \`\`\`\`\` \`\`\`\`\`\`.

To jest ; najkrótsza odpowiedź w liczbie bajtów wygrywa.

Klamka
źródło
Co z przestrzenią? `` nie otrzymuje formatowania kodu ...
Justin
@Quincunx Hmm ... jak i tak masz formatować spacje w kodzie?
Klamka
Nie mam pojęcia. W tym poście nauczyłem się formatować backticks i tym podobne.
Justin
2
Formularz komentarza również nie działa \; aby sformatować \, musisz zrobić ``\``. Także wszystko, co kończy się \na tym samym problemie: asdf\produkuje `asdf`
Justin

Odpowiedzi:

4

APL (90)

(Tak, zestaw znaków APL pasuje do bajtu, oto strona kodowa IBM 907 ).

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

Jest to funkcja, która pobiera ciąg i zwraca tablicę dwóch ciągów, przy czym pierwszy ciąg reprezentuje komentarz, a drugi ciąg reprezentuje pełny post .

Testy:

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

Uwaga: Nadałem tej funkcji nazwę ze względu na czytelność, nie jest to absolutnie konieczne, aby z niej korzystać (możesz po prostu umieścić argument obok funkcji anonimowej), więc jej nie policzyłem.

marinus
źródło
2

Ruby, 119

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

Nie golfowany:

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
Klamka
źródło