LaTeX ของคนจน


37

คุณถูกขนส่งในเอกภพคู่ขนานโดยที่ผู้คนเขียนสมการทางคณิตศาสตร์บนคอมพิวเตอร์เป็นศิลปะ ASCII ด้วยมือ ในฐานะที่เป็นผู้เสพติด LaTeX สิ่งนี้ไม่เป็นที่ยอมรับอย่างสมบูรณ์และคุณควรทำให้กระบวนการนี้เป็นไปโดยอัตโนมัติ

เป้าหมายของคุณคือการเขียนโปรแกรมที่ให้ผลลัพธ์เป็นรูปแบบ ASCII ของสมการที่ป้อนเป็นคำสั่ง LaTeX math

คำสั่ง LaTeX ที่จำเป็นเพื่อรองรับ

  • ผลรวม: คำสั่ง LaTeX สำหรับผลรวมคือ \sum_{lower bound}^{upper bound}

    ตัวเลข ASCII ที่คุณต้องใช้สำหรับผลรวมคือ:

    upper bound
        ___ 
        \  `
        /__,
    lower bound
    
  • ผลิตภัณฑ์: คำสั่ง LaTeX สำหรับผลิตภัณฑ์คือ \prod_{lower bound}^{upper bound}

    รูป ASCII ที่คุณต้องใช้สำหรับผลิตภัณฑ์คือ:

    upper bound
        ____
        |  |
        |  |
    lower bound
    
  • เศษส่วน: คำสั่ง LaTeX สำหรับเศษส่วนคือ \frac{numerator}{denominator}

    ตัวเลข ASCII ที่คุณต้องใช้สำหรับเศษส่วนคือ:

     numerator
    -----------
    denominator
    

สิ่งใดก็ตามที่ไม่ได้เป็นหนึ่งในสามคำสั่งนั้นจะปรากฏตามที่เป็น ตัวอย่างเช่น\sum{i=3}^{e^10}\frac{3x+5}{2}ควรแสดงเป็น

e^10
___  3x+5
\  ` ----
/__,  2
i=3

ปัจจัยการผลิต

อินพุตเป็นคำสั่ง LaTeX ที่ส่งผ่านเป็นสตริง (หรือเทียบเท่ากับสตริงภาษาของคุณ) คำสั่ง LaTeX สามารถซ้อนกันได้ตัวอย่างเช่น\frac{\frac{1}{2}}{3}อินพุตที่ถูกต้อง อินพุตควรถูกต้องเสมอ (ไม่จำเป็นต้องตรวจสอบไวยากรณ์ของ LaTeX ในรหัสของคุณ) อินพุตจะประกอบด้วยคำสั่ง LaTeX สามคำที่แสดงไว้ด้านบนและ 'ข้อความ' ที่คุณไม่จำเป็นต้องจัดรูปแบบ

คำสั่ง LaTeX จะมาพร้อมกับไวยากรณ์ที่แสดงไว้ด้านบนเสมอเช่นผลรวมและผลิตภัณฑ์จะมีขอบเขตบนและล่างเสมอ (แม้ว่าจะว่างเปล่า) และจะมีเศษและส่วนสำหรับเศษส่วนเสมอ

เราคิดว่าขอบเขตของผลรวมและผลิตภัณฑ์มีความยาวไม่เกิน 4 อักขระ (= ความกว้างของผลรวมและสัญลักษณ์ผลิตภัณฑ์) ดังนั้นคุณไม่ต้องกังวลเกี่ยวกับปัญหาการทับซ้อนที่อาจเกิดขึ้น สำหรับเหตุผลที่คล้ายคลึงกันเราถือว่าขอบเขตเป็นเพียง 'text' และจะไม่เป็นคำสั่ง LaTeX เช่น\sum_{\sum_{1}^{2}}^{1}ไม่ใช่อินพุตที่ถูกต้อง

เอาท์พุท

เอาต์พุตของโปรแกรมของคุณคือการแทน ASCII ของคำสั่ง LaTeX ที่คุณได้รับเป็นอินพุต

โปรแกรมของคุณจะต้องคำนึงถึงการจัดตำแหน่งในแนวนอน: ตัวอย่างเช่นขอบเขตของผลรวมหรือผลิตภัณฑ์จะต้องจัดแนวนอนด้วยผลรวมหรือสัญลักษณ์ผลิตภัณฑ์ (ซึ่งมีความกว้างทั้ง 4 ตัวอักษร) หากขอบเขตมีจำนวนอักขระคี่มันไม่สำคัญว่าจะเป็นอักขระหนึ่งตัวทางด้านขวาหรือด้านซ้ายของจุดกึ่งกลางแล้วแต่จำนวนใดจะดี เส้นของเศษส่วนจะต้องมีความยาวเท่ากับตัวเศษหรือส่วนใดก็ตามที่ยาวที่สุด

โปรแกรมของคุณจะต้องคำนึงถึงการจัดตำแหน่งในแนวตั้งเช่น\frac{\frac{1}{2}}{3} = \frac{1}{6}ควรแสดงเป็น

