Zavallı adamın LaTeX'i


37

İnsanların bilgisayarlarda matematiksel denklemleri ASCII sanatı olarak elle yazdıkları paralel bir evrende taşınırsınız. Bir LaTeX bağımlısı olarak, bu kesinlikle kabul edilemez ve bu süreci biraz otomatik hale getirmelisiniz.

Amacınız, LaTeX matematik komutu olarak girilen bir denklemin ASCII sürümünü çıkaran bir program yazmaktır.

Zorunlu LaTeX komutları desteklenmeli

  • Toplam: toplamın LaTeX komutu \sum_{lower bound}^{upper bound}

    Toplamlar için kullanmanız gereken ASCII rakamı:

    upper bound
        ___ 
        \  `
        /__,
    lower bound
    
  • Ürün: Bir ürün için LaTeX komutu \prod_{lower bound}^{upper bound}

    Ürünler için kullanmanız gereken ASCII rakamı:

    upper bound
        ____
        |  |
        |  |
    lower bound
    
  • Kesir: Kesirler için LaTeX komutu \frac{numerator}{denominator}

    Kesirler için kullanmanız gereken ASCII rakamı:

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

Bu üç komuttan biri olmayan herhangi bir şey olduğu gibi görüntülenir. Örneğin, \sum{i=3}^{e^10}\frac{3x+5}{2}olarak gösterilmelidir

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

Girdiler

Giriş, bir dize olarak iletilen bir LaTeX komutudur (veya diliniz dizelere eşdeğerdir). LaTeX komutları iç içe geçebilir, örneğin \frac{\frac{1}{2}}{3}geçerli bir girdidir. Girişlerin her zaman doğru olması gerekiyordu (LaTeX'in sözdizimini kodunuzda kontrol etmeniz gerekmez). Girişler yalnızca yukarıda sunulan üç LaTeX komutundan ve biçimlendirmeniz gerekmeyecek 'metin' den oluşacaktır.

LaTeX komutları her zaman yukarıda sunulan sözdizimiyle gelir, yani toplamlar ve ürünler her zaman üst ve alt sınırlara sahip olur (boş olsalar da) ve her zaman kesirler için bir pay ve payda bulunacaktır.

Toplamların ve ürünlerin sınırlarının en fazla 4 karakter uzunluğunda olduğunu (= toplamın ve ürün sembollerinin genişliği) olduğunu ve olası çakışma sorunları hakkında endişelenmenize gerek olmadığını varsayıyoruz. Benzer nedenlerden dolayı, sınırların sadece 'metin' olduğunu ve asla LaTeX komutları olmayacağını varsayıyoruz, örneğin \sum_{\sum_{1}^{2}}^{1}geçerli bir giriş değil.

çıktılar

Programınızın çıktısı, giriş olarak verdiğiniz LaTeX komutunun ASCII gösterimidir.

Programınız yatay hizalamayı dikkate almalıdır: örneğin toplamın veya ürünün sınırları toplam veya ürün sembolüyle yatay olarak hizalanmalıdır (her ikisi de 4 karakter genişliğindedir). Sınır, tek sayıda karakter içeriyorsa, hangisinin iyi olursa, bir karakterin sağdan mı sağdan mı yoksa soldan mı geldiği önemli değildir. Kesir çizgisi, hangisi en uzunsa, pay veya payda olduğu sürece olmalıdır.

Programınızın dikey olarak hizalamasını göz önünde \frac{\frac{1}{2}}{3} = \frac{1}{6}bulundurması gerekir : örneğin,

1
-
2   1
- = -
3   6

Toplamlar ve ürünler için, semboller 4 karakter yüksekliğinde olduğu için dikey merkezin üstten ikinci satır olduğu varsayılır.

Verilen girişte yatay boşlukların doğru olduğu varsayılmaktadır, yani girişteki boşluklar çıktıda gösterilmelidir.

Test durumları

  • Giriş abc = 2

    Çıktı abc = 2

  • Giriş e = \sum_{n=0}^{+inf} \frac{1}{n!}

    Çıktı

        +inf
        ___  1
    e = \  ` --
        /__, n!
        n=0
    
  • Giriş e^x = 1 + \frac{x}{1 - \frac{x}{2 + x - ...}}

    Çıktı

                     x
    e^x = 1 + ---------------
                       x
              1 - -----------
                  2 + x - ...
    
  • Giriş \prod_{i=1}^{n} \frac{\sum_{j=0}^{m} 2j}{i + 1}

    Çıktı

           m
          ___
          \  ` 2j
     n    /__,
    ____  j=0
    |  |  -------
    |  |   i + 1
    i=1
    
  • Giriş \frac{sum}{prod} = \sum_{frac}^{prod} sum

    Çıktı

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

puanlama

Bu , yani en kısa kod kazanır.


11
Güzel ilk meydan okuma. Oldukça zor görünüyor; Bazı çözümler görmek için heyecanlıyım.
Alex A.

1
@Alex A. Başlangıçta ayrıca integraller, karekökler ve genişletilebilir parantezler de kullanmayı planlamıştım, ancak bu biraz fazla görünüyordu ...
Fatalize

2
Üst üste geleceğiniz durumlar olacağına inanıyorum. Örneğin, terimin 4'ten yüksek olduğu bir toplamınız varsa (örneğin, çoklu kesirler, toplamların kesirleri) ve toplamın uzun bir üst / alt sınıra sahip olması durumunda, üst / alt sınır dizesi terimle üst üste gelebilir. Bu nasıl çözülür? Sınırlarla çakışmamak için terimin toplamdan ayrılması gerekiyor mu?
Reto Koradi


8
Umarım birileri
LaTeX'te

Yanıtlar:


23

Python 2, 656 627 618 bayt

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'de girdi alır ve çıktıyı STDOUT'a yazar.

Program başka hiçbir kontrolü daha dizisini varsayar \frac, \sumya \prodgirdi (yani, normal metin olarak gösterilmez) görünene ve ~de görünmüyor (Bu matematik modunda özel bir anlamı vardır zaten.) Açık Öte yandan, bir program yapar sınırlarına olarak rasgele formüller destek \sumve \prod.

açıklama

Sadece TeX gibi çalışır! (iyi, sırala ...) Her bir alt formül (tek karakterden başlayarak ve daha karmaşık formüller oluşturarak), ilgili genişlik, yükseklik ve derinlik (taban çizgisi) ile bir kutuya dönüştürülür. Daha basit formüllerin kutuları, karmaşık formüllerin oluşturulması için daha büyük kutulara birleştirilir. Her kutunun içeriği, kutunun sol üst köşesine göre bir konum / karakter çiftleri listesi olarak gösterilir; kutular daha büyük bir kutuda birleştirildiğinde, pozisyonlar büyük olanın içindeki küçük kutuların göreceli konumlarına göre dengelenir ve listeler birleştirilir.

Sonunda, yazdırılabilir bir forma dönüştürülen üst seviye bir kutu ile son buluruz.


Biraz baharatlamak için, aşağıdaki sürüm aynı zamanda kare kökleri de destekliyor:

Örnekler:

  • \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
Tamamen etkilendim söylemeliyim! Koşmaya çalıştım \prod_{i=1}^{\sum_{azededzeda}^{k}} \frac{\sum_{j=0}^{m} 2j}{i + 1}ve gerekmediği halde her şeyi çakışma olmadan doğru bir şekilde çıktı. Güzel!
15'te

4
Ve sadece ~% 18 daha fazla bayt ile kare kökleri destekliyorsunuz. Birisi bu adamı durdursun!
15'te ölümle sonuçlandı

1
@Ell Bu mantıklı! Güzel çalışma :)
Kade

22

LaTeX, 540 532 karakter

Feragatname: Bu mükemmel değil ve tartışmalı olarak geçerli bir cevap sayılmaz.

\ Usepackage [LGRgreek] {mathastext}
\ renewcommand {\ sum} {\ kern-1ex \ displaystyle \ mathop {\ vphantom {\ int} \ begin {array} {l} \ mbox {\ altı çizili {\ hspace {12pt}}} \ \ \ mbox {\ textbackslash } \ hspace {8pt} '\\\ mbox {/ \ çizgi {\ hspace {8pt}}} \ end {dizi}} \ displaylimits}
\ renewcommand {\ prod} {\ kern-1ex \ displaystyle \ mathop {\ vphantom {\ int} \ begin {array} {c} \ mbox {\ altı çizili {\ hspace {16pt}}} \\ | \ \ \ \ \ | \\ | \ \ \ \ | | \ end {array}} \ displaylimits}
\ Renewcommand {\ frac} [2] {\ mathop {\ xleaders \ HBox {-} \ hfill \ kern0pt} \ sınırları ^ {1.} _ {# 2}}
\ DeclareMathSizes {10} {10} {10} {10}

@Fatalize'den yardım, detaylar için yorumları görün.

Ölçek:

Giriş: \prod_{i=1}^{n} \frac{\sum_{j=0}^{m} 2j}{i + 1}

Çıktı:

görüntü tanımını buraya girin

Gördüğünüz gibi, çıktı spesifikasyona tam olarak uymuyor. Bu cevabımı diskalifiye edebilir, ancak hala göndermeye değer olduğunu düşünüyorum.

Bunu sharelatex.com'da yazdım. Burada onunla oynayabilirsiniz .


1
Güzel! Kodunuzla biraz oynadım ve fraksiyonunuzu değiştirerek \newcommand{\frac}[2]{\mathop{\xleaders\hbox{-}\hfill\kern0pt}\limits^{#1}_{#2}}, \DeclareMathSizes{10}{10}{10}{10}bundan sonra ekleyerek (LaTeX'in numaralayıcıları ve paydayları küçültmesini engellemek için) ve toplamı ve ürün tanımınızı daha \kern-1exönce ekleyerek her şeyi düzeltebileceğinizi düşünüyorum \displaystyle.
15'te
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.