Çatallanmış metin


26

Bir ASCII harfleri dizisi (büyük ve / veya küçük harf) verildiğinde, her karakterde ikiye bölünen dizgeyi görüntülemek için gereken ham MathJax'ı üst kodlara ve abonelere aktarın. Örneğin, girişler catve horseMathJax'ın sırasıyla aşağıdaki şekilde verdiği çıkışlarla sonuçlanacaktır:

kedi bifurcating görüntüsünü at bifurcating görüntüsünü

Sadece bir giriş yapılması gerektiğine dikkat edin - bu iki yan yana sadece dikey alan tasarrufu sağlamak için listelenir.

Biçimlendirme anlamı

  • _ bir aboneliği gösterir.
  • ^ bir üst metni gösterir.
  • Hepsinin aynı seviyede olmasını engellemek için daha fazla üst yazı veya alt yazı içeren alt veya üst alt dizgilerin etrafına diş telleri gerekir.

Test durumları

Test durumları biçimindedir input : output. İlk sınama durumu, boş dizenin giriş olarak boş dizge çıktısı olarak çıkması gerektiğini gösterir.

"" : ""
"a" : "a"
"me" : "m_e^e"
"cat" : "c_{a_t^t}^{a_t^t}"
"frog" : "f_{r_{o_g^g}^{o_g^g}}^{r_{o_g^g}^{o_g^g}}"
"horse" : "h_{o_{r_{s_e^e}^{s_e^e}}^{r_{s_e^e}^{s_e^e}}}^{o_{r_{s_e^e}^{s_e^e}}^{r_{s_e^e}^{s_e^e}}}"
"bifurcate" : "b_{i_{f_{u_{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}^{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}}^{u_{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}^{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}}}^{f_{u_{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}^{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}}^{u_{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}^{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}}}}^{i_{f_{u_{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}^{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}}^{u_{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}^{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}}}^{f_{u_{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}^{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}}^{u_{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}^{r_{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}^{c_{a_{t_e^e}^{t_e^e}}^{a_{t_e^e}^{t_e^e}}}}}}}"

Çıktının mathurl.com'a yapıştırarak bunların nasıl oluşturulduğunu görebilirsiniz .

Yedek diş teli yok

MathJax, gereksiz parantezleri içeren bir işaretleme oluşturacaktır. Render Örneğin, şu bütün aynı görünümde olacaktır: a, {a}, {}{a}, {{{{a}}}}.

Bununla birlikte, bu zorluğun geçerli çıktısının fazladan destekleri yok. Özellikle çıktıdaki tek karakterlerin parantezlerle çevrili olmadığını unutmayın.

Sipariş

Abonelik ve üst simge sırası önemsizdir. Aşağıdakiler eşdeğerdir ve işlendiklerinde ayırt edilemezler (ve hepsi aynı derecede geçerli çıktılardır):

c_{a_t^t}^{a_t^t}
c_{a^t_t}^{a_t^t}
c_{a_t^t}^{a^t_t}
c_{a^t_t}^{a^t_t}
c^{a_t^t}_{a_t^t}
c^{a^t_t}_{a_t^t}
c^{a_t^t}_{a^t_t}
c^{a^t_t}_{a^t_t}

puanlama

Her dil için, kazanan bayt cinsinden en kısa koddur.

Çok fazla bildirim var mı? Tip </sub>unsubscript için


Çok fazla bildirim var mı? Tip </sub>unsubscript için ben unsubscript falan istiyor söyledi ha? Tüm yazıyı doğru okudum mu diye bir sınav mıydı?
Outgolfer Erik,

12
@EriktheOutgolfer hayır, sadece çok kötü bir şakaydı.
trichoplax

Bunun yerine derlenmiş pdf sonucunu çıkartabilir miyiz? Saf bir Lateks cevap yazmak istiyorum.
Buğday Sihirbazı,

@WheatWizard farklı bir meydan okuma gibi geliyor. Burada bir cevap olarak geçerli olmaz.
trichoplax

Yanıtlar:


10

Python, 95 90 86 92 82 bayt

@ConnerJohnston sayesinde 10 bayt kurtarıldı

f=lambda s:s and s[0]+(s[1:]and'_{0}^{0}'.format(s[2:]and'{'+f(s[1:])+'}'or s[1]))

Çevrimiçi deneyin!


4
Vay canına, bu çılgınca bir özyineleme.
Bay Xcoder,

1
81 baytlık bazı string formatları (henüz yorumlarda TIO bağlantısının nasıl yapıldığından emin değilsiniz): f = lambda s: s ve s [0] + '_ {0} ^ {0}'. Format (s [2:] ve ' {'+ f (s [1:]) +'} 'veya s [1:] ve s [1])
Conner Johnston,

1
@ConnerJohnston teşekkürler! tio bağlantılarını koyabilirsiniz [text](link), ancak bu gerçekten bozulma;)
Uriel

1
79 bayt ; ve anonim işlev hilesini kullanmak istemediğinizi varsayalım, ancak 2 byte tasarruf edersiniz.
Jonathan Frech

