ISTO ... É ... FORTRESS!

11

O Fortress era uma linguagem desenvolvida pelo Grupo de Pesquisa em Linguagens de Programação da Sun (RIP Fortress) que possuía uma propriedade exclusiva; era possível renderizar ("Fortify") programas em diferentes estilos de fonte (por exemplo, negrito, negrito, itálico, quadro-negro, romano etc.). O objetivo é representar uma variável Fortress de um caractere na marcação HTML.

Veja como a fortificação de variáveis ​​de um caractere funcionou (simplificada / modificada da documentação para fins de golfe com código):

  • Se a variável for um capital repetido (ou seja ZZ), ela será formatada em negrito ( 𝔸𝔹ℂ𝔻𝔼𝔽𝔾ℍ𝕀𝕁𝕂𝕃𝕄ℕ𝕆ℙℚℝ𝕊𝕋𝕌𝕍𝕎𝕏𝕐ℤ)
  • Se a variável for precedida por um sublinhado, a variável será renderizada em fonte romana (deixada em paz)
  • Se a variável for seguida por um sublinhado, a variável será renderizada em negrito ( <b>v </b>)
  • Se a variável não for precedida nem seguida por um sublinhado, a variável será renderizada em fonte itálica ( <i>v </i>)
  • Os pontos de código dos negritos do quadro-negro são:: 𝔸1D538,: 1D539 𝔹,: 2102 𝔻,: 1D53B,: 1D53C,: 1D53D 𝔼,: 𝔽1D53E 𝔾,: 210D 𝕀,: 𝕁1D540 𝕂,: 𝕃1D541 𝕄,: 1D542,: 1D543,: 1D544,: 2115, 𝕆: 1D546,: 2119 ,: 211A ,: 𝕊211D 𝕋,: 𝕌1D54A 𝕍,: 𝕎1D54B 𝕏,: 𝕐1D54C,: 1D54D,: 1D54E,: 1D54F,: 1D550,: 2124. Eles contam como um byte cada no seu programa (se o seu idioma de escolha puder lidar com esses caracteres)

A entrada será um capital ASCII repetido ou uma única letra ASCII sem sublinhado, sublinhado à esquerda ou sublinhado à direita (AKA _a_não será uma entrada). Isso é código-golfe, e a menor contagem de bytes ganha!

Casos de teste:

a => <i>a</i>
BB => 𝔹
c_ => <b>c</b>
_d => d
E => <i>E</i>
G_ => <b>G</b>
_H => H
ZZ => ℤ

Links: Especificação , Download direto da versão 0.1 alpha .

Implementação de referência (isso seria no Fortress, mas o Fortress não gosta da maioria dos caracteres de bloqueio duplo, portanto, essa implementação é em D):

dstring fortify(string arg) {
    import std.string, std.conv;

    alias D = to!dstring; //Convert to a string that accepts the unicode needed
    dstring BB = "𝔸𝔹ℂ𝔻𝔼𝔽𝔾ℍ𝕀𝕁𝕂𝕃𝕄ℕ𝕆ℙℚℝ𝕊𝕋𝕌𝕍𝕎𝕏𝕐ℤ"d; //blackboard bold capitals
    string UC = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //normal ASCII capitals

    if(arg.length == 1)
        return D("<i>" ~ arg ~ "</i>");
    if(arg[0] == a[1])
        return D(BB[UC.indexOf(arg[0])]);
    if(arg[0] == '_')
        return D(arg[1]);
    return D("<b>" ~ arg[0] ~ "</b>");
}
Zacharý
fonte
Eu esqueci de removê-los, link sandbox: codegolf.meta.stackexchange.com/a/13383/55550
Zacharý
As únicas variáveis ​​em maiúsculas são as repetidas em dobro e as únicas em minúsculas nos outros três?
27617 Jonathan Allan
Maiúsculas podem ser normal, itálico e negrito. Letras minúsculas não podem ser dobradas.
Zacharý
_____não será inserido.
Zacharý
Oh ... Então não é uma série de caracteres que estamos convertendo, apenas uma?
Magic Octopus Urn

