分岐したテキスト


26

ASCII文字列(大文字または小文字、あるいはその両方)を指定すると、各文字で分岐する文字列を表示するために必要な生のMathJaxを上付き文字と下付き文字に出力します。たとえば、入力cathorse出力は、MathJaxがそれぞれ次のようにレンダリングする出力になります。

猫の分岐の画像 分岐する馬の画像

必要な入力は1つだけであることに注意してください。これら2つは、単に垂直方向のスペースを節約するために並べてリストされています。

マークアップの意味

  • _ 添え字を示します。
  • ^ 上付き文字を示します。
  • すべてが同じレベルにならないようにするために、上付き文字または下付き文字をさらに含む上付き文字または下付き文字列を囲む中かっこが必要です。

テストケース

テストケースの形式はです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>を解除したいのですが、下付きを解除したいと言った人がいますか?投稿全体を読んだかどうかを確認するテストでしたか?
エリックアウトゴルファー

12
@EriktheOutgolferいいえ、それはただの非常に悪い冗談でした。
-trichoplax

代わりにコンパイルされたpdfの結果を出力することはできますか?純粋なラテックスの答えを書きたいです。
小麦ウィザード

@WheatWizardは別の挑戦のように聞こえます。ここでの答えとしては無効です。
-trichoplax

回答:


10

Python、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
うわー、それはいくつかのクレイジーな再帰です。
ミスターXcoder

1
81バイトの文字列フォーマット(コメントでTIOリンクする方法はまだわかりません):f = lambda s:s and s [0] + '_ {0} ^ {0}'。format(s [2:] and ' {'+ f(s [1:])+'} 'or s [1:] and s [1])
コナージョンストン

1
@ConnerJohnstonありがとう!でtioリンクを配置できますが[text](link)、それは本当に台無しになります;)
Uriel

1
79バイト。そして、匿名関数のトリックを使用したくないと思いますが、2バイト節約できます。
ジョナサンフレッチ

7

Mathematica、72 84 77 76バイト

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

CP-1252(Windows)エンコードを使用します。入力として文字のリストを受け取ります。

説明

a_±b__:=

±2つ以上の引数を使用して、関数を定義します。最初の引数aにラベルを付け、2番目以降にラベルを付けbます。

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

List相当するものを作成します"{a_±b^±b}"±b再帰的に再度評価されます)。

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

±1または0の引数で関数を定義します。第一引数にラベルを付けa、それが存在する場合、および割り当て""aそう。

{"",a,""}

List相当するものを作成し、"a"Stringのsを埋め込みます。

""<>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(少なくともオンラインデモでは)4文字以上の単語には機能しません。
デザート

2
@dessertは非常に奇妙で、間違いなくインタープリターに対するバグ報告に値します。3バイトのコストで回避策を追加しました。
ピーターテイラー

7

JavaScript(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

Haskell、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
-5バイト、44バイトバージョンに基づく:オンラインで試してみてください!
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 + 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]+"_'{}'初めて変数を使用するときにインライン代入を行うと、さらに1バイト節約できます。
タトルマン

@Tutleman再帰的(t=f s[1..-1])であるため、匿名関数が機能するとは思わず、文字列の先頭を既に再配置しましたが、インライン割り当てを使用できます。
Nnnes

1
ど!おっと-それを見逃したなんて信じられない。とにかく、(名前の付いた)ラムダを使用する方がまだ短いです:再帰呼び出しを行うときに必要f=->s{...}な余分[]を考慮しても、4バイトを節約します。
タトルマン

@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通知が表示されます。


1

網膜、43バイト

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

オンラインでお試しください!リンクにはテストケースが含まれます。説明:

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

最後のキャラクターをスライスしてボールを転がします。(ただし、それが唯一のキャラクターである場合は、そのままにします。)

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

¶文字を一度に1ステップずつ戻します。毎回前の結果を取得し、次の文字の添え字と上付きにします。

¶{|}$

冗長な¶と外側の{}を削除します。



0

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

全くの初期値が指定されているのでmreduceRight最後の要素取りませんs初期値としては、インデックスで反復処理を開始しますs.length-2


s=>[...s].reduceRight((m,c)=>`{${c}_${m}^${m}}`).slice(1,-1)60バイトのみです。
ニール

空の文字列では機能しないようです(最初のテストケース)。
-trichoplax
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.