1
-
2   1
- = -
3   6

สำหรับผลรวมและผลิตภัณฑ์เนื่องจากสัญลักษณ์มีความสูง 4 ตัวอักษรศูนย์แนวตั้งจะถือว่าเป็นบรรทัดที่สองจากด้านบน

ระยะห่างแนวนอนจะถือว่าถูกต้องในอินพุตที่กำหนดเช่นช่องว่างในอินพุตควรแสดงในเอาต์พุต

กรณีทดสอบ

  • อินพุต abc = 2

    เอาท์พุต abc = 2

  • อินพุต e = \sum_{n=0}^{+inf} \frac{1}{n!}

    เอาท์พุต

        +inf
        ___  1
    e = \  ` --
        /__, n!
        n=0
    
  • อินพุต e^x = 1 + \frac{x}{1 - \frac{x}{2 + x - ...}}

    เอาท์พุต

                     x
    e^x = 1 + ---------------
                       x
              1 - -----------
                  2 + x - ...
    
  • อินพุต \prod_{i=1}^{n} \frac{\sum_{j=0}^{m} 2j}{i + 1}

    เอาท์พุต

           m
          ___
          \  ` 2j
     n    /__,
    ____  j=0
    |  |  -------
    |  |   i + 1
    i=1
    
  • อินพุต \frac{sum}{prod} = \sum_{frac}^{prod} sum

    เอาท์พุต

           prod
    sum    ___
    ---- = \  ` sum
    prod   /__,
           frac
    

เกณฑ์การให้คะแนน

นี่คือดังนั้นรหัสที่สั้นที่สุดชนะ


11
ความท้าทายแรกที่ดี มันดูค่อนข้างยาก ฉันตื่นเต้นที่จะเห็นวิธีแก้ปัญหาบางอย่าง
Alex A.

1
@Alex A. ฉันตั้งใจจะมีอินทิกรัลรากที่สองและวงเล็บที่ขยายได้ แต่ดูเหมือนจะมากเกินไป ...
Fatalize

2
ฉันเชื่อว่าจะมีหลายกรณีที่คุณทับซ้อนกัน ตัวอย่างเช่นหากคุณมีผลรวมที่คำนั้นสูงกว่า 4 (เช่นเศษส่วนหลาย ๆ เศษส่วนของผลรวม) และผลรวมมีขอบเขตบน / ล่างยาวสตริงผูกบน / ล่างอาจทับซ้อนกับคำนั้น จะแก้ไขได้อย่างไร? ต้องเว้นระยะจากผลรวมเพื่อหลีกเลี่ยงการทับซ้อนกับขอบเขต?
Reto Koradi


8
ฉันหวังว่าจะมีบางคนคิดวิธีแก้ปัญหาใน LaTeX
shadowtalker

คำตอบ:


23

Python 2 656 627 618 ไบต์

M=max
O=lambda l,o=2:[(p+o,c)for p,c in l]
def C(s,m=0):
 if''<s<'}'[m:]:f,w,h,d,s=C(s,1);F,W,H,D,s=C(s);e=M(d,D);return[O(f,e-d)+O(F,w*1j+e-D),w+W,M(h-d,H-D)+e,e,s]
 if'\\'!=s[:1]:return[[(0,s[:1])]*m,m,m,0,s[1:]]
 t=s[1]<'s';e=s[1]>'f';f,w,h,d,s=C(s[5+t+e:]);F,W,H,D,s=C(s[1+e:]);g=M(w,W);G=C('-'*g)[0]
 if e:f,w,h,F,W,H=F,W,H,f,w,h;g=4;p=C('|  |')[0];G=C('_'*(3+t))[0]+[O(C('/__,')[0])+[(1,'\\'),(1+3j,'`')],O(p,1)+O(p)][t]
 x=M(w,W,g);return[O(f,(x-w)/2*1j)+O(F,(x-W)/2*1j+h+3**e)+O(G,(x-g)/2*1j+h),x,h+3**e+H,h+e,s]
f,w,h,d,s=C(raw_input())
for y in range(h):print"".join(dict(f).get(y+x*1j,' ')for x in range(w))

รับอินพุตบน STDIN และเขียนเอาต์พุตไปยัง STDOUT

โปรแกรมอนุมานว่าไม่มีลำดับควบคุมอื่น ๆ กว่า\frac, \sumหรือ\prodปรากฏในการป้อนข้อมูล (เช่นนั้นจะไม่แสดงเป็นข้อความปกติ) และที่~ไม่ปรากฏเช่นกัน (มันมีความหมายพิเศษในโหมดคณิตศาสตร์ต่อไป.) ในการ มืออื่น ๆ โปรแกรมไม่สูตรการสนับสนุนโดยพลการเป็นข้อ จำกัด สำหรับและ\sum\prod

คำอธิบาย

