LaTeX vurgu makrolarını uygulama


11

Giriş

LaTeX dizgi sistemi aksanları tanımlamak için makrolar kullanır. Örneğin, ê harfi tarafından üretilir \hat{e}. Bu zorlukta, göreviniz bu işlevin ASCII sürümünü uygulamaktır.

Giriş

Girişiniz, yazdırılamaz ASCII karakterlerinin boş olmayan bir dizesidir. Yeni satır içermez.

Çıktı

Çıktınız iki satırdan oluşan bir dizedir. İlk satır aksanları ve ikinci satır ait oldukları karakterleri içerir. AGirdiden aşağıdaki şekilde elde edilir ( rastgele bir karakteri gösterir):

  • Her \bar{A}değiştirilir Aile _bunun üstüne.
  • Her \dot{A}değiştirilir Aile .bunun üstüne.
  • Her \hat{A}değiştirilir Aile ^bunun üstüne.
  • % 10'luk bir bonus için: Her \tilde{A}değiştirilir Aile ~bunun üstüne.
  • Diğer tüm karakterlerin üzerinde boşluk vardır.

Örneğin, girdi

Je suis pr\hat{e}t.

sonuç çıktı

          ^
Je suis pret.

Kurallar ve puanlama

Sen karakterleri varsayabiliriz \{}sadece makrolar meydana \bar{}, \dot{}ve \hat{}(ve \tilde{}ödül için giderseniz). Tüm makro argümanlar bir karakter uzunluğunda, bu yüzden kesin olan \dot{foo}ve \dot{}girişteki gerçekleşmeyecek. Çıktı, satır satırıyla ayrılmış bir dize veya iki dizenin bir listesi / çifti olabilir. Aksanlar doğru yerlerde olduğu sürece, herhangi bir miktarda son ve önceki boşluklara izin verilir. Özellikle, aksan yoksa, çıktı tek bir dize olabilir.

Tam bir program veya işlev yazabilirsiniz. En düşük bayt sayısı (bonuslardan sonra) kazanır ve standart boşluklara izin verilmez.

Test senaryoları

Bonus olmadan:

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

Bonus ile:

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`

Bunu Go'da prototiplemeye başladım ama sonra Python'un ne kadar basit olacağını fark ettim ...
cat

1
Her biçimlendirme girdisinin yalnızca bir karakter içerdiğini varsayabilir miyiz? Veya başka bir deyişle, \bar{foo}geçerli bir girdi mi?
Peter Taylor

@PeterTaylor Evet, her makro bağımsız değişkeni tam olarak bir karakter uzunluğundadır. Bunu açıklığa kavuşturacağım.
Zgarb

Yanıtlar:


4

Pyth, 51 46 45 43 41 40 bayt

Kıvırcık parantezleri kaldırıyorum ve \Reto Koradi'nin CJam cevabının yaptığı gibi ayrıldım. Kodlar bar, dotve hatilk karakterin karakter kodunun son ondalık rakam ile basitçe tanınan, sadece eklemek 3. modulo (RIP)barf """" ilk parçaya ve sonunda ilk kısmı özel olarak ele almak için kodu kaydetmek için kaldırırım .

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

Çevrimiçi deneyin. Test odası.


1
" Öyleyse sadece ekliyorum barf... " +1
Addison Crump

3

Julia 204 184 byte * 0.9 = 165.6

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

Bu, bir dizeyi kabul eden ve üst ve alt çizgilere karşılık gelen bir dizi dizeyi döndüren anonim bir işlevdir. En üst satırın sonunda boşluk olur. İşlevi çağırmak için ona bir ad verin, örn.f=x->...

Ungolfed:

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

2

CJam, 53 bayt

Sl+'\/(_,S*\@{(i2/49-"_. ^"=\3>'}-_,(S*@\+@@+@@+\}/N\

Çevrimiçi deneyin

Açıklama:

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.

1

Haskell, 156 * 0.9 = 140.4 bayt

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

Kullanım örneği:

*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`

Nasıl çalışır: Giriş dizesi karakterine göre gidin ve üst çıkış dizesi için sol, alt çıkış dizesi için sağ olan karakter çiftlerinin bir listesini oluşturun. A \bulunursa, uygun aksanı, aksi takdirde sol öğe için bir boşluk kullanın. Son olarak çiftlerin listesini tek bir dizeye dönüştürün.


0

Python 3, 203 bayt

Bonus olmadan:

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));

Umarım daha kısa bir versiyon vardır.


1
Bayt sayısının ilerlemesini görmek her zaman güzeldir. c: Eski bayt sayımını bırakmayı, sonra onu çevrelemeyi <s></s>, sonra yeni bayt sayımını yazmayı öneririm , böylece kısaltmaya yönelik adımları görebiliriz.
Addison Crump
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.