𝗠𝗮𝘁𝗵 𝖲𝖺𝗇𝗌 𝗔𝗹𝘁𝗲𝗿𝗻𝗮𝘁𝗼𝗿


28

Введение

Попробуйте преобразовать слова в два разных шрифта Unicode.

Вызов

Ваша задача - преобразовать входную строку в символы Unicode 𝖬𝖺𝗍𝗁 𝖲𝖺𝗇𝗌 и 𝗠𝗮𝘁𝗵 𝗦𝗮𝗻𝘀 𝗕𝗼𝗹𝗱.

Все заглавные слова должны стать строчными 𝗠𝗮𝘁𝗵 𝗦𝗮𝗻𝘀 𝗕𝗼𝗹𝗱 словами.

  • Например: WORD->𝘄𝗼𝗿𝗱

Все строчные слова должны стать 𝖲𝖺𝗇𝗌 𝖲𝖺𝗇𝗌 словами

  • Например: other words->𝗈𝗍𝗁𝖾𝗋 𝗐𝗈𝗋𝖽𝗌

Все слова в смешанном регистре должны остаться без изменений

  • Например: Mixed Case Words->Mixed Case Words

Периоды и пробелы должны оставаться неизменными.

Слова разделены пробелами или точками

  • Например (выделенные вещи являются словами):

Hello, This is a word, S, O,are these

  • Входные данные: строка, содержащая буквы, пробелы и точки ( [A-Za-z .]+)
  • Вывод: отформатированная строка

Поскольку это задача игры в гольф, выигрывает самое маленькое количество байтов

Пример ввода и вывода

Входные данные:

Это пример STRING, который МОЖЕТ быть ВХОДЯЩИМ. Может содержать несколько предложений.

Выход:

Это 𝗂𝗌 𝖺𝗇 𝖾𝗑𝖺𝗆𝗉𝗅𝖾 𝘀𝘁𝗿𝗶𝗻𝗴 𝗍𝗁𝖺𝗍 𝖼.𝗈.𝘂.𝗹.𝖽. 𝗶𝗻𝗽𝘂𝘁𝘁𝗲𝗱 𝗶𝗻𝗽𝘂𝘁𝘁𝗲𝗱. Это 𝖼𝖺𝗇 𝗰𝗼𝗻𝘁𝗮𝗶𝗻 𝗆𝗎𝗅𝗍𝗂𝗉𝗅𝖾 𝗌𝖾𝗇𝗍𝖾𝗇𝖼𝖾𝗌.

Ссылка

Математика без жирного шрифта: 𝗮𝗯𝗰𝗱𝗲𝗳𝗴𝗵𝗶𝗷𝗸𝗹𝗺𝗻𝗼𝗽𝗾𝗿𝘀𝘁𝘂𝘃𝘄𝘅𝘆𝘇 (символы с 120302 по 120327)

Math Sans: 𝖺𝖻𝖼𝖽𝖾𝖿𝗀𝗁𝗂𝗃𝗄𝗅𝗆𝗇𝗈𝗉𝗊𝗋𝗌𝗍𝗎𝗏𝗐𝗑𝗒𝗓 (символы с 120250 по 120275)


3
Добро пожаловать в PPCG!
Лайкони

6
Just Философия просто 𝗆𝖺𝗍𝗁 𝗌𝖺𝗇𝗌 строгость, смысл и практичность ...
Es

13
Вау! Вы получили название, выделенное жирным шрифтом на боковой панели? Какая? Я ... не понимаю .... интернет ломается? Были ли вы нарушили интернет?
Zizouz212

26
i.stack.imgur.com/R4V3C.png Я пришел сюда, думая, что задача состоит в том, чтобы сложить коробки, гистограммы или что-то ...
Matteo Italia

8
Это не должно было быть забито. Эта проблема значительно сложнее, чем простая транслитерация символов. Главный ответ в указанном вызове не может быть легко и конкурентно перенесен с помощью того же метода (правда, моя сетчатка не очень хорошая)
Конор О'Брайен

Ответы:


10

QuadR , 45 43 байта

-2 благодаря нгн.

