분기 된 텍스트


26

ASCII 문자 (대문자 및 / 또는 소문자) 문자열이 제공되면 각 문자에서 해당 문자열을 분기하여 위첨자 및 아래 첨자로 표시하는 데 필요한 원시 MathJax를 출력합니다. 예를 들어, 입력 cathorse결과는 MathJax가 각각 다음과 같이 렌더링하는 출력을 생성합니다.

고양이 분기 이미지 말 분기 이미지

하나의 입력 만 필요합니다.이 두 항목은 단순히 수직 공간을 절약하기 위해 나란히 나열됩니다.

마크 업 의미

  • _ 아래 첨자를 나타냅니다.
  • ^ 위첨자를 나타냅니다.
  • 첨자 또는 첨자 하위 문자열 주위에 괄호가 필요합니다. 위 첨자 또는 첨자가 모두 같은 수준에 있지 않도록하기 위해 추가 첨자 또는 첨자를 포함합니다.

테스트 사례

테스트 사례는 형식 input : 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}}}}}}}"

출력을 mathurl.com 에 붙여 넣어 어떻게 렌더링되는지 확인할 수 있습니다 .

중복 버팀대 없음

MathJax는 중괄호가 중복 된 마크 업을 행복하게 렌더링합니다. 렌더링 할 때 예를 들어, 다음은 모두 동일한 모양 : a, {a}, {}{a}, {{{{a}}}}.

그러나이 챌린지의 유효한 출력에는 중복 괄호가 없습니다. 특히 출력에서 ​​단일 문자는 중괄호로 묶이지 않습니다.

주문

아래 첨자와 위첨자의 순서는 중요하지 않습니다. 다음은 동일하며 렌더링 될 때 구별 할 수 없습니다 (그리고 모두 똑같이 유효한 출력).

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}

채점

각 언어마다 승자가 가장 짧은 코드 (바이트)입니다.

알림이 너무 많습니까? 아래 </sub>첨자에 입력


알림이 너무 많습니까? 입력 </sub>unsubscript에 내가 unsubscript 또는 뭔가 원하는 것을 응? 전체 게시물을 올바르게 읽었는지 확인하는 테스트입니까?
Outgolfer Erik

12
@EriktheOutgolfer 아니오 그것은 단지 아주 나쁜 농담이었습니다.
trichoplax

대신 컴파일 된 pdf 결과를 출력 할 수 있습니까? 순수한 라텍스 답변을 작성하고 싶습니다.
밀 마법사

다른 도전처럼 들리는 @WheatWizard. 대답으로는 유효하지 않습니다.
trichoplax

답변:


10

파이썬, 95 90 86 92 82 바이트

@ConnerJohnston 덕분에 10 바이트 절약

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

온라인으로 사용해보십시오!


4
와, 그것은 미친 재귀입니다.
Mr. Xcoder

1
81 바이트의 일부 문자열 형식화 (아직 주석에서 TIO 링크 방법을 잘 모르겠 음) : f = lambda s : s 및 s [0] + '_ {0} ^ {0}'. format (s [2 :] and ' { '+ f (s [1 :]) +'} 's 또는 s [1 :] 및 s [1])
코너 존스턴

1
@ConnerJohnston 감사합니다! 으로 tio 링크를 넣을 수는 [text](link)있지만 실제로는 망가집니다.)
Uriel

1
79 바이트 ; 그리고 익명 함수 트릭을 사용하고 싶지 않다고 가정하지만 2 바이트를 절약 할 수 있습니다.
Jonathan Frech

7

Mathematica, 72 84 77 76 바이트

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

CP-1252 (Windows) 인코딩을 사용합니다. 문자 목록을 입력으로 사용합니다.

설명

a_±b__:=

±두 개 이상의 인수를 사용 하여 함수를 정의하십시오 . 첫 번째 인수에 레이블을 지정 a하고 두 번째 및에 레이블을 지정하십시오 b.

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

List해당하는 항목을 작성하십시오 "{a_±b^±b}"( ±b재귀 적으로 다시 평가됨).

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

±1 또는 0 개의 인수를 사용 하여 함수를 정의하십시오 . 첫 번째 인수에 레이블을 a지정 ""하고 a그렇지 않은 경우에 지정하십시오 .

{"",a,""}

빈 s로 채워진에 List해당 "a"하는를 만듭니다 String.

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

적용 순수 함수 ±의 입력으로는, 첫 번째와 마지막 요소와 변환 삭제 List하는 방법에 대해 String.


7

CJam (35 바이트)

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

이것은 전체 프로그램입니다. 온라인 데모 .

3 바이트는 인터프리터의 버그를 해결합니다 (아래 참조).

해부

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)(10)의 힘에 약간의 패턴이 있어야합니다 : 인터프리터 버그를 해결할 것입니다 '}보다 작은, 그러나 그것은 분명 아니다 .


빈 문자열에 대해 작동하지 않는 것 같습니다 (첫 번째 테스트 사례).
trichoplax

1
@trichoplax는 GolfScript와 CJam의 미묘한 차이로 인해 때때로 나를 사로 잡았습니다. 이제 코드를 이전보다 훨씬 영리하게 만들어 1 바이트의 비용으로 고정되었습니다.
피터 테일러