7

Mathematica, 72 84 77 76 bayt

a_±b__:={"{",a,"_",±b,"^",±b,"}"};±(a_:""):={"",a,""};""<>Most@Rest@±##&@@#&

CP-1252 (Windows) kodlamasını kullanır. Girdi olarak bir karakter listesi alır.

açıklama

a_±b__:=

±2 veya daha fazla argümanla fonksiyonu tanımlayın . İlk argümanı etiketleyin, aikincisi de açık b.

{"{",a,"_",±b,"^",±b,"}"}

Bir oluşturma Listiçin eşdeğer "{a_±b^±b}"( ±bolan yinelemeli tekrar değerlendirilir).

±(a_:""):= ...

Fonksiyonu ±, 1 veya 0 argümanıyla tanımlayın . İlk argüman Etiket avarsa, ve atamak ""için aaksi.

{"",a,""}

Boş s ile doldurulmuş bir Listeşdeğer oluşturun ."a"String

""<>Most@Rest@±##&@@#&

Geçerlidir Saf fonksiyon ±girişi, ilk ve son elemanı ve dönüştürür damla Listiçin String.


7

CJam (35 bayt)

MqW%{"^{ }_{ }"{AW$,)3e<#<},S/@*+}/

Bu tam bir programdır. Çevrimiçi demo .

3 bayt tercüman bir hata etrafında çalışır (aşağıya bakınız).

teşrih

M            e# Start building from the empty string
qW%{         e# For each character in the reversed input
  "^{ }_{ }" e#   Take a template
  {          e#   If the accumulator is of length n, remove all characters whose
    A        e#   codepoints are greater than pow(10,
    W$,)3e<  e#                                   min(n+1, 3))
    #<       e#   When the accumulator is the empty string, that's all of them.
  },         e#   When the accumulator is one character, that's {}
             e#   When the accumulator is any longer, it's none of them.
  S/@*       e#   Substitute the accumulator for the spaces.
  +          e#   Append to the new character.
}/

min(n+1, 3)Tercümandaki bir hatanın üstesinden gelmek olduğuna dikkat edin : 10'luk güçlerde '}bundan daha küçük bir kalıp olmalıdır , ancak bu açık değildir .


Boş dize için iş görünmüyor (ilk sınama durumu).
trichoplax

1
@trichoplax, bu beni araştıran GolfScript ve CJam arasındaki ince farktan kaynaklanıyordu. Şimdi kodu daha önce olduğundan daha akıllı hale getirerek yalnızca bir bayt pahasına düzeltildi.
Peter Taylor

Şimdi mükemmel çalışıyor. Harika bir açıklama.
trichoplax

@PeterTaylor (En azından çevrimiçi demoda) Dört harften fazla olan kelimeler için işe yaramaz.
tatlı

2
@ tatlı, bu çok garip ve kesinlikle tercümana karşı bir hata raporu hak ediyor. 3 bayt pahasına bir geçici çözüm ekledim.
Peter Taylor

7

JavaScript (ES6), 57 55 bayt

f=([c,...s])=>s+s?c+`_${p=s[1]?`{${f(s)}}`:s}^`+p:c||''

Θ (len (s)) karmaşıklığı! @PeterTaylor'a göre, bu aslında Θ (2 ^ len (s)), ki hala en iyisi ...


Boş dize için iş görünmüyor (ilk sınama durumu).
trichoplax

@trichoplax Şimdi düzeltilmeli.
ETHproductions

Şimdi mükemmel çalışıyor.
trichoplax

1
O'ndaki n nedir? Çıktının uzunluğu olduğunu varsayıyorum, ancak varsayılan olarak girişin uzunluğu olarak yorumlandığını belirtmediğiniz sürece ve çıktının uzunluğu girişin uzunluğunda üstel olduğundan, polinom süresinde uygulamak mümkün değildir.
Peter Taylor

@PeterTaylor Algoritmanın sadece len (input) adımlarını attığından, karmaşıklığın len (input) olduğuna karar vermiştim ... eğer doğru değilse, nasıl yapılacağını bilmediğim için onu posttan kaldırırım Doğru karmaşıklığın ne olduğunu bilmiyorsanız hesaplayın.
ETHProductions

6

Haskell , 71 bayt

f[x,y]=x:'_':y:'^':y:[]
f(x:y@(_:_))=x:"_{"++f y++"}^{"++f y++"}"
f x=x

Çevrimiçi deneyin!

Sadece geçerli bir kod vermemiz gerekirse, aşağıdakiler 44 bayt için işe yarar:

f[a]=[a]
f(a:b)=a:"_{"++f b++"}^{"++f b++"}"

Çevrimiçi deneyin!


2
-5 bayt, 44 bayt sürümüne göre: Çevrimiçi deneyin!
temmuz

@jferard Nice! Bunu yazıya ekleyeceğim.
Buğday Sihirbazı




5

SOGL V0.12 , 21 bayt

