ЭТО… ЭТО… КРЕПОСТЬ!

11

Fortress был языком, разрабатываемым исследовательской группой Sun Programming Language Research Group (RIP Fortress), у которого было уникальное свойство: можно было отображать («укреплять») программы в разных стилях шрифтов (например, полужирный шрифт, полужирный, курсив, римский и т. д.). Цель состоит в том, чтобы представить переменную Fortress с одним символом в разметке HTML.

Вот как работает обогащение переменных с одним символом (упрощено / изменено из документации для целей игры в код):

  • Если переменная повторяется с большой буквы (то есть ZZ), она становится отформатированной в доске жирным шрифтом ( 𝔸𝔹ℂ𝔻𝔼𝔽𝔾ℍ𝕀𝕁𝕂𝕃𝕄ℕ𝕆ℙℚℝ𝕊𝕋𝕌𝕍𝕎𝕏𝕐ℤ)
  • Если перед переменной стоит знак подчеркивания, она отображается римским шрифтом (оставлена ​​одна)
  • Если за переменной следует подчеркивание, она отображается жирным шрифтом ( <b>v </b>)
  • Если переменной не предшествует и не следует подчеркивание, переменная отображается курсивом ( <i>v </i>)
  • В кодовые части доски жирным шрифтом , являются: 𝔸: 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. Каждый из них считается одним байтом в вашей программе (если ваш язык может вообще обрабатывать эти символы)

Входными данными будут либо повторяющиеся заглавные буквы ASCII, либо одна буква ASCII без подчеркивания, начального или конечного подчеркивания (AKA _a_не будет вводом). Это код-гольф, поэтому выигрывает меньшее количество байтов!

Тестовые случаи:

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

Ссылки: Спецификация , Прямая загрузка версии 0.1 альфа .

Ссылочная реализация (это будет в Fortress, но Fortress не нравится большинство двойных символов, поэтому эта реализация в 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>");
}
Zachary
источник
Я забыл удалить их, ссылка в песочнице: codegolf.meta.stackexchange.com/a/13383/55550
Захари
Являются ли единственные заглавные переменные двойными повторяемыми, а единственные строчные - остальные три?
Джонатан Аллан
Прописные буквы могут быть обычными, курсивом и жирным шрифтом. Строчные не могут быть двойными.
Захари
_____не будет вход
Захари
Ох ... Значит мы конвертируем не строку символов, а один?
Волшебная Осьминог Урна

Ответы:

1

Желе , 73 байта

Оказывается, что неспособность использовать буквы BBB в коде довольно дорого.

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

Полная программа, принимающая один аргумент и печатающая результат.

Попробуйте онлайн! или посмотрите набор тестов .

Как?

Основной точкой входа является последняя строка кода («Основная ссылка»).

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
Джонатан Аллан
источник
Сбой при вводе ZZ.
Захари
О, это в другом месте в Юникоде? Странный выбор они сделали.
Джонатан Аллан
Ага, двойные C H N P Q Rи Zнаходятся в разных местах в юникоде.
Захари
(Прочтите пятый пункт)
Захари
LOL, весело видеть, как Jelly проваливается так!
Захари
4

Python 3,6, 159 131 128 байт

1 байт сохранен благодаря @ Zacharý

3 байта сохранены благодаря @ VаlueInk

28 байтов сохранено благодаря @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]=='_']

Попробуйте онлайн!

Уриэль
источник
len(s)<2 and=>len(s)<2and
Zacharý
Посмотрите на новое редактирование поста, 𝔸𝔹ℂ𝔻𝔼𝔽𝔾ℍ𝕀𝕁𝕂𝕃𝕄ℕ𝕆ℙℚℝ𝕊𝕋𝕌𝕍𝕎𝕏𝕐ℤ считайте по 1 байту каждый.
Захари
2

Рубин , 104 106 105 + 1 = 105 107 106 "байтов"

Вероятно, работает даже лучше в Retina. Использует -pфлаг.

-1 байт от Zacharý.

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

Попробуйте онлайн!

Значение чернил
источник
Вы забыли JJ, KK, LL, TT, UU, VVи WW. !! (Что, вероятно, поэтому MMдает )
Zacharý
@ Захари исправил.
Стоимость чернил
2
Я думаю, что вы можете сохранить байт, сделав 𝕊-𝕏𝕐 𝕊-𝕐.
Захари
Вы не обновили свою ссылку TIO для 1-байтового сохранения. Кроме того, это плохо работает в Retina, которая использует UTF-16 и поэтому не может преобразовать один AY в черный символ с двумя символами char16_t.
Нил
@ Нил ой. Исправлена ​​ссылка.
Value Ink
1

JavaScript, 97 символов

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

Почему у языка есть такие методы, как String.prototype.italicsи String.prototype.bold?

Благодаря Нейлу, сэкономьте 9 байт, используйте [...s]вместо s.match(/./u).

ТТГ
источник
Это ES6 или ES7?
Захари
uФлаг в RegExp является функцией ES6. String.prototype.italicsи String.prototype.boldтолько некоторые унаследованные особенности.
TSH
Я знал, что это ES6 ... потому что толстые стрелы.
Захари
замените «ES6» на «ES6 или ES7» в приведенном выше комментарии.
Захари
[...'𝔸𝔹ℂ𝔻𝔼𝔽𝔾ℍ𝕀𝕁𝕂𝕃𝕄ℕ𝕆ℙℚℝ𝕊𝕋𝕌𝕍𝕎𝕏𝕐ℤ']должен сэкономить вам несколько байтов.
Нил