Văn bản chia đôi


26

Đưa ra một chuỗi các chữ cái ASCII (chữ hoa và / hoặc chữ thường), xuất MathJax thô cần thiết để hiển thị chuỗi đó chia đôi cho mỗi ký tự, thành các siêu ký tự và các chỉ mục. Ví dụ: các đầu vào cathorsesẽ dẫn đến kết quả đầu ra mà MathJax biểu hiện như sau:

hình ảnh của mèo chia đôi hình ảnh của ngựa chia đôi

Lưu ý rằng chỉ có một đầu vào được yêu cầu - hai cái này được liệt kê cạnh nhau đơn giản để tiết kiệm không gian dọc.

Ý nghĩa đánh dấu

  • _ chỉ ra một chỉ mục.
  • ^ chỉ ra một siêu ký tự.
  • Niềng răng được yêu cầu xung quanh các chuỗi con siêu ký tự hoặc ký hiệu có chứa siêu ký tự hoặc ký hiệu phụ để ngăn chặn tất cả chúng ở cùng một cấp độ.

Các trường hợp thử nghiệm

Các trường hợp thử nghiệm có định dạng input : output. Trường hợp thử nghiệm đầu tiên cho thấy chuỗi trống là đầu vào sẽ dẫn đến chuỗi trống là đầu ra.

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

Bạn có thể thấy cách chúng được hiển thị bằng cách dán đầu ra vào mathurl.com .

Không có niềng răng dự phòng

MathJax sẽ vui vẻ kết xuất đánh dấu có dấu ngoặc nhọn. Ví dụ, sau đây tất cả sẽ trông giống hệt nhau khi hiển thị: a, {a}, {}{a}, {{{{a}}}}.

Tuy nhiên, đầu ra hợp lệ cho thử thách này không có dấu ngoặc nhọn. Đặc biệt lưu ý rằng các ký tự đơn trong đầu ra không được bao quanh bởi dấu ngoặc nhọn.

Gọi món

Thứ tự của đăng ký và siêu ký tự là không quan trọng. Các mục sau là tương đương và sẽ không thể phân biệt được khi được hiển thị (và đều là các đầu ra hợp lệ như nhau):

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}

Chấm điểm

Đối với mỗi ngôn ngữ, người chiến thắng là mã ngắn nhất tính bằng byte.

Quá nhiều thông báo? Nhập </sub>vào bản thảo


Quá nhiều thông báo? Gõ </sub>vào unsubcript huh ai nói tôi muốn hủy đăng ký hay cái gì đó? Đó là một thử nghiệm để xem nếu tôi đọc toàn bộ bài viết phải không?
Erik the Outgolfer

12
@EriktheOutgolfer không, đó chỉ là một trò đùa rất tệ.
trichoplax

Thay vào đó chúng ta có thể xuất kết quả pdf đã biên dịch không? Tôi muốn viết một câu trả lời thuần túy.
Thuật sĩ lúa mì

@WheatWizard nghe có vẻ như là một thử thách khác. Nó sẽ không có giá trị như một câu trả lời ở đây.
trichoplax

Câu trả lời:


10

Python, 95 90 86 92 82 byte

10 byte được lưu nhờ @ConnerJohnston

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

Hãy thử trực tuyến!


4
Wow, đó là một đệ quy điên.
Ông Xcoder

1
Một số định dạng chuỗi cho 81 byte (chưa biết cách liên kết TIO trong các bình luận): f = lambda s: s và s [0] + '_ {0} ^ {0}'. Format (s [2:] và ' {'+ f (s [1:]) +'} 'hoặc s [1:] và s [1])
Conner Johnston

1
@ConnerJohnston cảm ơn! bạn có thể đặt liên kết tio với [text](link), nhưng điều đó thực sự hư hỏng;)
Uriel

1
79 byte ; và tôi giả sử rằng bạn không muốn sử dụng thủ thuật hàm ẩn danh, sẽ tiết kiệm được 2 byte.
Jonathan Frech

7

Toán học, 72 84 77 76 byte

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

Sử dụng mã hóa CP-1252 (Windows). Đưa ra một danh sách các ký tự làm đầu vào.

Giải trình

a_±b__:=

Xác định hàm ±, với 2 hoặc nhiều đối số. Dán nhãn cho đối số đầu tiên a, và thứ hai và trên b.

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

Tạo một Listtương đương với "{a_±b^±b}"( ±bđược đánh giá lại, đệ quy).

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

Xác định hàm ±, với 1 hoặc 0 đối số. Dán nhãn cho đối số đầu tiên a, nếu nó tồn tại và gán ""cho akhác.

{"",a,""}

Tạo một Listtương đương "a", đệm với Strings trống .

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

Một hàm thuần áp dụng ±cho đầu vào, bỏ phần tử đầu tiên và cuối cùng và chuyển đổi Listthành String.


7

CJam (35 byte)

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

Đây là một chương trình đầy đủ. Bản demo trực tuyến .

3 byte hoạt động xung quanh một lỗi trong trình thông dịch (xem bên dưới).

Mổ xẻ

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

Lưu ý rằng đó min(n+1, 3)là cách khắc phục lỗi trong trình thông dịch: phải có một số mẫu trong các quyền hạn 10 '}nhỏ hơn, nhưng không rõ ràng .


Không xuất hiện để làm việc cho chuỗi trống (trường hợp thử nghiệm đầu tiên).
trichoplax

1
@trichoplax, đó là do sự khác biệt tinh tế giữa GolfScript và CJam đôi khi khiến tôi bị loại. Bây giờ đã cố định với chi phí chỉ một byte bằng cách làm cho mã thông minh hơn nhiều so với trước đây.
Peter Taylor