มันทำงานได้เหมือน TeX! (ดีเรียงลำดับของ ... ) แต่ละฟอร์มย่อย (เริ่มต้นจากตัวอักษรเดียวและสร้างสูตรที่ซับซ้อนมากขึ้น) จะกลายเป็นกล่องที่มีความกว้างความสูงและความลึกที่เกี่ยวข้อง (พื้นฐาน) กล่องของสูตรที่ง่ายกว่าจะรวมกันเป็นกล่องใหญ่เพื่อสร้างสูตรที่ซับซ้อนเป็นต้น เนื้อหาของแต่ละกล่องจะแสดงเป็นรายการคู่ / ตำแหน่งที่สัมพันธ์กับมุมซ้ายบนของกล่อง เมื่อรวมกล่องเข้ากับกล่องที่ใหญ่กว่าตำแหน่งจะถูกชดเชยตามตำแหน่งสัมพัทธ์ของกล่องที่เล็กกว่าภายในกล่องที่ใหญ่กว่าและรายการจะถูกต่อกัน

ในที่สุดเราก็จบลงด้วยกล่องระดับบนสุดซึ่งถูกแปลงเป็นรูปแบบที่พิมพ์ได้


หากต้องการเครื่องเทศเพิ่มขึ้นเล็กน้อยรุ่นต่อไปนี้ยังรองรับรากที่สอง:

ตัวอย่าง:

  • \frac{-b +- \sqrt{b^2 - 4ac}}{2a}

            _________
    -b +- \/b^2 - 4ac
    -----------------
           2a
    
  • |v| = \sqrt{ \sum_{i}^{} v[i]^2 }

               _____________
              / ___
    |v| =    /  \  ` v[i]^2
            /   /__,
          \/     i
    

9
ฉันต้องบอกว่าฉันประทับใจอย่างมาก! พยายามรัน\prod_{i=1}^{\sum_{azededzeda}^{k}} \frac{\sum_{j=0}^{m} 2j}{i + 1}และส่งเอาต์พุตทุกอย่างถูกต้องโดยไม่ทับซ้อนแม้ว่าจะไม่จำเป็นก็ตาม ดี!
ลดขนาด

4
และคุณสนับสนุนสแควร์รูทด้วยจำนวนไบต์ที่มากกว่า ~ 18% มีคนหยุดชายคนนี้!
ลดขนาด

1
@Ell นั่นสมเหตุสมผล! การทำงานที่ดี :)
Kade

22

LaTeX, 540 532 ตัวอักษร

คำเตือน: นี่ไม่สมบูรณ์และเนื้อหาจะไม่นับเป็นคำตอบที่ถูกต้อง

\ usepackage [LGRgreek] {} mathastext
\ Rencommand {\ sum} {\ kern-1ex \ displaystyle \ mathop {\ vphantom {\ int} \ start {array} {l} \ mbox {\ underline {\ hspace {12pt}}} \\ \ mbox {\ textbackslash } \ hspace {} 8 พอยต์ `\\\ mbox {/ \ ขีดเส้นใต้ {\ hspace {8 พอยต์}}} \ end {อาร์เรย์}} \ displaylimits}
\ Rencommand {\ prod} {\ kern-1ex \ displaystyle \ mathop {\ vphantom {\ int} \ start {array} {c} \ mbox {\ ขีดเส้นใต้ {\ hspace {16pt}}} \\ | \ \ \ \ | \\ | \ \ \ \ | \ end {array}} \ displaylimits}
\ renewcommand {\ frac} [2] {\ mathop {\ xleaders \ hbox {-} \ hfill \ kern0pt} \ ขีด จำกัด ^ {1} # _ {# 2}}
\ DeclareMathSizes {10} {10} {10} {10}

ความช่วยเหลือจาก @Falize ดูความคิดเห็นเพื่อดูรายละเอียด

ทดสอบ:

การป้อนข้อมูล: \prod_{i=1}^{n} \frac{\sum_{j=0}^{m} 2j}{i + 1}

เอาท์พุท:

ป้อนคำอธิบายรูปภาพที่นี่

อย่างที่คุณเห็นเอาท์พุทไม่เป็นไปตามข้อกำหนด นี่อาจตัดสิทธิ์คำตอบของฉัน แต่ฉันก็ยังคิดว่ามันคุ้มค่าที่จะโพสต์

ฉันเขียนสิ่งนี้บน sharelatex.com คุณสามารถเล่นกับมันนี่


1
ดี! ฉันเล่นกับรหัสของคุณเล็กน้อยและฉันคิดว่าคุณสามารถแก้ไขทุกอย่างได้โดยเปลี่ยนเศษส่วนของคุณเป็น\newcommand{\frac}[2]{\mathop{\xleaders\hbox{-}\hfill\kern0pt}\limits^{#1}_{#2}}เพิ่ม\DeclareMathSizes{10}{10}{10}{10}หลังจากนั้น (เพื่อป้องกันไม่ให้ LaTeX ลดขนาดตัวเศษและส่วน) และเพิ่ม\kern-1exก่อนหน้านี้\displaystyleในผลรวมและคำจำกัดความของผลิตภัณฑ์ของคุณ
ทำให้เสียชีวิต
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.