이제 완벽하게 작동합니다. 좋은 설명입니다.
trichoplax

@PeterTaylor (적어도 온라인 데모에서는) 네 글자 이상의 단어에는 적용되지 않습니다.
디저트

2
@dessert, 그것은 매우 이상하며, 통역사에 대한 버그 보고서를받을 가치가 있습니다. 3 바이트의 비용으로 해결 방법을 추가했습니다.
피터 테일러

7

자바 스크립트 (ES6), 57 55 바이트

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

복잡성 Θ (len (s))! @PeterTaylor에 따르면 이것은 실제로 Θ (2 ^ len (s))이며, 여전히 최고의 결과입니다 ...


빈 문자열에 대해 작동하지 않는 것 같습니다 (첫 번째 테스트 사례).
trichoplax

@trichoplax 지금 수정해야합니다.
ETHproductions

이제 완벽하게 작동합니다.
trichoplax

1
O (n)에서 n은 무엇입니까? 출력의 길이라고 가정하지만 기본적으로 입력 길이로 해석된다고 말하지 않으면 출력 길이가 입력 길이에 기하 급수적이므로 다항식 시간으로 구현할 수 없습니다.
피터 테일러

@PeterTaylor 나는 알고리즘이 len (input) 단계만을 취하기 때문에 복잡성이 len (input)이라는 것을 알았습니다 ... 정확하지 않으면 게시물에서 제거 할 것입니다 정확한 복잡도가 무엇인지 알지 않는 한 계산하십시오.
ETHproductions

6

하스켈 , 71 바이트

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

온라인으로 사용해보십시오!

유효한 코드를 출력해야한다면 44 바이트에서 다음과 같이 작동합니다.

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

온라인으로 사용해보십시오!


2
44 바이트 버전을 기준으로 -5 바이트 : 온라인으로 사용해보십시오!
jferard

@jferard 니스! 게시물에 추가하겠습니다.
밀 마법사




5

SOGL V0.12 , 21 바이트

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

여기 사용해보십시오!

설명:

±                      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 바이트

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

온라인으로 사용해보십시오!

방법?

while 조건에서 대체하면 첫 번째 문자에서 여러 문자가 발생하고 다음과 같이 중괄호로 나머지 문자가 나타납니다.

abc -> a_{bc}^{bc}

while 루프는 더 이상 다중 문자 시퀀스가 ​​남아 있지 않을 때까지 대체를 실행합니다. 루프 내부의 대체는 단일 문자 주위에서 중괄호를 제거합니다.


니스, 나는 그것이 표시하는 정규식 대답을 얼마나 걸릴지 궁금 해서요
Nnnes

4

루비 , 76 73 72 68 67 57 바이트

Tutleman 덕분에 4 바이트 절약 람다 사용

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

온라인으로 사용해보십시오!

언 골프 드 :

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

함수 대신 익명 람다 (예 :)를 사용 ->s{...}하면 7 바이트가 절약됩니다. 그런 다음로 교체 "#{s[0]}_하여 2 바이트를 더 절약 할 수 있습니다 s[0]+"_. '{}'변수를 처음 사용할 때 인라인 으로 변수를 지정하여 한 바이트를 더 절약 할 수 있습니다 .
Tutleman

@Tutleman 재귀 ( t=f s[1..-1])이므로 익명 함수가 작동한다고 생각하지 않으며 이미 문자열의 시작 부분을 재정렬했지만 인라인 할당을 사용할 수 있습니다.
Nnnes

1
도! 으악-나는 그것을 놓쳤다 믿을 수 없다. 어쨌든 (명명 된) 람다를 사용하는 것이 여전히 짧 습니다. 재귀 호출을 할 때 필요한 f=->s{...}여분 []을 고려하더라도 4 바이트를 절약 합니다.
Tutleman

@Tutleman 오 예, 변경했습니다. 내가 그 .tr엉망 보다 더 나은 것을 내놓을 수 있다면 ...
Nnnes



1

PHP, 121 바이트

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

함수 자체는 104 바이트이며 PHP Notice를 보여줍니다.


1

레티 나 , 43 바이트

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

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 설명:

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

마지막 캐릭터를 잘라서 공을 굴립니다. (단, 캐릭터가 유일한 경우에는 그대로 둡니다.)

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

¶ 문자를 한 번에 한 단계 씩 뒤로 이동하십시오. 매번 이전 결과를 가져 와서 다음 문자의 아래 첨자와 위첨자로 만드십시오.

¶{|}$

이제 중복 된 ¶ 및 외부 {}를 제거하십시오.



0

자바 스크립트, 73 바이트

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

설명

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

어떤 초기 값이 지정되어 있기 때문에 m, reduceRight마지막 요소 취하지 않는 s초기 값을 인덱스로 순회를 시작한다 s.length-2.


s=>[...s].reduceRight((m,c)=>`{${c}_${m}^${m}}`).slice(1,-1)60 바이트입니다.
Neil

빈 문자열에 대해 작동하지 않는 것 같습니다 (첫 번째 테스트 사례).
trichoplax
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.