Роздвоєний текст


26

Враховуючи рядок літер ASCII (верхній та / або нижній регістр), виведіть необроблений MathJax, необхідний для відображення цієї рядка, роздвоєної на кожному символі, в надписи та підписки. Наприклад, входи catта horseрезультати призведе до результатів, які MathJax надає відповідно наступним чином:

зображення кішки біфуркаючи зображення коня біфуркації

Зауважте, що потрібно взяти лише один вхід - ці два перераховані поруч просто для економії вертикального простору.

Значення розмітки

  • _ вказує на підпис.
  • ^ вказує на надрив.
  • Наклейки потрібні навколо надписаних або підписаних підрядів, які містять подальший надписи або підписки, щоб запобігти їхньому знаходженню на одному рівні.

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

Тестові справи складаються у форматі input : output. Перший тестовий випадок показує порожній рядок, оскільки вхід повинен призвести до порожнього рядка як виводу.

"" : ""
"a" : "a"
"me" : "m_e^e"
"cat" : "c_{a_t^t}^{a_t^t}"
"frog" : "f_{r_{o_g^g}^{o_g^g}}^{r_{o_g^g}^{o_g^g}}"
"horse" : "h_{o_{r_{s_e^e}^{s_e^e}}^{r_{s_e^e}^{s_e^e}}}^{o_{r_{s_e^e}^{s_e^e}}^{r_{s_e^e}^{s_e^e}}}"
"bifurcate" : "b_{i_{f_{u_{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}^{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}}^{u_{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}^{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}}}^{f_{u_{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}^{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}}^{u_{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}^{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}}}}^{i_{f_{u_{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}^{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}}^{u_{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}^{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}}}^{f_{u_{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}^{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}}^{u_{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}^{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}}}}"

Ви можете побачити, як вони відображаються, вставивши вихід у mathurl.com .

Без зайвих брекетів

MathJax із задоволенням візуалізує розмітку із надлишковими дужками. Наприклад, наступний буде все виглядати однаково при візуалізації: a, {a}, {}{a}, {{{{a}}}}.

Однак дійсний вихід для цього виклику не має зайвих дужок. Зауважте, зокрема, що окремі символи у висновку не оточені дужками.

Замовлення

Порядок індекса та суперскрипту є неважливим. Нижче наведено рівнозначні показники, які не відрізнятимуться при виведенні (і всі вони однаково достовірні результати):

c_{a_t^t}^{a_t^t}
c_{a^t_t}^{a_t^t}
c_{a_t^t}^{a^t_t}
c_{a^t_t}^{a^t_t}
c^{a_t^t}_{a_t^t}
c^{a^t_t}_{a_t^t}
c^{a_t^t}_{a^t_t}
c^{a^t_t}_{a^t_t}

Оцінка балів

Для кожної мови переможець - найкоротший код у байтах.

Забагато сповіщень? Введіть </sub>для підписки


Забагато сповіщень? Введіть </sub>неподписку, а хто сказав, що я хочу скасувати підпис або щось таке? Це був тест, щоб побачити, чи я читаю цілий пост правильно?
Erik the Outgolfer

12
@EriktheOutgolfer ні, це був просто дуже поганий жарт.
трихоплакс

Чи можемо ми просто вивести зібраний результат у форматі PDF? Я хотів би написати чисту латексну відповідь.
Пшеничний майстер

@WheatWizard, це звучить як інший виклик. Тут не було б дійсно як відповідь.
трихоплакс

Відповіді:


10

Python, 95 90 86 92 82 байт

10 байт збережено завдяки @ConnerJohnston

f=lambda s:s and s[0]+(s[1:]and'_{0}^{0}'.format(s[2:]and'{'+f(s[1:])+'}'or s[1]))

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


4
Нічого собі, це якась шалена рекурсія.
Містер Xcoder

1
Дещо форматування рядків на 81 байт (ще не знаєте, як зв’язати TIO у коментарях): f = лямбда s: s і s [0] + '_ {0} ^ {0}'. Формат (s [2:] та ' {'+ f (s [1:]) +'} 'або s [1:] і s [1])
Коннер Джонстон,

1
@ConnerJohnston дякую! можна поставити посилання на tio [text](link), але це справді псує;)
Уріель

1
79 байт ; і я припускаю, що ви не хочете використовувати анонімний трюк функцій, однак збережете 2 байти.
Джонатан Фрех

7

Математика, 72 84 77 76 байт

