Codegolf — Реализация Макросов Акцентов Latex

  • Автор темы Emfmvcrvox
  • Обновлено
  • 22, Oct 2024
  • #1

Введение

Система набора текста LaTeX использует макросы для определения акцентов.

 
 
 
 Input:
Ma\tilde{n}ana
Output:

~
Manana
Input:
\dot{L}Vz\dot{[}|M.\bar{#}0\hat{u}U^y!"\tilde{I} K.\bar{"}\hat{m}dT\tilde{$}F\bar{;}59$,/5\bar{'}K\tilde{v}R \tilde{E}X`
Output:
.  .   _ ^     ~   _^  ~ _      _ ~  ~
LVz[|M.#0uU^y!"I K."mdT$F;59$,/5'KvR EX`
 
. In this challenge, your task is to implement an ASCII version of this functionality.

Например, буква ê образуется

Вход

Ваши входные данные представляют собой непустую строку печатных символов ASCII.

Он не будет содержать новых строк. Input: No accents. Output: No accents. Input: Ch\hat{a}teau Output: ^ Chateau Input: Som\bar{e} \dot{a}cc\hat{e}nts. Output: _ . ^ Some accents. Input: dot hat\dot{h}a\hat{t}\hat{ }x\bar{x}dot Output: . ^^ _ dot hathat xxdot Input: \hat{g}Hmi\hat{|}Su5Y(\dot{G}"\bar{$}id4\hat{j}gB\dot{n}#6AX'c\dot{[}\hat{)} 6\hat{[}T~_sR\hat{&}CEB Output: ^ ^ . _ ^ . .^ ^ ^ gHmi|Su5Y(G"$id4jgBn#6AX'c[) 6[T~_sR&CEB denotes an arbitrary character):

  • Выход \dot{} is replaced by \dot{foo} Ваш вывод представляет собой строку, состоящую из двух строк. \tilde{} on top of it.
  • В первой строке указаны диакритические знаки, а во второй — символы, которым они принадлежат. \hat{} is replaced by \dot{} Он получается из входных данных следующим образом ( \bar{} on top of it.
  • Каждый \{} is replaced by ^ Je suis pret. с Je suis pr\hat{e}t. on top of it.
  • Каждый с ~ is replaced by A Каждый \tilde{A} on top of it.
  • с

Для получения бонуса -10%:

^

каждый

A

с

Над всеми остальными символами есть пробел. \hat{A} only occur in the macros . , A результаты на выходе \dot{A} Например, ввод _ if you go for the bonus). All macro arguments are exact one character long, so A and \bar{A} will not occur in the input. The output can be a newline-separated string, or a list/pair of two strings. Any amount of trailing and preceding whitespace is allowed, as long as the accents are in the correct places. In particular, if there are no accents, the output can be a single string.

Правила и подсчет очков

Можно предположить, что персонажи

A

и

\hat{e}

Вы можете написать полную программу или функцию.

Emfmvcrvox


Рег
13 Mar, 2011

Тем
63

Постов
203

Баллов
538
  • 26, Oct 2024
  • #2

Пиф, 51 46 45 43 41 40 байт

Я снимаю фигурные скобки и разделяю на

 
 
 
 
 
 
 
 l=list(input())
b=list(" "*len(l))
try:

while 1:s=l.index("\\");t=l[s+1];del l[s+6];del l[s:s+5];b[s] = "b"==t and "_" or "d"==t and "." or "h"==t and "^" or "*";
except:print("".join(b)+"\n"+"".join(l));
 
, just like Reto Koradi's CJam answer does. The codes \ , *Main> putStr $ f "\\dot{L}Vz\\dot{[}|M.\\bar{#}0\\hat{u}U^y!\"\\tilde{I} K.\\bar{\"}\\hat{m}dT\\tilde{$}F\\bar{;}59$,/5\\bar{'}K\\tilde{v}R \\tilde{E}X`" . . _ ^ ~ _^ ~ _ _ ~ ~ LVz[|M.#0uU^y!"I K."mdT$F;59$,/5'KvR EX` and g('\\':a:r)=(q,l):g s where q|a=='b'='_'|a=='d'='.'|a=='h'='^'|a=='t'='~';(_,_:l:_:s)=span(<'{')r g(a:b)=(' ',a):g b g""=[('\n','\n')] f=uncurry(++).unzip.g распознаются просто по последней десятичной цифре кода первого символа по модулю 3. Я просто добавляю S Leading space, to avoid special case for accent at start. l+ Get input, and append it to leading space. '\/ Split at '\. ( Split off first sub-string, which does not start with an accent. _, Get length of first sub-string. S* String of spaces with the same length. \ Swap the two. First parts of both output lines are now on stack. @ Rotate list of remaining sub-strings to top. { Loop over sub-strings. ( Pop first character. This is 'b, 'd, or 'h, and determines accent. i Convert to integer. 2/ Divide by two. 49- Subtract 49. This will result in 0, 1, or 4 for the different accents. "_. ^" Lookup string for the accents. = Get the correct accent. \ Swap string to top. 3> Remove the first 3 characters, which is the rest of the accent string and the '{. '}- Remove the '}. All the macro stuff is removed now. _,( Get the length, and subtract 1. This is the number of spaces for the first line. S* Produce the spaces needed for the first line. @\+ Bring accent and spaces to top, and concatenate them. @@+ Get previous second line and new sub-string without formatting to top, and concatenate them. @@+ Get previous first line and new accent and spacing to top, and concatenate them. \ Swap the two lines to get them back in first/second order. }/ End loop over sub-strings. N\ Put newline between first and second line. (РВАТЬ) Sl+'\/(_,S*\@{(i2/49-"_. ^"=\3>'}-_,(S*@\+@@+@@+\}/N\ to the first part and remove it in the end to save the code for handling the first part specially.

function f(x::AbstractString) # Store a regular expression that will match the LaTeX macro call # with capture groups for the first letter of the control sequence # and the character being accented r = r"\\(\w)\w+{(\w)}" # Create a vector of spaces by splatting a string constructed with # repetition # Note that if there is anything to replace, this will be longer # than needed, resulting in trailing whitespace t = [" "^endof(x)...] while ismatch(r, x) # Store the RegexMatch object m = match(r, x) # Extract the captures a, b = m.captures # Extract the offset of the first capture o = m.captures[1] # Replace the corresponding element of t with the accent t[o-1] = a == "b" ? '_' : a == "d" ? '.' : a == "h" ? '^' : '~' # Replace this match in the original string x = replace(x, r, b, 1) end # Return the top and bottom lines as a tuple return (join(t), x) end

Попробуйте онлайн. Тестовый набор.

 

MONDO_MOONDINIO


Рег
04 Nov, 2004

Тем
72

Постов
230

Баллов
620
  • 26, Oct 2024
  • #3

Юлия, 204 184 байт * 0,9 = 165,6

f=x->...

Это анонимная функция, которая принимает строку и возвращает кортеж строк, соответствующих верхней и нижней строкам. Верхняя строка будет иметь конечный пробел. Чтобы вызвать функцию, дайте ей имя, например. x->(r=r"\\(\w)\w+{(\w)}";t=[" "^endof(x)...];while ismatch(r,x) m=match(r,x);(a,b)=m.captures;t[m.offsets[1]-1]=a=="b"?'_':a=="d"?'.':a=="h"?'^':'~';x=replace(x,r,b,1)end;(join(t),x))

Негольфед:

jtMsMCm,+@".^_"eChd*\ -ld4>d3c-+*4Nz`H\\ ||answer||

CJam, 53 байта

""""

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

Объяснение:

barf ||answer||

Хаскель, 156*0,9=140,4 байт

hat

Пример использования:

dot

Как это работает: посимвольно пройти входную строку и построить список пар символов: левый для верхней выходной строки, правый для нижней выходной строки. Если bar is found, take the appropriate accent, else a space for the left element. Finally transform the list of pairs into a single string.

 

PatrikStar


Рег
13 Sep, 2009

Тем
74

Постов
196

Баллов
586
  • 26, Oct 2024
  • #4

Питон 3, 203 байта

Без бонуса:

\

Я очень надеюсь, что будет более короткая версия.

 

GuFFs


Рег
28 Apr, 2006

Тем
74

Постов
193

Баллов
573
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно