Terapkan makro aksen LaTeX


11

pengantar

Sistem penyusunan huruf LaTeX menggunakan makro untuk mendefinisikan aksen. Misalnya, huruf ê diproduksi oleh \hat{e}. Dalam tantangan ini, tugas Anda adalah mengimplementasikan versi ASCII dari fungsi ini.

Memasukkan

Input Anda adalah string karakter ASCII yang tidak kosong yang dapat dicetak. Itu tidak akan mengandung baris baru.

Keluaran

Output Anda adalah string yang terdiri dari dua baris. Baris pertama berisi aksen, dan baris kedua karakter mereka. Itu diperoleh dari input sebagai berikut ( Amenunjukkan karakter sewenang-wenang):

  • Setiap \bar{A}digantikan oleh Adengan _di atasnya.
  • Setiap \dot{A}digantikan oleh Adengan .di atasnya.
  • Setiap \hat{A}digantikan oleh Adengan ^di atasnya.
  • Untuk bonus -10%: setiap \tilde{A}diganti dengan Adengan ~di atasnya.
  • Semua karakter lain memiliki spasi di atasnya.

Misalnya input

Je suis pr\hat{e}t.

menghasilkan output

          ^
Je suis pret.

Aturan dan penilaian

Anda dapat mengasumsikan bahwa karakter \{}hanya terjadi di makro \bar{}, \dot{}dan \hat{}(dan \tilde{}jika Anda pergi untuk bonus). Semua argumen makro panjangnya tepat satu karakter, jadi \dot{foo}dan \dot{}tidak akan muncul dalam input. Outputnya bisa berupa string yang dipisahkan oleh baris baru, atau daftar / pasangan dari dua string. Berapapun spasi spasi awal dan sebelumnya diizinkan, asalkan aksennya ada di tempat yang benar. Secara khusus, jika tidak ada aksen, output dapat berupa string tunggal.

Anda dapat menulis program atau fungsi lengkap. Hitungan byte terendah (setelah bonus) menang, dan celah standar tidak diizinkan.

Uji kasus

Tanpa bonus:

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

Dengan bonus:

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`

Saya mulai membuat prototipe ini di Go, tetapi kemudian saya menyadari betapa Python akan lebih sederhana ...
cat

1
Bisakah kita berasumsi bahwa setiap entri markup hanya berisi satu karakter? Atau, dengan kata lain, apakah \bar{foo}input yang valid?
Peter Taylor

@PeterTaylor Ya, setiap argumen makro tepat satu karakter. Saya akan mengklarifikasi itu.
Zgarb

Jawaban:


4

Pyth, 51 46 45 43 41 40 byte

Saya menghapus kurung kurawal dan membelah \, seperti jawaban CJam dari Reto Koradi. Kode bar, dotdan hatdikenali hanya dengan angka desimal terakhir dari kode karakter karakter pertama, modulo 3. Saya hanya menambahkan (RIP) ke bagian pertama dan menghapusnya pada akhirnya untuk menyimpan kode untuk menangani bagian pertama khusus .barf """"

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

Cobalah online. Suite uji.


1
" Kalau begitu aku tambahkan saja 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))

Ini adalah fungsi anonim yang menerima string dan mengembalikan tupel string yang sesuai dengan garis atas dan bawah. Baris teratas akan memiliki spasi spasi tambahan. Untuk memanggil fungsi, berikan nama, misf=x->...

Tidak Disatukan:

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 byte

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

Cobalah online

Penjelasan:

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 byte

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

Contoh penggunaan:

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

Bagaimana cara kerjanya: pergi melalui karakter string input oleh karakter dan membangun daftar pasangan karakter, kiri untuk string output atas, kanan untuk string output lebih rendah. Jika a \ditemukan, ambil aksen yang sesuai, atau ruang untuk elemen kiri. Akhirnya mengubah daftar pasangan menjadi satu string.


0

Python 3, 203 byte

Tanpa bonus:

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

Saya sangat berharap ada versi yang lebih pendek.


1
Itu selalu menyenangkan untuk melihat perkembangan jumlah byte. c: Saya sarankan membiarkan byte lama dihitung, lalu mengelilinginya <s></s>, lalu mengetikkan byte baru sehingga kita bisa melihat langkah-langkah menuju penyelesaian.
Addison Crump
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.