Text gegabelt

26

Wenn Sie eine Zeichenfolge aus ASCII-Buchstaben (Groß- und / oder Kleinbuchstaben) angeben, geben Sie das unformatierte MathJax aus, das erforderlich ist, um diese Zeichenfolge bei jedem Zeichen in hochgestellte und tiefgestellte Zeichen aufzuteilen. Beispielsweise führen die Eingaben catund horsezu Ausgaben, die von MathJax wie folgt dargestellt werden:

Bild der Katze gabelnd Bild des Pferdes gabelnd

Beachten Sie, dass nur eine Eingabe erforderlich ist - diese beiden werden nebeneinander aufgelistet, um vertikalen Platz zu sparen.

Markup bedeutet

  • _ kennzeichnet einen Index.
  • ^ kennzeichnet einen hochgestellten Text.
  • Um hochgestellte oder tiefgestellte Teilzeichenfolgen, die weitere hochgestellte oder tiefgestellte Zeichenfolgen enthalten, sind geschweifte Klammern erforderlich, um zu verhindern, dass sich alle auf derselben Ebene befinden.

Testfälle

Testfälle liegen im Format vor input : output. Der erste Testfall zeigt, dass die leere Zeichenfolge als Eingabe zu der leeren Zeichenfolge als Ausgabe führen soll.

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

Sie können sehen, wie diese gerendert werden, indem Sie die Ausgabe in mathurl.com einfügen .

Keine überflüssigen Klammern

MathJax rendert gerne Markups mit überflüssigen Klammern. Zum Beispiel wird im Folgenden alle identisch aussehen , wenn wiedergegeben: a, {a}, {}{a}, {{{{a}}}}.

Eine gültige Ausgabe für diese Abfrage enthält jedoch keine redundanten Klammern. Beachten Sie insbesondere, dass einzelne Zeichen in der Ausgabe nicht von geschweiften Klammern umgeben sind.

Bestellung

Die Reihenfolge von tiefgestellt und hochgestellt ist unwichtig. Die folgenden Angaben sind äquivalent und können beim Rendern nicht unterschieden werden (und sind alle gleichermaßen gültige Ausgaben):

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}

Wertung

Für jede Sprache ist der Gewinner der kürzeste Code in Bytes.

Zu viele Benachrichtigungen? Geben Sie </sub>auf unsubscript

Trichoplax
quelle
Zu viele Benachrichtigungen? Tippe </sub>auf abmelden huh wer hat gesagt ich möchte abmelden oder so? Es war ein Test, um zu sehen, ob ich den ganzen Beitrag richtig gelesen habe?
Erik der Outgolfer
12
@EriktheOutgolfer nein es war nur ein sehr schlechter witz.
Trichoplax
Können wir stattdessen nur das kompilierte PDF-Ergebnis ausgeben? Ich möchte eine reine Latexantwort schreiben.
Weizen-Assistent
@ WheatWizard das klingt nach einer anderen Herausforderung. Es wäre hier nicht als Antwort gültig.
Trichoplax

Antworten:

10

Python, 95 90 86 92 82 Bytes

10 Bytes gespart dank @ConnerJohnston

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

Probieren Sie es online!

Uriel
quelle
4
Wow, das ist eine verrückte Rekursion.
Mr. Xcoder
1
Einige Zeichenfolgenformatierungen für 81 Bytes (ich weiß nicht, wie ich Kommentare verlinken soll): f = lambda s: s und s [0] + '_ {0} ^ {0}'. Format (s [2:] und ' {'+ f (s [1:]) +'} 'oder s [1:] und s [1])
Conner Johnston
1
@ConnerJohnston danke! Sie können tio Links mit setzen [text](link), aber das ist wirklich verwöhnt;)
Uriel
1
79 Bytes ; und ich nehme an du willst den anonymen funktionstrick nicht nutzen, würde aber 2 bytes sparen.
Jonathan Frech
7

