LaTeXアクセントマクロを実装する


11

前書き

LaTeX組版システムは、マクロを使用してアクセントを定義します。たとえば、文字êはによって生成され\hat{e}ます。この課題では、タスクはこの機能のASCIIバージョンを実装することです。

入力

入力は、印刷可能なASCII文字の空でない文字列です。改行は含まれません。

出力

出力は、2行で構成される文字列です。最初の行にはアクセントが含まれ、2行目には文字が含まれています。次のように入力から取得されます(A任意の文字を示します)。

  • すべてが\bar{A}置き換えられているA_、その上に。
  • すべてが\dot{A}置き換えられているA.、その上に。
  • すべてが\hat{A}置き換えられているA^、その上に。
  • -10%のボーナスのために:すべてのが\tilde{A}置き換えられますA~、その上に。
  • 他のすべてのキャラクターの上にはスペースがあります。

たとえば、入力

Je suis pr\hat{e}t.

結果が出力されます

          ^
Je suis pret.

ルールとスコアリング

あなたは、文字\{}がマクロ\bar{}でのみ発生すると仮定することができ、\dot{}そして\hat{}(そして\tilde{}あなたがボーナスに行く場合)。すべてのマクロの引数は1つの文字長いので、正確です\dot{foo}し、\dot{}入力には発生しません。出力は、改行で区切られた文字列、または2つの文字列のリスト/ペアです。アクセントが正しい場所にある限り、任意の量の後続および先行空白を使用できます。特に、アクセントがない場合、出力は単一の文字列になります。

完全なプログラムまたは関数を作成できます。最小のバイト数(ボーナス後)が勝ち、標準の抜け穴は許可されません。

テストケース

ボーナスなし:

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

ボーナスあり:

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`

Goでこれのプロトタイプを作成し始めましたが、その後Pythonがどれほどシンプルになるかを実感し
cat

1
各マークアップエントリに含まれる文字は1つだけだと想定できますか?または、言い換えると\bar{foo}、有効な入力ですか?
ピーターテイラー

@PeterTaylorはい、すべてのマクロ引数は正確に1文字の長さです。それを明確にします。
ズガーブ

回答:


4

Pyth、51 46 45 43 41 40バイト

\Reto KoradiのCJamの答えと同じように、中括弧を削除してで分割します。コードbardotおよびhat、単に最初の文字の文字コードの最後の小数点以下の桁によって認識されているが、私はちょうど追加3を法(RIP)の最初の部分に、特別最初の部分を処理するためのコードを保存するために最終的にそれを削除します。barf """"

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

オンラインでお試しください。 テストスイート。


1
その後、追加するだけbarfです...」+1
アディソンクランプ

3

ジュリア、204 184バイト* 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))

これは、文字列を受け入れ、上部と下部の行に対応する文字列のタプルを返す匿名関数です。一番上の行には末尾に空白があります。関数を呼び出すには、たとえば、名前を付けますf=x->...

ゴルフをしていない:

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バイト

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

オンラインで試す

説明:

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バイト

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

使用例:

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

仕組み:入力文字列を1文字ずつ調べ、文字のペアのリストを作成します。左は上部の出力文字列、右は下部の出力文字列です。a \が見つかった場合は、適切なアクセントを使用します。それ以外の場合は、左要素のスペースを使用します。最後に、ペアのリストを単一の文字列に変換します。


0

Python 3、203バイト

ボーナスなし:

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

もっと短いバージョンがあればいいのですが。


1
バイトカウントの進行を確認できるのは常に素晴らしいことです。c:古いバイトカウントをそのままにして<s></s>、で囲むことをお勧めします。次に、新しいバイトカウントを入力して、簡潔さのステップを確認します。
アディソンクランプ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.