Respostas:

1

Geléia , 73 bytes

Acontece que não poder usar as letras BBB no código é bastante caro.

5ŀ”i
“Ðñṡ’Dẋ@€“¡ḞḄ’ż“¿¿Æ€¢¬µ‘+⁽ø³F⁸ṪO¤+ị¥Ọ
Ṫ
Ḣ5ŀ”b
;j“<>/”ṃ@“¢ʠf’
i”_+LµĿ

Um programa completo tendo um argumento e imprimindo o resultado.

Experimente online! ou veja a suíte de testes .

Quão?

O ponto de entrada principal é a última linha de código ("Link principal").

5ŀ”i - Link 1: list of characters, s (length 1 & no underscore)
  ”i - literal character 'i'
5ŀ   - call link 5 as a dyad with s on the left and 'i' on the right

“Ðñṡ’Dẋ@€“¡ḞḄ’ż“¿¿Æ€¢¬µ‘+⁽ø³F⁸ṪO¤+ị¥Ọ - Link 2: list of characters, s (length 2 & no underscore)
“Ðñṡ’                                 - base 250 literal              1007245
     D                                - to decimal list               [1,0,0,7,2,4,5]
         “¡ḞḄ’                        - base 250 literal              111673
      ẋ@€                             - repeat with reversed @rguments for €ach -> [[111673],[],[],[111673,111673,111673,111673,111673,111673,111673],[111673,111673],[111673,111673,111673,111673],[111673,111673,111673,111673,111673]]
               “¿¿Æ€¢¬µ‘              - code page index list          [11,11,13,12,1,7,9]
              ż                       - zip together                  [[111673,11],[11],[13],[[111673,111673,111673,111673,111673,111673,111673],12],[[111673,111673],1],[[111673,111673,111673,111673],7],[[111673,111673,111673,111673,111673],9]]
                         ⁽ø³          - base 250 literal              8382
                        +             - addition (vectorises)         [[120055,8393],[8393],[8395],[[120055,120055,120055,120055,120055,120055,120055],8394],[[120055,120055],8383],[[120055,120055,120055,120055],8389],[[120055,120055,120055,120055,120055],8391]]
                            F         - flatten                       [120055,8393,8393,8395,120055,120055,120055,120055,120055,120055,120055,8394,120055,120055,8383,120055,120055,120055,120055,8389,120055,120055,120055,120055,120055,8391]
                                ¤     - nilad followed by link(s) as a nilad:                                                                                    ^
                             ⁸        -   chain's left argument, s  e.g.    "CC"                                                                                 |
                              Ṫ       -   tail (last character)             'C'                                                                                  |
                               O      -   cast to ordinal                   67                                                                                   |
                                   ¥  - last two links as a dyad:                                                                                                |
                                  ị   -   index into (1-indexed & modular)  8383 (this is at index 67%26=15 -----------------------------------------------------+ )
                                 +    -   add the ordinal                   8450
                                    Ọ - convert from ordinal to character   'ℂ'