Mathematica, 72 84 77 76 Bytes

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

Verwendet die CP-1252-Codierung (Windows). Nimmt eine Liste von Zeichen als Eingabe.

Erläuterung

a_±b__:=

Definieren Sie die Funktion ±mit 2 oder mehr Argumenten. Beschriften Sie das erste Argument aund das zweite und weitere b.

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

Erstellen Sie ein ListÄquivalent zu "{a_±b^±b}"( ±bwird erneut rekursiv ausgewertet).

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

Definieren Sie die Funktion ±mit 1 oder 0 Argumenten. Beschriften Sie das erste Argument a, falls vorhanden, und weisen Sie es ""dem aanderen zu.

{"",a,""}

Erstellen Sie ein ListÄquivalent zu "a", aufgefüllt mit leeren Strings.

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

Eine reine Funktion, trifft ±auf den Eingang fällt erstes und letztes Element, und wandelt Listauf String.

JungHwan min
quelle
7

CJam (35 Bytes)

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

Dies ist ein volles Programm. Online-Demo .

3 Bytes umgehen einen Fehler im Interpreter (siehe unten).

Präparation

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

Beachten Sie, dass dies dazu min(n+1, 3)dient, einen Fehler im Interpreter zu umgehen: Es muss ein Muster in Potenzen von 10 geben, '}das kleiner ist als, aber es ist nicht offensichtlich .

Peter Taylor
quelle
Scheint für die leere Zeichenfolge nicht zu funktionieren (erster Testfall).
Trichoplax
1
@trichoplax, das lag an einem subtilen Unterschied zwischen GolfScript und CJam, der mich gelegentlich auffängt. Jetzt auf Kosten von nur einem Byte behoben, indem der Code weitaus schlauer gemacht wurde als zuvor.
Peter Taylor
Funktioniert jetzt perfekt. Tolle Erklärung.
Trichoplax
@PeterTaylor (Zumindest in der Online-Demo) Es funktioniert nicht für Wörter mit mehr als vier Buchstaben.
Dessert
2
@dessert, das ist sehr seltsam und verdient definitiv einen Bugreport gegen den Interpreter. Ich habe eine Problemumgehung für 3 Byte hinzugefügt.
Peter Taylor
7

JavaScript (ES6), 57-55 Byte

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

Θ (len (s)) Komplexität! Laut @PeterTaylor ist dies tatsächlich Θ (2 ^ len (s)), was immer noch das bestmögliche ist ...

ETHproductions
quelle
Scheint für die leere Zeichenfolge nicht zu funktionieren (erster Testfall).
Trichoplax
@trichoplax Sollte jetzt behoben sein.
ETHproductions
Funktioniert jetzt perfekt.
Trichoplax
1
Was ist n in deinem O (n)? Ich nehme an, es ist die Länge der Ausgabe, aber es sei denn, Sie geben an, dass es standardmäßig als Länge der Eingabe interpretiert wird, und da die Länge der Ausgabe exponentiell zur Länge der Eingabe ist, ist es unmöglich, sie in Polynomzeit zu implementieren.
Peter Taylor
@PeterTaylor Ich hatte gedacht, dass, da der Algorithmus nur len (Eingabe-) Schritte ausführt, die Komplexität len ​​(Eingabe-) ist ... wenn das nicht korrekt ist, entferne ich es einfach aus dem Beitrag, da ich nicht weiß, wie um es zu berechnen, es sei denn, Sie wissen, was die richtige Komplexität ist.
ETHproductions
6

Haskell , 71 Bytes

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

Probieren Sie es online!

Wenn wir nur gültigen Code ausgeben müssten, würde das folgende für 44 Bytes funktionieren:

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

Probieren Sie es online!

Weizen-Assistent
quelle
2
-5 Byte, basierend auf der 44-Byte-Version: Probieren Sie es online aus!
jferard
@jferard Schön! Ich werde das dem Beitrag hinzufügen.
Weizen-Zauberer
66 Bytes: Probieren Sie es online!
Laikoni
63 Bytes: Probieren Sie es online!
Laikoni,
59 Bytes: Probieren Sie es online!
Laikoni,
5

