Teks bercabang

26

Diberikan string huruf ASCII (huruf besar dan kecil), menghasilkan MathJax mentah yang diperlukan untuk menampilkan string yang bercabang dua pada setiap karakter, menjadi superskrip dan subskrip. Misalnya, input catdan horseakan menghasilkan output yang dirender MathJax sebagai berikut, masing-masing:

gambar bifurkasi kucing gambar bifurkasi kuda

Perhatikan bahwa hanya satu input yang harus diambil - keduanya terdaftar berdampingan hanya untuk menghemat ruang vertikal.

Makna markup

  • _ menunjukkan suatu subskrip.
  • ^ menunjukkan superskrip.
  • Kawat gigi diperlukan di sekitar substring superskrip atau subskrip yang berisi superskrip atau subskrip lebih lanjut untuk mencegah mereka semua berada di level yang sama.

Uji kasus

Kasing uji ada dalam format input : output. Kasing uji pertama menunjukkan string kosong sebagai input harus menghasilkan string kosong sebagai output.

"" : ""
"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}}}}}}}"

Anda dapat melihat bagaimana ini dirender dengan menempelkan output ke mathurl.com .

Tidak ada kawat gigi yang berlebihan

MathJax dengan senang hati akan membuat markup yang memiliki kawat gigi yang berlebihan. Sebagai contoh, berikut ini semua akan terlihat sama ketika diberikan: a, {a}, {}{a}, {{{{a}}}}.

Namun, keluaran yang valid untuk tantangan ini tidak memiliki kawat gigi yang berlebihan. Perhatikan khususnya bahwa karakter tunggal dalam output tidak dikelilingi oleh kawat gigi.

Memesan

Urutan subskrip dan superskrip tidak penting. Berikut ini adalah setara dan akan tidak bisa dibedakan ketika diberikan (dan semuanya sama-sama keluaran yang valid):

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}

Mencetak gol

Untuk setiap bahasa, pemenangnya adalah kode terpendek dalam byte.

Terlalu banyak notifikasi? Ketik </sub>untuk berhenti berlangganan

trichoplax
sumber
Terlalu banyak notifikasi? Ketik </sub>untuk berhenti berlangganan ya siapa bilang aku ingin berhenti berlangganan atau apa? Itu adalah tes untuk melihat apakah saya membaca seluruh posting, kan?
Erik the Outgolfer
12
@EriktheOutgolfer tidak, itu hanya lelucon yang sangat buruk.
trichoplax
Bisakah kita output saja hasil pdf yang dikompilasi? Saya ingin menulis jawaban Lateks murni.
Wheat Wizard
@WheatWizard yang terdengar seperti tantangan berbeda. Itu tidak akan valid sebagai jawaban di sini.
trichoplax

Jawaban:

10

Python, 95 90 86 92 82 byte

10 byte disimpan berkat @ConnerJohnston

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

Cobalah online!

Uriel
sumber
4
Wow, itu adalah rekursi gila.
Tn. Xcoder
1
Beberapa pemformatan string untuk 81 byte (belum yakin bagaimana menghubungkan TIO dalam komentar belum): f = lambda s: s dan s [0] + '_ {0} ^ {0}'. Format (s [2:] dan ' {'+ f (s [1:]) +'} 'atau s [1:] dan s [1])
Conner Johnston
1
@ConnerJohnston terima kasih! Anda dapat menempatkan tautan tio [text](link), tetapi itu benar-benar rusak;)
Uriel
1
79 byte ; dan saya berasumsi Anda tidak ingin menggunakan trik fungsi anonim, akan menghemat 2 byte.
Jonathan Frech
7

Mathematica, 72 84 77 76 byte

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

Menggunakan pengkodean CP-1252 (Windows). Mengambil daftar karakter sebagai input.

Penjelasan

a_±b__:=

