Texte bifurqué

26

Étant donné une chaîne de lettres ASCII (majuscules et / ou minuscules), affichez le MathJax brut requis pour afficher cette chaîne bifurquant à chaque caractère, en exposants et indices. Par exemple, les entrées catet horseentraîneraient des sorties que MathJax rend respectivement comme suit:

image de chat bifurquant image de cheval bifurquant

Notez qu'une seule entrée est nécessaire pour être prise - ces deux sont listées côte à côte simplement pour économiser de l'espace vertical.

Signification du balisage

  • _ indique un indice.
  • ^ indique un exposant.
  • Des accolades sont requises autour des sous-chaînes en exposant ou en indice qui contiennent d'autres exposants ou indices afin d'éviter qu'ils ne soient tous au même niveau.

Cas de test

Les cas de test sont au format input : output. Le premier cas de test montre la chaîne vide en entrée devrait entraîner la chaîne vide en sortie.

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

Vous pouvez voir comment ils sont rendus en collant la sortie dans mathurl.com .

Aucun appareil dentaire redondant

MathJax rendra avec plaisir le balisage qui a des accolades redondantes. Par exemple, ce qui suit tous semblent identiques lorsqu'ils sont rendus: a, {a}, {}{a}, {{{{a}}}}.

Cependant, une sortie valide pour ce défi n'a pas d'accolades redondantes. Notez en particulier que les caractères uniques dans la sortie ne sont pas entourés d'accolades.

Ordre

L'ordre des indices et des exposants est sans importance. Les éléments suivants sont équivalents et ne peuvent être distingués lors du rendu (et sont tous des résultats également valides):

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}

Notation

Pour chaque langue, le gagnant est le code le plus court en octets.

Trop de notifications? Tapez </sub>pour vous désinscrire

trichoplax
la source
Trop de notifications? Tapez </sub>pour vous désinscrire hein qui a dit que je veux me désinscrire ou quelque chose? C'était un test pour voir si j'ai lu le post en entier, non?
Erik the Outgolfer
12
@EriktheOutgolfer non, c'était juste une très mauvaise blague.
trichoplax
Pouvons-nous simplement produire le résultat pdf compilé à la place? Je voudrais écrire une réponse en latex pur.
Wheat Wizard
@WheatWizard qui ressemble à un défi différent. Ce ne serait pas valable comme réponse ici.
trichoplax

Réponses:

10

Python, 95 90 86 92 82 octets

10 octets économisés grâce à @ConnerJohnston

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

Essayez-le en ligne!

Uriel
la source
4
Wow, c'est une récursion folle.
M. Xcoder
1
Formatage de chaîne pour 81 octets (vous ne savez pas encore comment lier TIO dans les commentaires): f = lambda s: s et s [0] + '_ {0} ^ {0}'. Format (s [2:] et ' {'+ f (s [1:]) +'} 'ou s [1:] et s [1])
Conner Johnston
1
@ConnerJohnston merci! vous pouvez mettre des liens avec tio [text](link), mais c'est vraiment gâché;)
Uriel
1
79 octets ; et je suppose que vous ne voulez pas utiliser l'astuce de fonction anonyme, mais économisez 2 octets.
Jonathan Frech
7

Mathematica, 72 84 77 76 octets

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

Utilise le codage CP-1252 (Windows). Prend une liste de caractères en entrée.

Explication

a_±b__:=

Définissez la fonction ±, avec 2 arguments ou plus. Étiquetez le premier argument a, le deuxième et le suivant b.

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

Créez un Listéquivalent à "{a_±b^±b}"( ±best évalué à nouveau, récursivement).

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

Définissez la fonction ±, avec 1 ou 0 arguments. Étiquetez le premier argument a, s'il existe, et affectez- ""le aautrement.

{"",a,""}

Créez un Listéquivalent à "a", rempli de Strings vides .

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

Une fonction pure qui s'applique ±à l'entrée, supprime le premier et le dernier élément et se convertit Listen String.

JungHwan Min
la source
7

CJam (35 octets)

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

Ceci est un programme complet. Démo en ligne .

3 octets contournent un bug dans l'interpréteur (voir ci-dessous).

Dissection

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

Notez que min(n+1, 3)c'est pour contourner un bug dans l'interpréteur: il doit y avoir un modèle dans les puissances de 10 qui '}soit plus petit que, mais ce n'est pas évident .

Peter Taylor
la source
Ne semble pas fonctionner pour la chaîne vide (premier cas de test).
trichoplax
1
@trichoplax, cela était dû à une subtile différence entre GolfScript et CJam qui m'attrape parfois. Désormais corrigé au prix d'un seul octet en rendant le code beaucoup plus intelligent qu'il ne l'était auparavant.
Peter Taylor
Fonctionne parfaitement maintenant. Grande explication.
trichoplax
@PeterTaylor (au moins dans la démo en ligne) Cela ne fonctionne pas pour les mots de plus de quatre lettres.
dessert du
2
@dessert, c'est très bizarre, et mérite certainement un rapport de bogue contre l'interprète. J'ai ajouté une solution de contournement au coût de 3 octets.
Peter Taylor
7

