É um cabeçalho duplo +!

13

Relacionado

Exposição

Depois de ganhar o sorteio de SO, você poderia estar no topo do mundo e estava! O sorteio já vinha ocorrendo há um ano, e você era um dos cem programadores que foram selecionados para entrar no reduto da SO. E, finalmente, a espera acabou. Hoje é o dia em que você vai - [o texto ofuscado continua].

Ops. Desculpe, não deveria contar.

De qualquer forma, você finalmente chegou para encontrar um homem de rosto estóico em um terno preto com o minúsculo emblema SO. Ele franze a testa para você. "Os outros já estão lá dentro", disse ele, observando que você foi identificado no portão. "Rapidamente."

Você corre para dentro, um pouco assustada. O que diabos aconteceu? O que havia de errado na SO? Lá dentro, você observa que os outros 99 programadores estão olhando fixamente para suas telas, digitando. Você ocupa o assento restante e é recebido com a seguinte mensagem:

Olá programador! Parece que encontramos um problema; O SO foi penetrado por quem não conhecemos. (Pessoalmente, suspeito que tenha sido um programador Pyth ou CJam, mas ei.) No entanto, tudo o que foi prejudicado é o editor do Markdown. Bem, na verdade, é bastante, mas é aí que você entra.
Quero que você crie um programa (ou função, não somos exigentes) que interprete um arquivo de descontos e o converta no nosso novo "SO Beautifier-Arity -Decompositor "(também conhecido como" SOBAD "). Você deve fazer isso com a menor quantidade de bytes - estamos executando o downdown até resolvermos esse problema de hackers. Obrigado pelo seu tempo e boa sorte!

Atenciosamente,
The Maker of Stack Overflow


Objetivo Dado um arquivo de remarcação válido como entrada para o seu envio, execute e produza as seguintes transformações na entrada:

(Quando uso o +símbolo, quero dizer o operador "uma ou mais instâncias do caractere anterior" do RegExp, não um sinal de adição literal.)

  • Transforme todos os cabeçalhos de nível 1 ( # ...ou ...\n=+) em { ... }, ...tornando - se TODOS OS CAPS.
  • Transforme todos os cabeçalhos de Nível 2 ( ## ...ou ...\n-+) em {{ ... }}, com cada palavra em maiúscula
  • Transforme todos os cabeçalhos de nível 3 ( ### ...) em letras minúsculas; isto é, todas as letras (sem distinção entre maiúsculas e minúsculas) são mapeadas de ᴀʙᴄᴅᴇғɢʜɪᴊᴋʟᴍɴᴏᴘǫʀsᴛᴜᴠᴡxʏᴢuma maneira respectiva.
  • Transforme todas as ocorrências em negrito ( **...**) em ..., ...tornando - se ALL CAPS.
  • Transforme todas as ocorrências em itálico ( _..._) em . . ., onde um espaço foi inserido entre cada par de caracteres.
  • Transforme todas as instâncias de código ( `...`) em < ... >.
  • Transforme todas as instâncias rasuradas ( ---...---) em -.-.-.-, onde a -foi inserida entre cada par de caracteres.
  • Transforme todas as instâncias da lista numerada ( N. {a}\nN. {b} ...onde Ncorresponde à regex [0-9]+) para ( 1. {a}\n 2. {b}...)
  • Transforme todas as instâncias de lista não ordenadas ( * ...\n* ......) em ( o ...\n o ......)

Mais detalhes

  • Os cabeçalhos e as instâncias da lista serão encontrados apenas no início das linhas; no entanto, eles podem ser cercados por uma quantidade de espaço em branco.
  • Haverá casos não ligados, por exemplo, *a_*a_não é válido para os nossos padrões, nem nada parecido __a__, *_a_*ou _*a*_aparecer em uma entrada.
  • Um cabeçalho de múltiplas linhas é válido se e somente se o -ou =s seguir diretamente uma linha de texto.
  • Nenhum cabeçalho conterá outras entidades de remarcação. Por exemplo, # `code` snippetnão é uma entrada válida para nossos propósitos
  • Você não precisa contabilizar os cabeçalhos de nível 4+
  • Você não precisa preservar espaços em excesso (ou seja, > 1espaços) dentro do arquivo; portanto, não há problema em se **hello there**tornar, **hello there**mas não é **hellothere**. Da mesma forma, os espaços à direita e à esquerda encontrados em uma linha não precisam ser preservados
  • Nenhum tabulador será encontrado na entrada.
  • NÃO EXISTEM INSTANTES NESTED. Por exemplo, ***...***nunca ocorreria.
  • Um espaço sempre seguirá um marcador não ordenado (por exemplo, * ...não *...)
  • Os itens da lista em listas ordenadas e não ordenadas sempre consistem em uma única linha.
  • Pares de caracteres incomparáveis ​​devem ser ignorados. Por exemplo, ** coole `java::defdeve permanecer o mesmo.

Métodos de entrada

A entrada deve ser uma das seguintes:

  1. Uma matriz / tupla / lista / etc. de cordas.
  2. OU uma sequência contendo novas linhas para separar linhas.

Use o equivalente mais próximo do seu idioma aos tipos de dados mencionados acima, se o seu idioma não os suportar. (Por exemplo, o TI-BASIC não suporta (1.) ... não que o TI-BASIC possa competir, de qualquer forma: P).

Casos de teste

A }significa entrada e a próxima linha significa saída. }S múltiplos significam linhas de texto separadas por nova linha.

} Hello!
Hello!

} That _2 + 2 = 5_ challenge sure was **intense!**
That  2  +  2  =  5  challenge sure was INTENSE!
    // note that there are spaces also padding it

} It's `s/a/e/g` **not** `sudo g/a/e/s`, stupid.
It's < s/a/e/g > NOT < sudo g/a/e/s >

} **WHAT!** He did _WHAT?!_
WHAT! He did W H A T ? !

} _WHAT_ is undefined, here!
 W H A T  is undefined, here!

} OI)(EJDSFIJK L:JP #@*REF&WDS F*(D+S +&(SDFWEF )DSF _DSF_F #R#
OI)(EJDSFIJK L:JP #@*REF&WDS F*(D+S +&(SDFWEF )DSF  D S F F #R#

} # So, you wanna be a programmer, eh?
} ## Step 1: learn recursion
} ### Learning recursion requires learning recursion
} **Programming** is a futile task. _Leave w h i l e you still can!_
{SO YOU WANNA BE A PROGRAMMER, EH?}
{{Step 1: Learn Recursion}}
ʟᴇᴀʀɴɪɴɢ ʀᴇᴄᴜʀsɪᴏɴ ʀᴇǫᴜɪʀᴇs ʟᴇᴀʀɴɪɴɢ ʀᴇᴄᴜʀsɪᴏɴ
PROGRAMMING is a futile task.  L e a v e   w   h   i   l   e   y o u   s t i l l   c a n !  // trailing space not required

} Haha, you're a _Java_ golfer? You'd be better of with brainf***.
Haha, you're a  J a v a  golfer? You'd be better of with brainf***. // less than four asterisks, do nothing

} # Reasons why NOT to use C--:
} 1. It doesn't exist.
} 2. I don't care.
{REASONS WHY NOT TO USE C--:}
 1. It doesn't exist.
 2. I don't care.

} 1. This is a test!
} 1. <-- And this actually works in Markdown.
 1. This is a test!
 2. <-- And this actually works in Markdown. // less than three -s, ignore

} * no.
} * NOOO.
} * fine.
 o no.
 o NOOO.
 o fine.

} Python, ---34--- 3 bytes.
Python, -3-4- 3 bytes.

} ---Long line of crossed text.---
-L-o-n-g- -l-i-n-e- -o-f- -c-r-o-s-s-e-d- -t-e-x-t-.-

} ** cool!
** cool! // is not a bullet point, because a space doesn't follow the *; Isn't bold, because there is no matching **

 -- end of test cases --

Bônus

  1. -19 bytes, se você suportar o escape de caracteres (para que sejam tratados como "normais"); você pode escolher qualquer caractere de escape, mas eu sugiro \ou ^. Observe que o sistema de escape nos sites SO é diferente do que estou sugerindo (e mais complicado), portanto, não faça isso! SO trataria `\`como \, mas eu gostaria que você tratasse o segundo `como um caractere comum e, em vez disso, correspondesse ao próximo ` caractere.
Conor O'Brien
fonte
2
A especificação é muito fraca para uma questão de golfe.
feersum
4
Obrigado, defensores, por me dizerem exatamente o que estou fazendo de errado. Isso realmente me ajuda a melhorar esta questão.
Conor O'Brien
4
Eu acho que há casos em que a aplicação de uma transformação pode mudar se outra transformação se aplica. Por exemplo, ***word***torna-se * * w o r d * *depois de aplicar a transformação em itálico e, de repente, a transformação em negrito não se aplica. Não está claro como lidar com isso.
Rainbolt 28/10/2015
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Há uma série de questões mencionadas nos comentários, com votos positivos. Eu não acho que os que recusam propositalmente estão deixando de fornecer feedback; eles provavelmente estão apenas votando no feedback existente.
Alex A.
1
@AlexA. Quando ambas as votações negativas ocorreram, nenhuma votação positiva existiu nos comentários, nem por um período posterior.
Conor O'Brien

Respostas:

1

Python 3 , 652 640 bytes

import re
def N(o):c,t,_=o.groups();x=' -'[c<'_'];return['< %s >'%t,t.upper()][c<'`']if c in'**`'else x+x.join(t)+x
def f(s):
 S=[];i=0
 while s:
  l=s.pop(0);n=set(*s[:1])
  if n<={*'=-'}and n:s=s[1:];l='#'*('-'in n)+'# '+l
  if'# '==l[:2]:l='{%s}'%l[2:].upper()
  if'## '==l[:3]:l='{{%s}}'%l[3:].title()
  if'### '==l[:4]:l=''.join('ᴀʙᴄᴅᴇғɢʜɪᴊᴋʟᴍɴᴏᴘǫʀsᴛᴜᴠᴡxʏᴢ'[ord(c)-65]if'@'<c<'['else c for c in l[4:].upper())
  l=re.sub(('(\*\*|_|---|`)(.*?)'*2)[:-5],N,re.sub(r'^\s*[*] (.*)',r' o \1',l))
  if re.match(r'\s*\d+\. ',l):i+=1;l=re.sub(r'\s*\d+\.(.*)',' %d.'%i+r'\1',l)
  else:i=0
  S+=[l]
 return S

Experimente online!

TFeld
fonte