a_±b__:={"{",a,"_",±b,"^",±b,"}"};±(a_:""):={"",a,""};""<>Most@Rest@±##&@@#&

Використовує кодування CP-1252 (Windows). Візьме список символів як вхідний.

Пояснення

a_±b__:=

Визначте функцію ±з 2 і більше аргументами. Позначте перший аргумент a, а другий і далі b.

{"{",a,"_",±b,"^",±b,"}"}

Створіть Listеквівалент "{a_±b^±b}"( ±bоцінюється знову, рекурсивно).

±(a_:""):= ...

Визначте функцію ±з 1 або 0 аргументами. Додайте перший аргумент a, якщо він існує, і призначити ""в aіншому випадку.

{"",a,""}

Створіть Listеквівалент "a", залитий порожніми Strings.

""<>Most@Rest@±##&@@#&

Чиста функція, яка застосовується ±до вводу, скидає перший і останній елемент і перетворюється Listна String.


7

CJam (35 байт)

MqW%{"^{ }_{ }"{AW$,)3e<#<},S/@*+}/

Це повна програма. Інтернет демо .

3 байти працюють навколо помилки в інтерпретаторі (див. Нижче).

Розсічення

M            e# Start building from the empty string
qW%{         e# For each character in the reversed input
  "^{ }_{ }" e#   Take a template
  {          e#   If the accumulator is of length n, remove all characters whose
    A        e#   codepoints are greater than pow(10,
    W$,)3e<  e#                                   min(n+1, 3))
    #<       e#   When the accumulator is the empty string, that's all of them.
  },         e#   When the accumulator is one character, that's {}
             e#   When the accumulator is any longer, it's none of them.
  S/@*       e#   Substitute the accumulator for the spaces.
  +          e#   Append to the new character.
}/

Зауважте, що min(n+1, 3)слід обійти помилку в інтерпретаторі: має бути певна модель у повноваженнях 10, яка '}менша, але це не очевидно .


Не працює для порожнього рядка (перший тестовий випадок).
трихоплакс

1
@trichoplax, це було пов’язано з тонкою різницею між GolfScript і CJam, яка час від часу виловлює мене. Тепер виправлено ціною лише одного байта, зробивши код набагато розумнішим, ніж був раніше.
Пітер Тейлор

Працює ідеально зараз. Чудове пояснення.
трихоплакс

@PeterTaylor (Принаймні, в демонстрації в Інтернеті) Це не працює для слів з більш ніж чотирма літерами.
десерт

2
@dessert, це дуже дивно, і, безумовно, заслуговує на повідомлення про помилку щодо перекладача. Я додав обхідне рішення вартістю 3 байти.
Пітер Тейлор

7

JavaScript (ES6), 57 55 байт

f=([c,...s])=>s+s?c+`_${p=s[1]?`{${f(s)}}`:s}^`+p:c||''

Θ (len (s)) складність! За словами @PeterTaylor, це насправді Θ (2 ^ len (s)), що все ще є найкращим можливим ...


Не працює для порожнього рядка (перший тестовий випадок).
трихоплакс

@trichoplax Слід виправити зараз.
ETHproductions

Працює ідеально зараз.
трихоплакс

1
Що є n у вашому O (n)? Я припускаю, що це довжина виводу, але якщо ви не заявите, що інтерпретація за замовчуванням є довжиною вводу, а оскільки довжина виведення є експоненціальною в довжину вводу, це неможливо реалізувати в поліноміальний час.
Пітер Тейлор

@PeterTaylor Я подумав, що оскільки алгоритм робить лише кроки len (input), складність є len (input) ... якщо це неправильно, я просто видалю його з посади, оскільки я не знаю, як обчислити його, якщо ви не знаєте, яка правильна складність.
ETHproductions

6

Haskell , 71 байт

f[x,y]=x:'_':y:'^':y:[]
f(x:y@(_:_))=x:"_{"++f y++"}^{"++f y++"}"
f x=x

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

Якби нам просто довелося виводити дійсний код, для 44 байт працювало б наступне:

f[a]=[a]
f(a:b)=a:"_{"++f b++"}^{"++f b++"}"

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


2
-5 байт, виходячи з 44-байтної версії: Спробуйте в Інтернеті!
jferard

@jferard Nice! Я додам це до посади.
Пшеничний майстер




5

SOGL V0.12 , 21 байт