Tentukan fungsi ±, dengan 2 atau lebih argumen. Beri label pada argumen pertama a, dan kedua dan seterusnya b.

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

Buat yang Listsetara dengan "{a_±b^±b}"( ±bdievaluasi lagi, secara rekursif).

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

Tentukan fungsi ±, dengan argumen 1 atau 0. Label argumen pertama a, jika ada, dan menetapkan ""untuk asebaliknya.

{"",a,""}

Buat yang Listsetara dengan "a", diisi dengan Strings kosong .

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

Fungsi murni yang berlaku ±untuk input, menjatuhkan elemen pertama dan terakhir, dan mengubahnya Listmenjadi String.

JungHwan Min
sumber
7

CJam (35 byte)

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

Ini adalah program lengkap. Demo online .

3 byte bekerja di sekitar bug di interpreter (lihat di bawah).

Pembedahan

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.
}/

Perhatikan bahwa min(n+1, 3)ini adalah untuk mengatasi bug dalam juru bahasa: harus ada beberapa pola dalam kekuatan 10 yang '}lebih kecil dari, tetapi tidak jelas .

Peter Taylor
sumber
Tampaknya tidak berfungsi untuk string kosong (test case pertama).
trichoplax
1
@trichoplax, itu karena perbedaan tipis antara GolfScript dan CJam yang kadang-kadang membuat saya ketahuan. Sekarang diperbaiki dengan biaya hanya satu byte dengan membuat kode jauh lebih pintar daripada sebelumnya.
Peter Taylor
Sekarang bekerja dengan baik. Penjelasan yang bagus.
trichoplax
@PeterTaylor (Setidaknya dalam demo online) Ini tidak berfungsi untuk kata-kata dengan lebih dari empat huruf.
hidangan penutup
2
@dabut, itu sangat aneh, dan jelas layak menerima laporan bug terhadap penerjemah. Saya telah menambahkan solusi dengan biaya 3 byte.
Peter Taylor
7

JavaScript (ES6), 57 55 byte

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

Θ kompleksitas (len)! Menurut @PeterTaylor, ini sebenarnya Θ (2 ^ len (s)), yang masih merupakan yang terbaik ...

Produksi ETH
sumber
Tampaknya tidak berfungsi untuk string kosong (test case pertama).
trichoplax
@trichoplax Harus diperbaiki sekarang.
ETHproduksi
Sekarang bekerja dengan baik.
trichoplax
1
Apa n di O (n) Anda? Saya anggap itu panjang output, tetapi kecuali Anda menyatakan bahwa itu ditafsirkan secara default menjadi panjang input, dan karena panjang output eksponensial dalam panjang input tidak mungkin untuk diterapkan dalam waktu polinomial.
Peter Taylor
@PeterTaylor saya telah menemukan bahwa karena algoritma hanya mengambil langkah len (input), kompleksitasnya adalah len (input) ... jika itu tidak benar saya hanya akan menghapusnya dari posting karena saya tidak tahu caranya untuk menghitungnya, kecuali jika Anda tahu apa kompleksitas yang benar.
ETHproduksi
6

Haskell , 71 byte

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

Cobalah online!

Jika kita hanya harus mengeluarkan kode yang valid, berikut ini akan bekerja untuk 44 byte:

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

Cobalah online!

Wisaya Gandum
sumber
2
-5 byte, berdasarkan pada versi 44 byte: Cobalah online!
jferard
@ jferard Nice! Saya akan menambahkan itu ke posting.
Wheat Wizard
66 byte: Cobalah secara online!
Laikoni
63 byte: Cobalah secara online!
Laikoni
59 byte: Cobalah secara online!
Laikoni
5

SOGL V0.12 , 21 byte

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

Coba Di Sini!

Penjelasan:

±                      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 + "_"
dzaima
sumber
5

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

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

Cobalah online!

Bagaimana?

Substitusi dalam kondisi while memecah kemunculan beberapa huruf pada huruf pertama, diikuti oleh yang lainnya dalam kurung kurawal seperti ini:

abc -> a_{bc}^{bc}

Loop sementara menjalankan substitusi hingga tidak ada lagi urutan multi-huruf yang tersisa. Substitusi di dalam loop menghilangkan kawat gigi dari sekitar satu huruf.

Xcali
sumber
Bagus, saya bertanya-tanya berapa lama waktu yang diperlukan untuk jawaban regex untuk muncul
Nnnes
4

Ruby , 76 73 72 68 67 57 byte

Penggunaan tabungan lambda 4 byte berkat Tutleman

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

Cobalah online!

Tidak Disatukan:

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
Nnnes
sumber
Alih-alih fungsi, gunakan lambda anonim (misalnya ->s{...}), yang menyimpan 7 byte. Kemudian, Anda dapat menyimpan 2 byte lebih banyak dengan menggantinya "#{s[0]}_dengan s[0]+"_. Anda dapat menyimpan satu byte lebih lanjut dengan melakukan penugasan sebaris '{}'ke suatu variabel saat pertama kali Anda menggunakannya.
Tutleman
@Tutleman Ini rekursif ( t=f s[1..-1]), jadi saya tidak berpikir fungsi anonim akan bekerja, dan saya sudah mengatur ulang awal string, tapi saya bisa menggunakan tugas inline.
Nnnes
1
Doh! Whoops - Aku tidak percaya aku melewatkan itu. Lagi pula, masih lebih pendek untuk menggunakan lambda (bernama): f=->s{...}menyimpan 4 byte, bahkan terhitung untuk tambahan yang []Anda butuhkan saat melakukan panggilan rekursif.
Tutleman
@ Talkleman Oh ya, ubahlah. Sekarang jika saya dapat menemukan sesuatu yang lebih baik daripada .trkekacauan itu ...
Nnnes
2

Python 2 , 84 byte

def b(s):q=s and(s[2:]and'{%s}'or'%s')%b(s[1:]);return s[1:]and s[0]+'^%s_'%q+q or s

Cobalah online!

Erik the Outgolfer
sumber
1

Pyth , 47 byte

Ljk[hb|&ttbs[\_\{ytb"}^{"ytb\})&tbs[\_htb\^htb;

Cobalah online!

Ini adalah port langsung dari jawaban Python @ Uriel. Pergi ke golf turun sedikit.

Arnold Palmer
sumber
1

PHP, 121 byte

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

Fungsi itu sendiri 104 byte dan menunjukkan Pemberitahuan PHP.

jstnthms
sumber
1

Retina , 43 byte

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

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

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

Dapatkan bola bergulir dengan memotong karakter terakhir. (Tapi jika itu satu-satunya karakter, mereka biarkan saja.)

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

Pindahkan karakter ¶ mundur satu langkah pada satu waktu, setiap kali mengambil hasil sebelumnya dan menjadikannya subskrip dan superskrip dari karakter berikutnya.

¶{|}$

Hapus ¶ yang sekarang berlebih dan bagian luar {} s.

Neil
sumber
1

Java (OpenJDK 8) , 121 byte

s->{int l=s.length;String r=--l<0?"":""+s[l];for(;l-->0;)r="{"+s[l]+"_"+r+"^"+r+"}";return r.replaceAll("^\\{|\\}$","");}

Cobalah online!

Olivier Grégoire
sumber
0

Javascript, 73 Bytes

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

Penjelasan

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 {}

Karena tidak ada nilai awal yang ditentukan m, reduceRightambil elemen terakhir ssebagai nilai awal, dan mulai iterasi pada indeks s.length-2.

sangat penting
sumber
s=>[...s].reduceRight((m,c)=>`{${c}_${m}^${m}}`).slice(1,-1)hanya 60 byte.
Neil
Tampaknya tidak berfungsi untuk string kosong (test case pertama).
trichoplax