Hoạt động hoàn hảo bây giờ. Giải thích tuyệt vời.
trichoplax

@PeterTaylor (Ít nhất là trong bản demo trực tuyến) Nó không hoạt động đối với các từ có nhiều hơn bốn chữ cái.
tráng miệng

2
@datcher, điều đó rất kỳ lạ, và chắc chắn xứng đáng là một báo cáo lỗi đối với người phiên dịch. Tôi đã thêm một cách giải quyết với chi phí là 3 byte.
Peter Taylor

7

JavaScript (ES6), 57 55 byte

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

(Len (s)) phức tạp! Theo @PeterTaylor, đây thực sự là Θ (2 ^ len (s)), vẫn là tốt nhất có thể ...


Không xuất hiện để làm việc cho chuỗi trống (trường hợp thử nghiệm đầu tiên).
trichoplax

@trichoplax Nên sửa ngay.
Sản xuất ETH

Hoạt động hoàn hảo bây giờ.
trichoplax

1
N trong O (n) của bạn là gì? Tôi cho rằng đó là độ dài của đầu ra, nhưng trừ khi bạn nói rằng nó được hiểu theo mặc định là độ dài của đầu vào, và vì độ dài của đầu ra là theo cấp số nhân theo độ dài của đầu vào nên không thể thực hiện trong thời gian đa thức.
Peter Taylor

@PeterTaylor Tôi đã hình dung rằng thuật toán chỉ thực hiện các bước len (đầu vào), nên độ phức tạp là len (đầu vào) ... nếu điều đó không chính xác, tôi sẽ xóa nó khỏi bài viết vì tôi không biết để tính toán nó, trừ khi bạn biết độ phức tạp chính xác là gì.
Sản xuất ETH

6

Haskell , 71 byte

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

Hãy thử trực tuyến!

Nếu chúng ta chỉ cần xuất mã hợp lệ, phần sau sẽ hoạt động với 44 byte:

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

Hãy thử trực tuyến!


2
-5 byte, dựa trên phiên bản 44 byte: Dùng thử trực tuyến!
jferard

@jferard Đẹp! Tôi sẽ thêm nó vào bài viết.
Thuật sĩ lúa mì




5

SOGL V0.12 , 21 byte

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

Hãy thử nó ở đây!

Giải trình:

±                      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 byte

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

Hãy thử trực tuyến!

Làm sao?

Sự thay thế trong điều kiện while phá vỡ sự xuất hiện của nhiều chữ cái trong chữ cái đầu tiên, tiếp theo là phần còn lại trong dấu ngoặc nhọn như sau:

abc -> a_{bc}^{bc}

Vòng lặp while thực hiện thay thế cho đến khi không còn chuỗi nhiều chữ cái nữa. Sự thay thế bên trong vòng lặp loại bỏ dấu ngoặc từ xung quanh các chữ cái đơn.


Thật tuyệt, tôi đã tự hỏi sẽ mất bao lâu để một câu trả lời regex xuất hiện
Nnnes

4

Ruby , 76 73 72 68 67 57 byte

Sử dụng lambda tiết kiệm 4 byte nhờ Tutman

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

Hãy thử trực tuyến!

Ung dung:

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

Thay vì một hàm, sử dụng lambda ẩn danh (ví dụ ->s{...}), giúp tiết kiệm 7 byte. Sau đó, bạn có thể lưu thêm 2 byte bằng cách thay thế "#{s[0]}_bằng s[0]+"_. Bạn có thể lưu thêm một byte bằng cách thực hiện gán nội tuyến '{}'cho một biến trong lần đầu tiên bạn sử dụng nó.
Người hướng dẫn

@Tutman Đó là đệ quy ( t=f s[1..-1]), vì vậy tôi không nghĩ rằng một hàm ẩn danh sẽ hoạt động và tôi đã sắp xếp lại phần đầu của chuỗi, nhưng tôi có thể sử dụng phép gán nội tuyến.
Nnnes

1
Ôi! Rất tiếc - tôi không thể tin rằng tôi đã bỏ lỡ điều đó. Dù sao, vẫn còn ngắn hơn để sử dụng lambda (có tên): f=->s{...}tiết kiệm 4 byte, thậm chí chiếm thêm phần []bạn cần khi thực hiện cuộc gọi đệ quy.
Người hướng dẫn

@Tutman Oh yeah, đã thay đổi nó. Bây giờ nếu tôi có thể tìm ra thứ gì đó tốt hơn .trmớ hỗn độn đó ...
Nnnes



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]);

Hàm này là 104 byte và hiển thị Thông báo PHP.


1

Võng mạc , 43 byte

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

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Giải trình:

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

Nhận bóng lăn bằng cách cắt bỏ nhân vật cuối cùng. (Nhưng nếu đó là nhân vật duy nhất, họ để nó một mình.)

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

Di chuyển ký tự back trở lại một bước một lần, mỗi lần lấy kết quả trước đó và biến nó thành một chỉ mục và siêu ký tự của ký tự tiếp theo.

¶{|}$

Xóa phần thừa bây giờ và {} s bên ngoài.



0

Javascript, 73 byte

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

Giải trình

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

Bởi vì không có giá trị ban đầu được chỉ định là m, reduceRightlấy phần tử cuối cùng slàm giá trị ban đầu và bắt đầu lặp lại tại chỉ mục s.length-2.


s=>[...s].reduceRight((m,c)=>`{${c}_${m}^${m}}`).slice(1,-1)chỉ có 60 byte.
Neil

Không xuất hiện để làm việc cho chuỗi trống (trường hợp thử nghiệm đầu tiên).
trichoplax
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.