गरीब आदमी का लाटेक्स


37

आपको एक समानांतर ब्रह्मांड में ले जाया जाता है जहां लोग कंप्यूटर पर गणितीय समीकरणों को ASCII कला के रूप में लिखते हैं। एक LaTeX व्यसनी के रूप में, यह पूरी तरह से अस्वीकार्य है, और आपको इस प्रक्रिया को कुछ हद तक स्वचालित करना चाहिए।

आपका लक्ष्य एक प्रोग्राम लिखना है जो कि एक LaTeX गणित कमांड के रूप में इनपुट समीकरण के ASCII संस्करण को आउटपुट करता है।

अनिवार्य LaTeX समर्थन करने का आदेश देता है

  • Sum: एक राशि के लिए 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 कमांड को नेस्ट किया जा सकता है, उदाहरण के \frac{\frac{1}{2}}{3}लिए एक वैध इनपुट है। इनपुट को हमेशा सही माना जाता है (आपके कोड में LaTeX के सिंटैक्स की जांच करने की आवश्यकता नहीं है)। इनपुट में केवल ऊपर दिए गए तीन LaTeX कमांड और 'टेक्स्ट' शामिल होंगे जिन्हें आपको प्रारूपित करने की आवश्यकता नहीं होगी।

LaTeX कमांड हमेशा ऊपर प्रस्तुत सिंटैक्स के साथ आएगा, अर्थात रकम और उत्पाद हमेशा ऊपरी और निचले सीमा होते हैं (हालांकि वे खाली हो सकते हैं) और अंशों के लिए हमेशा एक अंश और भाजक होगा।

हम मानते हैं कि रकम और उत्पादों की सीमाएं अधिकतम 4 वर्णों (= योग और उत्पाद प्रतीकों की चौड़ाई) पर हैं, ताकि आपको संभावित ओवरलैप मुद्दों के बारे में चिंता न करनी पड़े। इसी तरह के कारणों के लिए, हम मानते हैं कि सीमाएं केवल 'पाठ' हैं और कभी भी LaTeX कमांड नहीं होंगे, उदाहरण के \sum_{\sum_{1}^{2}}^{1}लिए एक वैध इनपुट नहीं है।

आउटपुट

आपके प्रोग्राम का आउटपुट आपके द्वारा इनपुट के रूप में दिए गए LaTeX कमांड का ASCII प्रतिनिधित्व है।

आपके कार्यक्रम को क्षैतिज संरेखण को ध्यान में रखना है: उदाहरण के लिए, राशि या उत्पाद की सीमा क्षैतिज रूप से योग या उत्पाद चिह्न (जो दोनों 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
अच्छी पहली चुनौती। यह बहुत मुश्किल लग रहा है; मैं कुछ समाधान देखने के लिए उत्साहित हूं।
एलेक्स ए।

1
@ एलेक्स ए। मैं मूल रूप से अभिन्न, वर्गमूल और विस्तार योग्य कोष्ठक का इरादा रखता हूं, लेकिन यह बहुत अधिक प्रतीत होता है ...
17 जनवरी को

2
मेरा मानना ​​है कि ऐसे मामले होंगे जहां आपको ओवरलैप मिलेगा। उदाहरण के लिए, यदि आपके पास एक राशि है, जहां शब्द 4 से अधिक हो जाता है (उदाहरण के लिए कई अंशों, योगों के अंश), और योग की एक लंबी ऊपरी / निचली सीमा होती है, ऊपरी / निचला बाध्य स्ट्रिंग शब्द के साथ ओवरलैप कर सकता है। इसका समाधान कैसे होगा? क्या सीमा के साथ ओवरलैप से बचने के लिए शब्द का योग होना चाहिए?
रेटो कोराडी


8
मैं वास्तव में आशा करता हूं कि कोई व्यक्ति LaTeX में एक समाधान के साथ आता है
शैडल्कर

जवाबों:


23

अजगर 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
@ सब समझ में आता है! अच्छा काम :)
Kade

22

लाटेक्स, 540 532 अक्षर

अस्वीकरण: यह सही नहीं है और यकीनन इसे मान्य उत्तर के रूप में नहीं गिना जाता है।

\ Usepackage [LGRgreek] {} mathastext
\ renewcommand {\ sum} {\ _ kern-1ex \ displaystyle \ mathop {\ vooomom {\ int} \ start {array} {l} \ mbox {\ hspace {\ hspace {12pt}}}} \\ \ mbox {\ textbackslash } \ hspace {8pt} `\\\ mbox {/ \ रेखांकन {\ hspace {8pt}}} \ अंत {सरणी}} \ displaylimits}
\ renewcommand {\ prod} {\ _ kern-1ex \ displaystyle \ mathop {\ _ vooom {\ int} \ start {array} {c} \ mbox {\ hspace {\ hspace {16pt}}}} \ \ \ \ \ | | \\ | \ \ \ \ | \ end {सरणी}} \ displaylimits}
\ Renewcommand {\ frac} [2] {\ mathop {\ xleaders \ hbox {-} \ hfill \ kern0pt} \ सीमा ^ {# 1} _ {# 2}}
\ DeclareMathSizes {10} {10} {10} {10}

@Fatalize से कुछ मदद, विवरण के लिए टिप्पणियां देखें।

परीक्षा:

इनपुट: \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}उसके बाद (लाटेक को सिकुड़ने वाले और भाजक को रोकने के लिए), और अपनी राशि और उत्पाद परिभाषा में \kern-1exपहले जोड़कर \displaystyle
घातक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.