±K;{╔+;lH?"{ŗ}”}1 ^Ο+

Спробуйте тут!

Пояснення:

±                      reverse the string
 K                     take off the first letter - will slowly convert to the output
  ;                    get the rest of the string ontop
   {                   iterate over the rest of the characters
    ╔+                   append "_" to it
      ;                  get the output string ontop
       lH?     }         if it's length - 1 [isn't 0]
          "{ŗ}”            push the string "{ŗ}" where ŗ is replaced by the output string
                1 ^Ο     wrap "^" around with the output string
                    +    prepend to it the current character + "_"

5

Perl 5 , 54 + 1 (-p) = 55 байт

s/\{(.)\}/$1/g while s/([a-z])([a-z]+)/$1_{$2}^{$2}/ig

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

Як?

Заміна в той час, коли умова порушує виникнення декількох літер у першій букві, а потім решта в дужках, як це:

abc -> a_{bc}^{bc}

Цикл while виконує заміну, поки не залишиться більше багатолітерних послідовностей. Заміна всередині циклу знімає дужки навколо окремих літер.


Приємно, мені було цікаво, скільки часу знадобиться, щоб відповідь на регулярний вираз
з’явилася

4

Рубі , 76 73 72 68 67 57 байт

Використання лямбда заощадження 4 байти завдяки Tutleman

f=->s{(r=s[1..-1])[0]?s[0]+?_+[r[1]??{+f[r]+?}:r]*2*?^:s}

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

Безголівки:

def f(s)
  r = s[1..-1]
  if r.size > 0
    if r.size > 1
      x = "{" + f(r) + "}"
    else
      x = r
    end
    return s[0] + "_" + [x, x].join("^")
  else
    return s
  end
end

Замість функції використовуйте анонімну лямбда (наприклад ->s{...}), яка зберігає 7 байт. Потім ви можете зберегти ще 2 байти, замінивши "#{s[0]}_на s[0]+"_. Ви можете зберегти ще один байт, виконавши вбудоване присвоєння '{}'змінній при першому використанні.
Тутлеман

@Tutleman Це рекурсивно ( t=f s[1..-1]), тому я не думаю, що анонімна функція буде працювати, і я вже переставив початок рядка, але можу використовувати вбудоване призначення.
Nnnes

1
D'oh! Упс - я не можу повірити, що пропустив це. У будь-якому разі, використання лямбда (з назвою) лямбда все-таки коротше: f=->s{...}економить 4 байти, навіть обліковуючи додаткові []необхідні для здійснення рекурсивного дзвінка.
Тутлеман

@Tutleman О так, змінив це. Тепер, якщо я можу придумати щось краще, ніж цей .trбезлад ...
Nnnes



1

PHP, 121 байт

function b($s){return $s[0].($s[1]?'_'.($s[2]?'{'.($b=b(substr($s,1))).'}^{'.$b.'}':"$s[1]^$s[1]"):'');}echo b($argv[1]);

Сама функція становить 104 байти та показує повідомлення про PHP.


1

Сітківка , 43 байти

(.)(.)$
$1¶$2
+`(.)¶(.*)
¶{$1_$2^$2}
¶{|}$

Спробуйте в Інтернеті! Посилання включає тестові випадки. Пояснення:

(.)(.)$
$1¶$2

Отримайте кочення, відрізавши останній символ. (Але якщо це єдиний персонаж, вони залишають його в спокої.)

+`(.)¶(.*)
¶{$1_$2^$2}

Перемістіть символ ¶ назад покроково, кожен раз беручи попередній результат і роблячи його індексом та суперскриптом наступного символу.

¶{|}$

Видаліть тепер зайві ¶ та зовнішні {} s.



0

Javascript, 73 байти

s=>[...s].reduceRight((m,c)=>`${c}_{${m}}^{${m}}`).replace(/{(.)}/g,'$1')

Пояснення

s=>                                  // take the input string
    [...s]                           // split the string into an array
    .reduceRight(                    // reduce the array in reverse order
        (m,c)=>`${c}_{${m}}^{${m}}`  // storing the result of each iteration in the memo m
    )                                // and returning m at the end
    .replace(/{(.)}/g,'$1')          // replace redundant {}

Оскільки немає визначеного початкового значення m, reduceRightприймає останній елемент sяк початкове значення і починає ітерацію з індексу s.length-2.


s=>[...s].reduceRight((m,c)=>`{${c}_${m}^${m}}`).slice(1,-1)складає всього 60 байт.
Ніл

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