Це подвійний + заголовок!


13

Пов'язані

Експозиція

Вигравши розіграш SO, ви могли бути на вершині світу, і ви були! Розіграш тривав уже рік, і ви були одним із сотень програмістів, які були обрані для участі у твердині ОВ. І нарешті, очікування закінчено. Сьогодні день, в який ви йдете - [затуманений текст продовжується].

Уопс. Вибачте, не повинен розповідати.

У всякому разі, ви нарешті приїхали зустріти стоїчного чоловіка в чорному костюмі з крихітною емблемою SO на ньому. Він нахмуриться на тебе. "Інші вже знаходяться всередині", - сказав він, зазначивши, що вас отопізнали біля воріт. "Швидко".

Ти кинешся всередину, тад злякався. Що на землі пішло? Що було не так у SO? Всередині ви спостерігаєте, як інші 99 програмістів пильно дивляться на свої екрани, набираючи текст. Ви займаєте місце, що залишилося, і вас вітає таке повідомлення:

Привіт, програміст! Здається, ми зіткнулися з проблемою; Так проникли, ким ми не знаємо. (Особисто я підозрюю, що це був програміст Pyth або CJam, але ей.) Однак, все, що було завдано шкоди, - це редактор Markdown. Ну, насправді, це досить багато, але саме там ви заходите.
Я хочу, щоб ви створили програму (або функцію, ми не вибагливі), яка буде інтерпретувати файл розмітки та перетворювати його в наш новий "SO Beautifier-Arity -Декомпозитор "(також" SOBAD ") формат. Ви повинні зробити це в найкоротшій кількості байтів - ми працюємо на низькому рівні, поки не вирішимо цю проблему злому. Дякуємо за ваш час, і найкраща удача!

З повагою,
The Maker of Stack Overflow


Мета Дано дійсний файл розмітки як вхід для подання, виконайте та виведіть наступні перетворення на вході:

(Коли я використовую +символ, я маю на увазі оператор RegExp "один або кілька екземплярів попереднього символу", а не буквальний знак плюс.)

  • Перетворіть усі заголовки рівня 1 ( # ...або ...\n=+) на { ... }, ...перетворившись на ВСІ КАПС.
  • Перетворіть усі заголовки рівня 2 ( ## ...або ...\n-+) на {{ ... }}кожне слово з великої літери
  • Перетворіть усі заголовки рівня 3 ( ### ...) у маленькі кришки; тобто всі літери (нечутливі до регістру) відображаються ᴀʙᴄᴅᴇғɢʜɪᴊᴋʟᴍɴᴏᴘǫʀsᴛᴜᴠᴡxʏᴢу відповідний спосіб.
  • Перетворіть усі сміливі екземпляри ( **...**) ..., ...перетворившись на ВСІ КАПС.
  • Перетворіть усі курсивні екземпляри ( _..._) в . . ., де між кожною парою символів було вставлено пробіл.
  • Перетворіть усі екземпляри коду ( `...`) в < ... >.
  • Перетворіть усі прокреслені екземпляри ( ---...---) в -.-.-.-, де а -вставлено між кожною парою символів.
  • Перетворіть усі пронумеровані екземпляри списку ( N. {a}\nN. {b} ...де Nвідповідає регулярному вираженню [0-9]+) в ( 1. {a}\n 2. {b}...)
  • Перетворіть усі не упорядковані екземпляри списку ( * ...\n* ......) в ( o ...\n o ......)

Детальніше

  • Екземпляри заголовків і списків можна знайти лише на початку рядків, однак вони можуть бути оточені великою кількістю пробілів.
  • Там буде не пов'язані екземпляри, наприклад, *a_*a_не є допустимим для наших стандартів, і не буде нічого подібного __a__, *_a_*або _*a*_з'являються у вході.
  • Багаторядковий заголовок дійсний лише тоді, коли -або =s безпосередньо слідує за рядком тексту.
  • Жоден заголовок не міститиме інших об'єктів розмітки. Напр., # `code` snippetНе є коректною інформацією для наших цілей
  • Вам не доведеться обліковувати заголовки рівня 4+
  • Вам не потрібно зберігати зайві пробіли (тобто > 1пробіли) у файлі, тому це нормально, але це потрібно **hello there**робити, **hello there**але ні **hellothere**. Аналогічно, відстані та провідні простори, знайдені на лінії, не повинні зберігатися
  • У вхідних даних не знайдеться таблиць.
  • НЕ БУДУТЬСЯ НЕ МАЄТЬСЯ РОЗПОЛУЧЕННЯ. Наприклад, ***...***ніколи не відбудеться.
  • Пробіл завжди буде слідувати не упорядкованій точці кулі (наприклад, * ...не *...)
  • Елементи списку в упорядкованих та не упорядкованих списках завжди будуть складатися з одного рядка.
  • Незрівнянні пари символів слід ігнорувати. Наприклад, ** coolі `java::defповинен залишатися колишнім.

Методи введення

Вхід повинен бути одним із наступних:

  1. Масив / кортеж / список / тощо. струн.
  2. АБО рядок, що містить нові рядки для окремих рядків.

Використовуйте найближчий еквівалент вашої мови вищезгаданим типам даних, якщо ваша мова не підтримує їх. (Наприклад, TI-BASIC не підтримує (1.)… не те, що TI-BASIC може змагатися, як би там не було: P).

Тестові справи

A }означає вхід, а наступний рядок означає вихід. Множинні }s означають розділені рядками тексту за допомогою рядків.

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

Бонус

  1. -19 байт, якщо ви підтримуєте втечу символів (щоб вони трактувалися як "нормальні"); Ви можете обрати будь-який символ втечі, але я б запропонував \або ^. Зауважте, що система виходу на сайти SO відрізняється від запропонованої мною (і складнішою), тому не робіть цього! Так би трактувати `\`як \, але я хотів би, щоб ви ставились до другого `як до цього звичайного символу, а натомість відповідали наступному ` символу.

2
Специфікація занадто слабка для питання про гольф.
feersum

4
Дякую, низовики, що сказали мені, що я роблю неправильно. Це дійсно допомагає мені зробити це питання кращим.
Conor O'Brien

4
Я думаю, що є випадки, коли застосування однієї трансформації може змінити, чи застосовується інша трансформація. Наприклад, це ***word***стає * * w o r d * *після того, як ви застосуєте курсивне перетворення, і раптом жирне перетворення не застосовується. Незрозуміло, як з цим впоратися.
Rainbolt

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ У коментарях відзначено ряд питань, які мають відгуки. Я не думаю, що користувачі, котрі цілеспрямовано, цілеспрямовано нехтують наданням відгуків; вони, ймовірно, просто підтримують наявні відгуки.
Олексій А.

1
@AlexA. Коли відбулися обидва поточні матеріали, коментарі не існували, а також протягом періоду пізніше.
Conor O'Brien

Відповіді:


1

Python 3 , 652 640 байт

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

Спробуйте в Інтернеті!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.