\w+
UCS a+(2>≢b120153+84×⊃b←∪96>a←⎕UCSM

Поскольку TIO скремблирует вывод Unicode из QuadR, ниже приведен скриншот использования QuadR в качестве библиотеки APL в интерактивном сеансе: интерактивная стенограмма сессии


\w+ заменить слова результатом применения к ним следующего кода:

⍵M найденное слово U niversal С haracter S и др код точки этого  магазина , что в  0 или 1 для того , 96 больше , чем каждый из этих  берут только уникальный; или или или  запомните это, чтобы  выбрать первое из этого  умножения 84 с этим  добавлением 120153 к этому …  умножьте следующее с этим:  счет (длина) ( если единичный случай, если смешанный случай)  0 или 1 для того, если два является больше, чем это ( если один случай, если смешанный случай)  оригинальные кодовые точки, добавленные к этому
⎕UCS
a←a
96>
[0][1][0,1][1,0]
b←b

84×
120153+
(
≢bb12
2>10
a+
⎕UCS преобразовать полученный код обратно в символы


9

APL (Dyalog Unicode) , 63 57 53 байта

-6 спасибо Эрику Аутгольферу. -4 благодаря нгн.

Функция анонимного молчаливого префикса.

'\w+'R{⎕UCS a+(2>≢b120153+84×⊃b←∪96>a←⎕UCS⍵.Match}

Так как TIO скремблирует вывод Unicode из Dyalog APL, вот скриншот кода в действии:

код в действии


'\w+'⎕R PCRE R заменить слова с результатом применения следующего ...

{... } анонимная лямбда:

⍵.Match найденное слово

⎕UCSU niversal С haracter S и др код точки , что

a← хранить это в a

96> 0 или 1, если 96 больше, чем каждый из

 взять только уникальное; [0]или [1]или [0,1]или[1,0]

b← хранить это в b

 выбрать первое из этого

84× умножить 84 с этим

120153+ добавить к этому 120153

(...  умножьте на это следующее:

  ≢b подсчет (длина) b( 1если один случай, 2если смешанный случай)

  2> 0 или 1 для того, является ли два больше, чем это ( 1если один случай, 0если смешанный случай)

a+ оригинальные кодовые точки добавлены к этому

⎕UCS преобразовать полученный код обратно в символы


57 байтов:'\b([A-Z]+|[a-z]+)\b'⎕R{⎕UCS(⎕UCS+120153+84×∊∘⎕A)⍵.Match}
Эрик Outgolfer

@EriktheOutgolfer Спасибо. Почему я не думал о том, чтобы молчать
Адам

Я не знаю, но это случается со мной, когда я устал. :)
Эрик Outgolfer

@EriktheOutgolfer На самом деле, я думаю, что я написал это из дома, используя компьютер моей жены без раскладки клавиатуры APL ...
Adám

@ Adám это регулярное выражение слишком длинное; Вам лучше использовать \w+и вычислить сумму, добавляемую к '\w+'⎕R{⎕UCS a+(2>≢b)×120153+84×⊃b←∪96>a←⎕UCS⍵.Match}
кодовым точкам

8

Чистый , 268 265 232 224 байта

В качестве аккуратного бонуса, это работает со строками, содержащими любого персонажа. Включая нули.

import StdLib,StdInt,StdBool,Text.Unicode,Text.Unicode.UChar
u=isUpper
l=isAlpha
$c|l c=fromInt(toInt c+120153+if(u c)84 0)=c
?[h,s:t]=[if(u h<>isLower s)($c)c\\c<-[h,s:t]]
?[h]=[$h]
@s=[y\\x<-groupBy(\a b=l a&&l b)s,y<- ?x]

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

Определяет функцию @, принимая UStringи возвращаяUString


3
Это тоже чистый бонус? : D
Конор О'Брайен

6

C, 292 символа, 448 байтов (в UTF-8)

char*t;s,i,k;p(l){for(l=s=*t/96,i=k=strlen(t);i--;)t[i]/96-s&&++l;for(l=l-s&&write(1,t,k);!l&++i<k;)write(1,s?"𝖺𝖻𝖼𝖽𝖾𝖿𝗀𝗁𝗂𝗃𝗄𝗅𝗆𝗇𝗈𝗉𝗊𝗋𝗌𝗍𝗎𝗏𝗐𝗑𝗒𝗓"+t[i]*4-388:"𝗮𝗯𝗰𝗱𝗲𝗳𝗴𝗵𝗶𝗷𝗸𝗹𝗺𝗻𝗼𝗽𝗾𝗿𝘀𝘁𝘂𝘃𝘄𝘅𝘆𝘇"+t[i]*4-260,4);}f(char*s){char b[strlen(s)];for(t=b;*s;++s)*s<47?(*t=0),p(t=b),putchar(*s):(*t++=*s);*t=0;p(t=b);}

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

раскатали:

char*t;
s,i,k;

p(l)
{
    for (l=s=*t/96, i=k=strlen(t); i--;)
        t[i]/96-s && ++l;

    for (l=l-s&&write(1, t, k); !l&++i<k;)
        write(1, s ? "𝖺𝖻𝖼𝖽𝖾𝖿𝗀𝗁𝗂𝗃𝗄𝗅𝗆𝗇𝗈𝗉𝗊𝗋𝗌𝗍𝗎𝗏𝗐𝗑𝗒𝗓"+t[i]*4-388
                   : "𝗮𝗯𝗰𝗱𝗲𝗳𝗴𝗵𝗶𝗷𝗸𝗹𝗺𝗻𝗼𝗽𝗾𝗿𝘀𝘁𝘂𝘃𝘄𝘅𝘆𝘇"+t[i]*4-260, 4);
}

f(char*s)
{
    char b[strlen(s)];

    for (t=b; *s; ++s)
        *s<47 ? (*t=0), p(t=b), putchar(*s) : (*t++=*s);

    *t = 0;
    p(t=b);
}

5

Java 8, 221 219 203 201 байт

s->{StringBuffer r=new StringBuffer();for(String x:s.split("(?<=[\\. ])|(?=[\\. ])"))x.codePoints().forEach(c->r.appendCodePoint(c+(x.matches("[A-Z]+")?120237:x.matches("[a-z]+")?120153:0)));return r;}

Я должен использовать StringBufferвместо обычного Stringиспользования .appendCodePoint, к сожалению ..

Объяснение:

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

s->{                           // Method with String parameter and StringBuffer return-type
  StringBuffer r=new StringBuffer();
                               //  Resulting StringBuffer
  for(String x:s.split("(?<=[\\. ])|(?=[\\. ])"))
                               //  Split by space or dot, and keep them as separate items,
                               //  and loop over all those substrings
   x.codePoints().forEach(c->  //   Inner loop over the codepoints of that substring
      r.appendCodePoint(       //    Convert int to char, and append it to the result:
        c                      //     The next codepoint of the substring
        +(x.matches("[A-Z]+")? //     If the word is fully uppercase:
           120237              //      Add 120237 to convert it to Math Sans Bold
          :x.matches("[a-z]+")?//     Else-if the word is fully lowercase:
           120153              //      Add 120153 to convert it to Math Sans
          :                    //     Else (mixed case, or a dot/space)
           0)));               //      Leave the codepoint (and thus the character) as is
  return r;}                   //  Return the resulting StringBuffer

4

Haskell , 172 170 байт

(s#w)r=[x|all(`elem`s)w,c<-w,(x,k)<-zip r s,c==k]
t[]=[]
t w=filter(>[])[['A'..'Z']#w$['𝗮'..],['a'..'z']#w$['𝖺'..],w]!!0
f s|(a,b:c)<-span(>'.')s=t a++b:f c|1>0=t s

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

Довольно просто. #Оператор принимает множество sиз charcters (верхний или нижний регистр) слово w, и набор математических Sans r. Он возвращает слово в шрифте math sans, если все символы в нем находятся, sили пустой список в противном случае. tФункция принимает слово и пытается все три Каковы возможности (все верхние, все ниже, или смешанный), возвращая первый, который не пуст. fФункция находит первое слово, используя span, превращая его tи конкатенации его с разделителем (либо .или в пространстве) , и повторяющиеся на остальной части строки. Альтернативный случай для, если span не может найти разделитель; мы просто преобразуем строку.

Редактировать: Спасибо @Laikoni за удаление 2 байта! Я не привык ко всему "оператор, который принимает три аргумента" вещь


1
(['A'..'Z']#w)['𝗮'..]может быть ['A'..'Z']#w$['𝗮'..].
Лайкони

3

Желе , 34 байта

e€ØBŒg
ṁǵŒl,Œuiị“¡ẓƬ“¡ẓġ“’×Ç+OỌµ€

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

Полная программа.


2
Это, вероятно, очевидно для профессиональных Jellyists, но не могли бы вы добавить краткое объяснение, чтобы показать, что здесь происходит?
Мик Мнемоник,

@MickMnemonic извините, сейчас у меня нет времени
Эрик Outgolfer

3

Сетчатка , 84 байта

/\b[A-Z]+\b/_(`.
ĵ$&
)T`L`ۮ-܇
/\b[a-z]+\b/_(`.
ĵ$&
)T`l`ں-ۓ
T`ÿ-߿`퟿-

Попробуйте онлайн! Объяснение: Retina - это приложение .NET, поэтому оно работает внутри UTF-16. К сожалению, поскольку символы Math Sans отсутствуют в BMP, я не могу транслитерировать их напрямую, потому что число кодовых точек отличается. Хуже того, я не могу использовать непарные суррогаты вообще. Вместо этого я сдвигаю соответствующие слова в символы диапазона, для 0xFF-0x7FFудобства которого требуется всего два байта для кодирования, плюс я также добавляю к ним префикс с 0x135символом. Наконец, я отображаю этот диапазон на диапазон, который перекрывает непарные суррогаты, создавая действительные пары BMP.


3

Python 3, 173 122 120 байт

lambda s:''.join(chr(ord(c)+120153*t.islower()+120237*t.isupper())for t in re.split(r'\b(\w+)\b',s)for c in t)
import re

-51 байт от ShreevatsaR

-2 байта из abccd

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

Разбивает границы слов ( re.split(r'\b(\w+)\b',s)), затем отображает строчные слова в 𝗅𝗈𝗐𝖾𝗋𝖼𝖺𝗌𝖾 𝗆𝖺𝗍𝗁 𝗌𝖺𝗇𝗌 ( +120153*t.islower()), а прописные слова - в 𝗯𝗼𝗹𝗱 𝗺𝗮𝘁𝗵 𝘀𝗮𝗻𝘀 ( +120237*t.isupper()) и оставляет слова в смешанном регистре в одиночку, а затем joinвозвращает слова обратно.

Неуправляемый и не лямбда-ред:

def f(s):
    words = re.split(r'\b(\w+)\b', s)
    ret = ''
    for word in words:
        for char in word:
            if word.isupper():
                ret += chr(ord(c) + 120237)
            elif word.islower():
                ret += chr(ord(c) + 120153)
            else:
                ret += c
    return ret

может ли быть меньше байтов, если вы установите переменную 120237 или 120153 в зависимости от того, была ли она выше или ниже? Похоже, что это может
pfg

1
@pfg Действительно, может легко сбрить 13 байтов (до 160 ).
ShreevatsaR

@pfg На самом деле, замена map-lambda на (более легкие для чтения) понимания приводит к уменьшению его до 149 байт .
ShreevatsaR

5
122 :-) Я остановлюсь здесь; Я очень горжусь тем, что игра в гольф облегчает чтение. Только в Python!
ShreevatsaR

2
-2 , избавляясь от пробелов доfor
abccd

3

Japt , 34 33 32 31 байт

Включает непечатный (код 153) после последнего #.

rV="%b%A+%b"Èc+#x#í
rVv Èc+#x#

Попытайся


объяснение

                        :Implicit input of string U
r                       :Replace
   "%b%A+%b"            :/\b[A-Z]+\b/g
 V=                     :Assign ^that to variable V
            È           :Run each match through a function
             c          :Map over the codepoints of the current match
              +#x#í     :  Add 120237
\n                      :Assign the result of that replacement to variable U
rVv                     :Another replacement, this time with V lowercased to give us the RegEx /\b[a-z]+\b/g
    Èc+#x#              :And, again, map over the codepoints of each match, this time adding 120153 to each

Оригинальное 32-байтовое решение Japt v2

r/\b(\A+|\a+)\b/Èc_+#x#+#T*(X¶u

Попытайся

r                                     :Replace
 /\b(\A+|\a+)\b/                      :...all matches of this RegEx (\A=[A-Z], \a=[a-z])
                È                     :Pass each match through a function, with X being the current match
                 c_                   :Pass the codepoints of X through a function
                   +                  :Add to the current codepoint
                    #x#               :120153 (there's an unprintable after the second #)
                        +#T           :Plus 84
                           *          :  Multiplied by
                            (X¶u      :  Is X equal to its uppercase self

1
Не хотите добавить дамп XXD?
Стэн Струм

Обратимый hexdump? Для непечатных.
Стэн Струм


1

JavaScript (ES6), 99 114 113 байт

s=>s.replace(/\b([A-Z]+|[a-z]+)\b/g,e=>e.replace(/./g,f=>String.fromCodePoint(f.charCodeAt()+120153+(f<'a')*84)))

(Спасибо @pfg за указание на важный недостаток в моем первом решении.)

-1 байт благодаря @Neil.

Отрывок:


Это работает только с HTML из-за & #, чтобы сделать это с чистым JS, вам нужно будет использовать, String.fromCodePoint(120237)что увеличит размер
pfg

Пока не впадайте в это, но я вернусь к этому позже, спасибо.
Рик Хичкок

let a = s=>s.replace(/\b([A-Z]+|[a-z]+)\b/g,e=>e.replace(/./g,f=>String.fromCodePoint(f.charCodeAt(0)+120153+(f<'a')*84)))работает на чистом JS, но добавляет много дополнительных байтов
pfg

Я понимаю! Daggum.
Рик Хичкок

3
Сохранить 1 байт, используя charCodeAt()без 0.
Нил
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.