±K;{╔+;lH?"{ŗ}”}1 ^Ο+

Burada dene!

Açıklama:

±                      reverse the string
 K                     take off the first letter - will slowly convert to the output
  ;                    get the rest of the string ontop
   {                   iterate over the rest of the characters
    ╔+                   append "_" to it
      ;                  get the output string ontop
       lH?     }         if it's length - 1 [isn't 0]
          "{ŗ}”            push the string "{ŗ}" where ŗ is replaced by the output string
                1 ^Ο     wrap "^" around with the output string
                    +    prepend to it the current character + "_"

5

Perl 5 , 54 + 1 (-p) = 55 bayt

s/\{(.)\}/$1/g while s/([a-z])([a-z]+)/$1_{$2}^{$2}/ig

Çevrimiçi deneyin!

Nasıl?

Süre durumundaki ikame, ilk harfteki çoklu harflerin oluşumunu bozar, bunu takip eden parantez içinde diğerleri:

abc -> a_{bc}^{bc}

While döngüsü, çok harfli diziler kalmayana kadar yerine geçme işlemini gerçekleştirir. Döngünün içindeki yer değiştirme, tek harflerin etrafındaki destekleri kaldırır.


Güzel, regex cevaplarının ortaya çıkmasının ne kadar süreceğini merak ediyordum
Nnnes

4

Ruby , 76 73 72 68 67 57 bayt

Tutleman sayesinde 4 byte tasarruf sağlayan lambda kullanımı

f=->s{(r=s[1..-1])[0]?s[0]+?_+[r[1]??{+f[r]+?}:r]*2*?^:s}

Çevrimiçi deneyin!

Ungolfed:

def f(s)
  r = s[1..-1]
  if r.size > 0
    if r.size > 1
      x = "{" + f(r) + "}"
    else
      x = r
    end
    return s[0] + "_" + [x, x].join("^")
  else
    return s
  end
end

Bir işlev yerine, ->s{...}7 bayt kazandıran anonim bir lambda (örn. ) Kullanın. Ardından, değiştirerek 2 daha bayt kaydedebilirsiniz "#{s[0]}_ile s[0]+"_. '{}'İlk kullanımda bir değişkene satır içi atama yaparak bir bayttan tasarruf edebilirsiniz .
Tutleman

@Tutleman Özyinelemeli ( t=f s[1..-1]), bu nedenle adsız bir işlevin işe yarayacağını düşünmüyorum ve dizenin başlangıcını zaten yeniden düzenlemiştim, ancak satır içi atamayı kullanabilirim.
Nnnes

1
D'oh! Boğmaca - Bunu kaçırdığıma inanamıyorum. Neyse, bir (lambalı) lambda kullanmak hala daha kısadır: f=->s{...}4 byte'tan tasarruf sağlar [], özyinelemeli çağrı yaparken ihtiyacınız olan ekstraları bile hesaba katar.
Tutleman,

@Tutleman Oh evet, değişti. Şimdi eğer bu .trkarışıklıktan daha iyi bir şey bulabilirsem ...
Nnnes



1

PHP, 121 bayt

function b($s){return $s[0].($s[1]?'_'.($s[2]?'{'.($b=b(substr($s,1))).'}^{'.$b.'}':"$s[1]^$s[1]"):'');}echo b($argv[1]);

İşlev, 104 bayttır ve bir PHP Bildirimi gösterir.


1

Retina , 43 bayt

(.)(.)$
$1¶$2
+`(.)¶(.*)
¶{$1_$2^$2}
¶{|}$

Çevrimiçi deneyin! Link, test durumlarını içerir. Açıklama:

(.)(.)$
$1¶$2

Son karakteri keserek topu yuvarlayın. (Ama tek karakterse, onu rahat bırakın.)

+`(.)¶(.*)
¶{$1_$2^$2}

Result karakterini, her seferinde bir önceki adıma geçip bir sonraki karakterin alt simgesi ve üst simgesi haline getirerek, her defasında bir adım geri götürün.

¶{|}$

Şimdi gereksiz ¶ ve dış {} s'yi sökün.



0

Javascript, 73 Bayt

s=>[...s].reduceRight((m,c)=>`${c}_{${m}}^{${m}}`).replace(/{(.)}/g,'$1')

açıklama

s=>                                  // take the input string
    [...s]                           // split the string into an array
    .reduceRight(                    // reduce the array in reverse order
        (m,c)=>`${c}_{${m}}^{${m}}`  // storing the result of each iteration in the memo m
    )                                // and returning m at the end
    .replace(/{(.)}/g,'$1')          // replace redundant {}

Hiçbir başlangıç değeri var belirtilmiş olduğundan m, reduceRightson elemanını alır sbaşlangıç değeri olarak ve endeksinde iterating başlar s.length-2.


s=>[...s].reduceRight((m,c)=>`{${c}_${m}^${m}}`).slice(1,-1)sadece 60 bayttır.
Neil

Boş dize için iş görünmüyor (ilk sınama durumu).
trichoplax
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.