Раздвоенный текст


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>чтобы отписаться да, кто сказал, что я хочу отписаться или что-то? Это был тест, чтобы увидеть, правильно ли я прочитал весь пост?
Эрик 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 = lambda s: s и s [0] + '_ {0} ^ {0}'. Format (s [2:] и ' {'+ f (s [1:]) +'} 'или s [1:] и s [1])
Коннер Джонстон

1
@ConnerJohnston спасибо! Вы можете поместить ссылки tio с [text](link), но это действительно портит;)
Уриэль

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

7

Mathematica, 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, которая иногда ловит меня. Теперь исправлено за счет одного байта, благодаря чему код стал намного умнее, чем раньше.
Питер Тейлор,

Работает отлично сейчас. Отличное объяснение.
Trichoplax

@PeterTaylor (по крайней мере, в онлайн-демонстрации) Он не работает для слов с более чем четырьмя буквами.
десерт

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

7

JavaScript (ES6), 57 55 байт

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

Len (len (s)) сложность! Согласно @PeterTaylor, это на самом деле Θ (2 ^ len (s)), что по-прежнему является лучшим из возможных ...


Не работает для пустой строки (первый тестовый пример).
трихоплакс

@trichoplax Должен быть исправлен сейчас.
ETHproductions

Работает отлично сейчас.
трихоплакс

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

@PeterTaylor Я подумал, что, поскольку алгоритм выполняет только шаги len (ввода), то сложность равна 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 Отлично! Я добавлю это в пост.
Пшеничный волшебник




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

Попробуйте онлайн!

Как?

Подстановка в условии while прерывает вхождения нескольких букв в первой букве, а затем остальные в скобках, например:

abc -> a_{bc}^{bc}

Цикл while выполняет подстановку до тех пор, пока не останется больше последовательностей из нескольких букв. Подстановка внутри цикла удаляет фигурные скобки вокруг отдельных букв.


Хорошо, мне было интересно, сколько времени понадобится для ответа на регулярное выражение
Nnnes

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}

Попробуйте онлайн!

Ungolfed:

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]), поэтому я не думаю, что анонимная функция будет работать, и я уже переставил начало строки, но я могу использовать встроенное присваивание.
17

1
D'о! К сожалению, я не могу поверить, что я пропустил это. В любом случае, использовать (именованную) лямбду по-прежнему короче: 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}

Перемещайте символ back назад на один шаг за раз, каждый раз беря предыдущий результат и делая его нижним и верхним индексом следующего символа.

¶{|}$

Удалите теперь лишние ¶ и внешние {} 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.