SOGL V0.12 , 21 Bytes

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

Probieren Sie es hier aus!

Erläuterung:

±                      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
quelle
5

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

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

Probieren Sie es online!

Wie?

Die Ersetzung in der while-Bedingung unterbricht das Auftreten mehrerer Buchstaben im ersten Buchstaben, gefolgt vom Rest in geschweiften Klammern wie folgt:

abc -> a_{bc}^{bc}

Die while-Schleife führt die Ersetzung durch, bis keine Mehrbuchstabenfolgen mehr übrig sind. Durch die Ersetzung innerhalb der Schleife werden Klammern um einzelne Buchstaben entfernt.

Xcali
quelle
Schön, ich habe mich gefragt, wie lange es dauern würde, bis eine Regex-Antwort auftaucht
Nnnes
4

Ruby , 76 73 72 68 67 57 Bytes

Die Verwendung von Lambda spart dank Tutleman 4 Byte

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

Probieren Sie es online!

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
Nnnes
quelle
Verwenden Sie anstelle einer Funktion ein anonymes Lambda (z. B. ->s{...}), das 7 Byte einspart. Dann können Sie 2 weitere Bytes speichern durch Ersetzen "#{s[0]}_mit s[0]+"_. Sie können ein weiteres Byte speichern, indem '{}'Sie bei der ersten Verwendung einer Variablen eine Inline-Zuordnung vornehmen .
Tutleman
@Tutleman Es ist rekursiv ( t=f s[1..-1]), daher glaube ich nicht, dass eine anonyme Funktion funktioniert, und ich habe den Anfang der Zeichenfolge bereits neu angeordnet, kann aber die Inline-Zuweisung verwenden.
Nnnes
1
D'oh! Whoops - ich kann nicht glauben, dass ich das verpasst habe. Trotzdem ist es immer noch kürzer, ein (benanntes) Lambda zu verwenden: f=->s{...}Spart 4 Bytes und berücksichtigt sogar die zusätzlichen Daten, die []Sie für den rekursiven Aufruf benötigen.
Tutleman
@Tutleman Oh ja, hat es geändert. Nun, wenn ich etwas Besseres als dieses .trDurcheinander finden kann ...
Nnnes
1

Pyth , 47 Bytes

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

Probieren Sie es online!

Dies ist so ziemlich ein direkter Port von @ Uriels Python-Antwort. Ich gehe gleich Golf spielen.

Arnold Palmer
quelle
1

PHP, 121 Bytes

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

Die Funktion selbst hat 104 Bytes und zeigt einen PHP-Hinweis.

jstnthms
quelle
1

Retina , 43 Bytes

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

Probieren Sie es online! Link enthält Testfälle. Erläuterung:

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

Bringe den Ball ins Rollen, indem du den letzten Charakter abschneidest. (Aber wenn es der einzige Charakter ist, lassen sie es in Ruhe.)

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

Bewegen Sie das Zeichen ¶ schrittweise zurück, wobei Sie jeweils das vorherige Ergebnis als tiefgestellten und hochgestellten Wert des nächsten Zeichens verwenden.

¶{|}$

Entfernen Sie die jetzt redundanten ¶ und die äußeren {} s.

Neil
quelle
0

Javascript, 73 Bytes

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

Erläuterung

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

Da es keinen angegebenen Anfangswert von gibt m, reduceRightwird das letzte Element von sals Anfangswert verwendet und die Iteration beginnt bei Index s.length-2.

asgallant
quelle
s=>[...s].reduceRight((m,c)=>`{${c}_${m}^${m}}`).slice(1,-1)ist nur 60 Bytes.
Neil
Scheint für die leere Zeichenfolge nicht zu funktionieren (erster Testfall).
Trichoplax