Ṫ - Link 3: list of characters, s (length 2 & underscore at index 1)
Ṫ - tail (get the first character

Ḣ5ŀ”b - Link 4: list of characters, s (length 2 & underscore at index 2)
Ḣ     - head s (the non-_ character)
   ”b - literal character 'b'
 5ŀ   - call link 5 as a dyad with the non-_ character on the left and 'b' on the right

;j“<>/”ṃ@“¢ʠf’ - Link 5, wrap in a tag: element, tagName      e.g. 'a', 'i'
;              - concatenate the element with the tagName          "ai"
  “<>/”        - literal list of characters                        "<>/"
 j             - join                                              "a<>/i"
         “¢ʠf’ - base 250 literal                                  166603
       ṃ@      - base decompression with reversed @rguments
               -   "a<>/i" is 5 long, so 166603 is converted to
               -   base 5 [2,0,3,1,2,4,0,3] with digits "a<>/i"    "<i>a</i>"

i”_+LµĿ - Main link: list of characters, s (as specified only):
 ”_     - literal '_'
i       - index of '_' in s (1-indexed; 0 if not found)
    L   - length of s
   +    - addition
     µĿ - call link with that number as a monad with argument s
        - implicit print
Jonathan Allan
fonte
Falha na entrada ZZ.
Zacharý
Oh, isso está em um lugar diferente no Unicode? Escolha bizarra que eles fizeram.
Jonathan Allan
Sim, dê um duplo golpe C H N P Q Re Zesteja em lugares diferentes no unicode.
Zacharý
(Leia o quinto ponto)
Zacharý
LOL, é divertido ver Jelly fracassar assim!
Zacharý
4

Python 3.6, 159 131 128 bytes

1 byte salvo graças a @ Zacharý

3 bytes salvos graças a @ VаlueInk

28 bytes salvos graças a @Rod

lambda s:len(s)<2and f"<i>{s}</i>"or s[0]==s[1]and"𝔸𝔹ℂ𝔻𝔼𝔽𝔾ℍ𝕀𝕁𝕂𝕃𝕄ℕ𝕆ℙℚℝ𝕊𝕋𝕌𝕍𝕎𝕏𝕐ℤ"[ord(s[0])-65]or[f"<b>{s[0]}</b>",s[1]][s[0]=='_']

Experimente online!

Uriel
fonte
len(s)<2 and=>len(s)<2and
Zacharý
Observe a nova edição da postagem, conte como 1 byte cada.
Zacharý
2

Ruby , 104 106 105 + 1 = 105 107 106 "bytes"

Provavelmente funciona ainda melhor na Retina. Usa -psinalizador.

-1 byte de Zacharý.

gsub /^.$/,'<i>\0</i>'
gsub(/(.)\1/){$1.tr"A-Z","𝔸𝔹ℂ𝔻-𝔾ℍ𝕀-𝕄ℕ𝕆ℙℚℝ𝕊-𝕐ℤ"}
gsub /(.)_/,'<b>\1</b>'
gsub ?_,''

Experimente online!

Value Ink
fonte
Você esqueceu JJ, KK, LL, TT, UU, VVe WW. !! (Que é provavelmente por isso que MM)
Zachary
@ Zacharý corrigido.
Value Ink
2
Eu acho que você pode salvar um byte fazendo 𝕊-𝕏𝕐 𝕊-𝕐.
Zacharý
Você não atualizou seu link TIO para economizar 1 byte. Além disso, isso falha muito na Retina, que usa UTF-16 e, portanto, não pode converter um único AY em um caractere preto com dois caracteres de 16 caracteres.
Neil
@Neil oops. Link fixo.
Value Ink
1

JavaScript, 97 caracteres

([a,b])=>a==b?[...'𝔸𝔹ℂ𝔻𝔼𝔽𝔾ℍ𝕀𝕁𝕂𝕃𝕄ℕ𝕆ℙℚℝ𝕊𝕋𝕌𝕍𝕎𝕏𝕐ℤ'][a.charCodeAt()-65]:b?b=='_'?a.bold():b:a.italics()

Por que uma linguagem tem métodos como String.prototype.italicse String.prototype.bold?

Graças a Neil, salve 9 bytes, use em [...s]vez de s.match(/./u).

tsh
fonte
É ES6 ou ES7?
Zacharý
uO sinalizador no RegExp é o recurso ES6. String.prototype.italicse String.prototype.boldsão apenas alguns recursos herdados.
tsh 27/07
Eu sabia que era ES6 ... porque flechas gordas.
Zacharý
altere "ES6" para "ES6 ou ES7" no comentário acima.
Zacharý
[...'𝔸𝔹ℂ𝔻𝔼𝔽𝔾ℍ𝕀𝕁𝕂𝕃𝕄ℕ𝕆ℙℚℝ𝕊𝕋𝕌𝕍𝕎𝕏𝕐ℤ']você deve economizar alguns bytes.
Neil