QUESTO ... È ... FORTEZZA!


11

Fortress era un linguaggio sviluppato dal Sun Programming Language Research Group (RIP Fortress) che aveva una proprietà unica, era possibile rendere ("fortificare") programmi in diversi stili di carattere (lavagna, grassetto, grassetto, corsivo, romano, ecc.). L'obiettivo è rappresentare una variabile Fortress a un carattere nel markup HTML.

Ecco come ha funzionato la fortificazione delle variabili a un carattere (semplificata / modificata dalla documentazione ai fini del code-golf):

  • Se la variabile è una maiuscola ripetuta (cioè ZZ), viene formattata in grassetto lavagna ( 𝔸𝔹ℂ𝔻𝔼𝔽𝔾ℍ𝕀𝕁𝕂𝕃𝕄ℕ𝕆ℙℚℝ𝕊𝕋𝕌𝕍𝕎𝕏𝕐ℤ)
  • Se la variabile è preceduta da un trattino basso, la variabile viene visualizzata in caratteri romani (lasciata sola)
  • Se la variabile è seguita da un trattino basso, la variabile viene visualizzata in grassetto ( <b>v </b>)
  • Se la variabile non è né preceduta né seguita da un trattino basso, la variabile viene visualizzata in corsivo ( <i>v </i>)
  • I punti di codice dei grassetti della lavagna sono:: 𝔸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. Questi contano come un byte ciascuno nel tuo programma (se la tua lingua preferita può gestire questi caratteri)

L'input sarà una capitale ASCII ripetuta o una singola lettera ASCII senza carattere di sottolineatura, un carattere di sottolineatura iniziale o un carattere di sottolineatura finale (AKA _a_non sarà un input). Questo è code-golf, quindi vince il conteggio di byte più basso!

Casi test:

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

Collegamenti: specifica , download diretto della versione 0.1 alfa .

Implementazione di riferimento (questo sarebbe in Fortezza, ma a Fortezza non piace la maggior parte dei personaggi duplicati, quindi questa implementazione è in 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>");
}

Ho dimenticato di rimuoverli, collegamento sandbox: codegolf.meta.stackexchange.com/a/13383/55550
Zacharý

Le uniche variabili maiuscole sono le doppie ripetute e le uniche minuscole sono le altre tre?
Jonathan Allan,

Le lettere maiuscole possono essere normali, in corsivo e in grassetto. Le lettere minuscole non possono essere duplicate.
Zacharý,

_____non verrà inserito.
Zacharý,

Oh ... Quindi non è una serie di personaggi che stiamo convertendo, solo uno singolo?
Magic Octopus Urn il

Risposte:


1

Gelatina , 73 byte

Si scopre che non poter usare le lettere BBB nel codice è piuttosto costoso.

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

Un programma completo che prende un argomento e stampa il risultato.

Provalo online! o vedi la suite di test .

Come?

Il punto di ingresso principale è l'ultima riga di codice ("Link principale").

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

Errore sull'input ZZ.
Zacharý,

Oh, è in un posto diverso in Unicode? Hanno fatto una scelta bizzarra.
Jonathan Allan,

Sì, doublestruck C H N P Q Re Zsono in diversi punti in Unicode.
Zacharý,

(Leggi il quinto punto
elenco

LOL, è divertente vedere Jelly flop in quel modo!
Zacharý,

4

Python 3.6, 159 131 128 byte

1 byte salvato grazie a @ Zacharý

3 byte salvati grazie a @ VаlueInk

28 byte salvati grazie 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]=='_']

Provalo online!


len(s)<2 and=>len(s)<2and
Zacharý,

Guarda la nuova modifica per il post, 𝔸𝔹ℂ𝔻𝔼𝔽𝔾ℍ𝕀𝕁𝕂𝕃𝕄ℕ𝕆ℙℚℝ𝕊𝕋𝕌𝕍𝕎𝕏𝕐ℤ conta come 1 byte ciascuno.
Zacharý,


2

Rubino , 104 106 105 + 1 = 105 107 106 "byte"

Probabilmente funziona ancora meglio in Retina. Usa la -pbandiera.

-1 byte da Zacharý.

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

Provalo online!


Si è dimenticato JJ, KK, LL, TT, UU, VVe WW. !! (Probabilmente è per questo che MM)
Zacharý

@ Zacharý riparato.
Value Ink

2
Penso che puoi salvare un byte facendo 𝕊-𝕏𝕐 𝕊-𝕐.
Zacharý,

Non hai aggiornato il tuo link TIO per il salvataggio di 1 byte. Inoltre, ciò fallisce gravemente in Retina che utilizza UTF-16 e quindi non può tradurre un singolo AY in un carattere blackbold da due caratteri.
Neil,

@Neil oops. Collegamento fisso.
Value Ink

1

JavaScript, 97 caratteri

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

Perché una lingua ha metodi come String.prototype.italicse String.prototype.bold?

Grazie a Neil, salva 9 byte, usa [...s]invece di s.match(/./u).


È ES6 o ES7?
Zacharý,

uflag in RegExp è la funzione ES6. String.prototype.italicse String.prototype.boldsono solo alcune funzionalità legacy.
TSH

Sapevo che era ES6 ... perché frecce grasse.
Zacharý,

cambia "ES6" in "ES6 o ES7" nel commento sopra.
Zacharý,

[...'𝔸𝔹ℂ𝔻𝔼𝔽𝔾ℍ𝕀𝕁𝕂𝕃𝕄ℕ𝕆ℙℚℝ𝕊𝕋𝕌𝕍𝕎𝕏𝕐ℤ']dovrebbe salvarti alcuni byte.
Neil,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.