JavaScript (ES6), 57 55 octets

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

Complexity (len (s)) complexité! Selon @PeterTaylor, il s'agit en fait de Θ (2 ^ len (s)), ce qui est toujours le meilleur possible ...

ETHproductions
la source
Ne semble pas fonctionner pour la chaîne vide (premier cas de test).
trichoplax
@trichoplax devrait être corrigé maintenant.
ETHproductions
Fonctionne parfaitement maintenant.
trichoplax
1
Qu'est-ce que n dans votre O (n)? Je suppose que c'est la longueur de la sortie, mais à moins que vous ne déclariez qu'elle est interprétée par défaut comme étant la longueur de l'entrée, et puisque la longueur de la sortie est exponentielle dans la longueur de l'entrée, il est impossible de l'implémenter en temps polynomial.
Peter Taylor
@PeterTaylor J'avais pensé que puisque l'algorithme ne prend que len (entrée) étapes, que la complexité est len ​​(entrée) ... si ce n'est pas correct, je vais juste le retirer du post car je ne sais pas comment pour le calculer, sauf si vous savez quelle est la complexité correcte.
ETHproductions
6

Haskell , 71 octets

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

Essayez-le en ligne!

Si nous devions simplement sortir du code valide, ce qui suit fonctionnerait pour 44 octets:

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

Essayez-le en ligne!

Assistant de blé
la source
2
-5 octets, basé sur la version 44 octets: Essayez-le en ligne!
jferard
@jferard Nice! Je vais ajouter cela au message.
Wheat Wizard
66 octets: essayez-le en ligne!
Laikoni
63 octets: essayez-le en ligne!
Laikoni
59 octets: essayez-le en ligne!
Laikoni du
5

SOGL V0.12 , 21 octets

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

Essayez-le ici!

Explication:

±                      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
la source
5

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

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

Essayez-le en ligne!

Comment?

La substitution dans la condition while rompt les occurrences de plusieurs lettres dans la première lettre, suivies du reste entre accolades comme ceci:

abc -> a_{bc}^{bc}

La boucle while exécute la substitution jusqu'à ce qu'il ne reste plus de séquences de plusieurs lettres. La substitution à l'intérieur de la boucle supprime les accolades autour des lettres simples.

Xcali
la source
Bien, je me demandais combien de temps il faudrait pour qu'une réponse
régulière apparaisse
4

Rubis , 76 73 72 68 67 57 octets

Utilisation de lambda économisant 4 octets grâce à Tutleman

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

Essayez-le en ligne!

Non golfé:

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
la source
Au lieu d'une fonction, utilisez un lambda anonyme (par exemple ->s{...}), qui économise 7 octets. Ensuite, vous pouvez enregistrer 2 octets supplémentaires en remplaçant "#{s[0]}_par s[0]+"_. Vous pouvez enregistrer un octet supplémentaire en effectuant l'affectation en ligne de '{}'à une variable la première fois que vous l'utilisez.
Tutleman
@Tutleman C'est récursif ( t=f s[1..-1]), donc je ne pense pas qu'une fonction anonyme fonctionnera, et j'ai déjà réorganisé le début de la chaîne, mais je peux utiliser l'affectation en ligne.
Nnnes
1
Oh! Oups - je ne peux pas croire que j'ai raté ça. Quoi qu'il en soit, il est encore plus court d'utiliser un lambda (nommé): f=->s{...}économise 4 octets, même en tenant compte du supplément dont []vous avez besoin lors de l'appel récursif.
Tutleman
@Tutleman Oh ouais, ça a changé. Maintenant, si je peux trouver quelque chose de mieux que ce .trgâchis ...
Nnnes
1

Pyth , 47 octets

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

Essayez-le en ligne!

C'est à peu près un port direct de la réponse Python de @ Uriel. Aller jouer au golf un peu plus tard.

Arnold Palmer
la source
1

PHP, 121 octets

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

La fonction elle-même fait 104 octets et affiche un avis PHP.

jstnthms
la source
1

Rétine , 43 octets

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

Essayez-le en ligne! Le lien inclut des cas de test. Explication:

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

Faites rouler la balle en coupant le dernier personnage. (Mais si c'est le seul personnage, laissez-le tranquille.)

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

Reculez le caractère ¶ d'une étape à la fois, en prenant à chaque fois le résultat précédent et en faisant un indice et un exposant du caractère suivant.

¶{|}$

Supprimez le ¶ désormais redondant et les {} s externes.

Neil
la source
0

Javascript, 73 octets

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

Explication

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

Parce qu'il n'y a pas de valeur initiale spécifiée de m, reduceRightprend le dernier élément de scomme valeur initiale et commence l'itération à l'index s.length-2.

impitoyable
la source
s=>[...s].reduceRight((m,c)=>`{${c}_${m}^${m}}`).slice(1,-1)n'est que de 60 octets.
Neil
Ne semble pas fonctionner pour la chaîne vide (premier cas de test).
trichoplax