C'est un double + en-tête!

13

en relation

Exposition

Après avoir remporté la tombola SO, vous auriez pu être au top du monde, et vous l'avez été! La tombola durait depuis un an maintenant, et vous étiez l'un des cent programmeurs sélectionnés pour entrer dans le bastion SO. Et enfin, l'attente est terminée. Aujourd'hui, c'est le jour où vous allez - [le texte obscurci continue].

Oups. Désolé, pas censé le dire.

Quoi qu'il en soit, vous êtes enfin arrivé pour rencontrer un homme au visage stoïque dans un costume noir avec le minuscule emblème SO dessus. Il fronce les sourcils. "Les autres sont déjà à l'intérieur", a-t-il dit, notant que vous aviez été identifié à la porte. "Rapidement."

Vous vous précipitez à l'intérieur, un peu effrayé. Que diable s'était-il passé? Qu'est-ce qui n'allait pas chez SO? À l'intérieur, vous observez que les 99 autres programmeurs regardent attentivement leurs écrans en tapant. Vous prenez le siège restant et vous êtes accueilli par le message suivant:

Bonjour programmeur! Il semble que nous ayons rencontré un problème; SO a été pénétré, par qui nous ne savons pas. (Personnellement, je soupçonne que c'était un programmeur Pyth ou CJam, mais bon.) Cependant, tout ce qui a été blessé est l'éditeur Markdown. Eh bien, en fait, c'est beaucoup, mais c'est là que vous intervenez.
Je veux que vous créiez un programme (ou une fonction, nous ne sommes pas pointilleux) qui interprétera un fichier de démarque et le convertira en notre nouveau "SO Beautifier-Arity" -Décomposeur "(alias" SOBAD "). Vous devez le faire dans le nombre d'octets le plus court - nous fonctionnons en bas jusqu'à ce que nous résolvions ce problème de piratage. Merci pour votre temps et bonne chance!

Cordialement,
Le fabricant de débordement de pile


Objectif Étant donné un fichier de démarque valide en entrée de votre soumission, effectuez et sortez les transformations suivantes sur l'entrée:

(Lorsque j'utilise le +symbole, je veux dire l'opérateur RegExp "une ou plusieurs instances du caractère précédent", pas un signe plus littéral.)

  • Transformer tous les en- têtes de niveau 1 ( # ...ou ...\n=+) à { ... }, avec ...devenir MAJUSCULES.
  • Transformez tous les en-têtes de niveau 2 ( ## ...ou ...\n-+) en {{ ... }}, avec chaque mot en majuscule
  • Transformez tous les en-têtes de niveau 3 ( ### ...) en petites majuscules; c'est-à-dire que toutes les lettres (insensibles à la casse) sont mappées d' ᴀʙᴄᴅᴇғɢʜɪᴊᴋʟᴍɴᴏᴘǫʀsᴛᴜᴠᴡxʏᴢune manière respective.
  • Transformer toutes les instances en gras ( **...**) à ..., avec ...devenir MAJUSCULES.
  • Transformez toutes les instances italiques ( _..._) en . . ., où un espace a été inséré entre chaque paire de caractères.
  • Transformez toutes les instances de code ( `...`) en < ... >.
  • Transformez toutes les instances barrées ( ---...---) en -.-.-.-, où un -a été inséré entre chaque paire de caractères.
  • Transformez toutes les instances de liste numérotée ( N. {a}\nN. {b} ...Ncorrespond à l'expression régulière [0-9]+) en ( 1. {a}\n 2. {b}...)
  • Transformez toutes les instances de liste non ordonnées ( * ...\n* ......) en ( o ...\n o ......)

Plus de détails

  • Les en-têtes et les instances de liste ne seront trouvés qu'au début des lignes, cependant, ils peuvent être entourés d'un certain espace.
  • Il n'y aura pas des cas liés, par exemple, *a_*a_ne sont pas valables pour nos normes, ni quoi que ce soit comme volonté __a__, *_a_*ou _*a*_apparaissent dans une entrée.
  • Un en-tête multiligne est valide si et seulement si le -ou =s suit directement une ligne de texte.
  • Aucun en-tête ne contiendra d'autres entités de démarque. Par exemple, # `code` snippetn'est pas une entrée valide pour nos besoins
  • Vous n'avez pas à prendre en compte les en-têtes de niveau 4+
  • Vous n'avez pas à conserver les espaces excédentaires (c'est-à-dire les > 1espaces) dans le fichier, il est donc normal de devoir **hello there**le devenir **hello there**mais pas **hellothere**. De même, les espaces de fin et de début trouvés sur une ligne ne doivent pas être conservés
  • Aucun tabulateur ne sera trouvé dans l'entrée.
  • IL N'Y AURA PAS D'INSTANCES IMPOSSIBLES. Par exemple, ***...***ne se produirait jamais.
  • Un espace suivra toujours une puce non ordonnée (par exemple, * ...pas *...)
  • Les éléments de liste dans les listes ordonnées et non ordonnées seront toujours constitués d'une seule ligne.
  • Les paires de caractères inégalées doivent être ignorées. Par exemple, ** coolet `java::defdevrait rester le même.

Méthodes de saisie

L'entrée doit être l'une des suivantes:

  1. Un tableau / tuple / list / etc. de cordes.
  2. OU une chaîne contenant des sauts de ligne pour séparer les lignes.

Utilisez l'équivalent le plus proche de votre langue pour les types de données susmentionnés si votre langue ne les prend pas en charge. (Par exemple, TI-BASIC ne prend pas en charge (1.)… pas que TI-BASIC puisse rivaliser de toute façon: P).

Cas de test

A }signifie entrée et la ligne suivante signifie sortie. Plusieurs }s signifient des lignes de texte séparées par des sauts de ligne.

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

Prime

  1. -19 octets si vous supportez l'échappement des caractères (pour qu'ils soient traités comme "normaux"); vous pouvez choisir n'importe quel personnage d'échappement, mais je suggère \ou ^. Notez que le système d'échappement sur les sites SO est différent de ce que je suggère (et plus compliqué), alors ne le faites pas! SO traiterait `\`comme \, mais je voudrais que vous traitiez le second `comme un caractère normal et que vous correspondiez plutôt au caractère suivant ` .
Conor O'Brien
la source
2
La spécification est trop faible pour une question de golf.
feersum
4
Merci, downvoters, de m'avoir dit exactement ce que je fais mal. Cela m'aide vraiment à améliorer cette question.
Conor O'Brien
4
Je pense qu'il y a des cas où l'application d'une transformation pourrait changer si une autre transformation s'applique. Par exemple, ***word***devient * * w o r d * *après avoir appliqué la transformation en italique, et soudain la transformation en gras ne s'applique pas. On ne sait pas comment gérer cela.
Rainbolt
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Il y a un certain nombre de problèmes notés dans les commentaires, qui ont des votes positifs. Je ne pense pas que les downvoters négligent délibérément de fournir des commentaires; ils sont probablement en train de voter pour les commentaires existants.
Alex A.
1
@AlexA. Lorsque les deux downvotes se sont produits, il n'y avait pas de upvotes sur les commentaires, ni pendant une période ultérieure.
Conor O'Brien

Réponses:

1

Python 3 , 652 640 octets

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

Essayez-le en ligne!

TFeld
la source