ติดตั้งแมโครเน้นเสียงของ LaTeX


11

บทนำ

ระบบเรียงพิมพ์ LaTeX ใช้มาโครในการกำหนดสำเนียง ยกตัวอย่างเช่นตัวอักษร E \hat{e}ผลิตโดย ในความท้าทายนี้งานของคุณคือการใช้เวอร์ชัน ASCII ของฟังก์ชั่นนี้

อินพุต

ข้อมูลที่คุณป้อนเป็นสตริงอักขระ ASCII ที่พิมพ์ออกมาไม่ว่าง มันจะไม่มีการขึ้นบรรทัดใหม่

เอาท์พุต

เอาต์พุตของคุณคือสตริงที่ประกอบด้วยสองบรรทัด บรรทัดแรกมีสำเนียงและบรรทัดที่สองเป็นอักขระที่อยู่ มันได้รับจากการป้อนข้อมูลดังต่อไปนี้ ( 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{}หากคุณได้รับโบนัส) อาร์กิวเมนต์มาโครทั้งหมดมีความยาวหนึ่งตัวอักษรดังนั้น\dot{foo}และ\dot{}จะไม่เกิดขึ้นในอินพุต เอาต์พุตสามารถเป็นสตริงที่คั่นด้วยบรรทัดใหม่หรือรายการ / คู่ของสองสตริง อนุญาตจำนวนช่องว่างและช่องว่างก่อนหน้าใดก็ได้ตราบใดที่เสียงอยู่ในตำแหน่งที่ถูกต้อง โดยเฉพาะอย่างยิ่งหากไม่มีการเน้นเสียงเอาท์พุทสามารถเป็นสายเดียว

คุณสามารถเขียนโปรแกรมเต็มรูปแบบหรือฟังก์ชั่น จำนวนไบต์ต่ำสุด (หลังจากโบนัส) ชนะและช่องโหว่มาตรฐานไม่ได้รับอนุญาต

กรณีทดสอบ

ไม่มีโบนัส:

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
เราสามารถสันนิษฐานได้ว่ารายการมาร์กอัปแต่ละรายการมีเพียงอักขระเดียว หรือกล่าวอีกนัยหนึ่งว่า\bar{foo}อินพุตที่ถูกต้องคืออะไร
ปีเตอร์เทย์เลอร์

@PeterTaylor ใช่อาร์กิวเมนต์แมโครทุกตัวมีความยาวหนึ่งอักขระ ฉันจะอธิบายอย่างนั้น
Zgarb

คำตอบ:


4

Pyth, 51 46 45 43 41 40 ไบต์

ฉันลบเครื่องหมายปีกกาแล้วแยกออก\มาเหมือนกับคำตอบ CJam ของ Reto Koradi รหัสbar, dotและhatได้รับการยอมรับโดยเพียงแค่หลักทศนิยมสุดท้ายของรหัสอักขระของตัวอักษรตัวแรก, โมดูโล 3. ฉันเพียงแค่เพิ่ม(RIP)ไปยังส่วนแรกและลบมันในที่สุดเพื่อบันทึกรหัสสำหรับการจัดการส่วนแรกเป็นพิเศษ .barf """"

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

ลองออนไลน์ ชุดทดสอบ


1
" จากนั้นฉันเพิ่งเพิ่มbarf... " +1
Addison Crump

3

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

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อที่ยอมรับสตริงและส่งคืน tuple ของสตริงที่สอดคล้องกับบรรทัดด้านบนและด้านล่าง บรรทัดบนสุดจะมีช่องว่างต่อท้าย ในการเรียกใช้ฟังก์ชันให้ตั้งชื่อเช่น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 ไบต์

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`

วิธีการทำงาน: ไปที่อักขระสตริงอินพุตตามตัวอักษรและสร้างรายการคู่ของอักขระทางซ้ายสำหรับสตริงเอาต์พุตด้านบนขวาสำหรับสตริงเอาต์พุตล่าง หาก\พบ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>แล้วพิมพ์จำนวนไบต์ใหม่เพื่อที่เราจะได้เห็นขั้นตอนที่กระชับ
Addison Crump
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.