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


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.