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


28

Вступ

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

Виклик

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

Усі великі слова повинні стати малими 𝗠𝗮𝘁𝗵 𝗦𝗮𝗻𝘀 𝗕𝗼𝗹𝗱 словами.

  • Наприклад: WORD->𝘄𝗼𝗿𝗱

Усі малі слова повинні стати 𝖬𝖺𝗍𝗁 𝖲𝖺𝗇𝗌 словами

  • Наприклад: other words->𝗈𝗍𝗁𝖾𝗋 𝗐𝗈𝗋𝖽𝗌

Усі змішані регістрові слова повинні залишатися незмінними

  • Наприклад: Mixed Case Words->Mixed Case Words

Періоди та пробіли повинні залишатися незмінними.

Слова розділені пробілами або періодами

  • Наприклад (виділені речі - це слова):

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

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

Оскільки це проблема в гольфі, виграє найменша кількість байтів

Приклад введення та виведення

Вхід:

Це приклад STRING, який ВИКОНУЄТЬСЯ. Він може СУМОВИТИ кілька речень.

Вихід:

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

Довідково

Math Sans Bold: 𝗮𝗯𝗰𝗱𝗲𝗳𝗴𝗵𝗶𝗷𝗸𝗹𝗺𝗻𝗼𝗽𝗾𝗿𝘀𝘁𝘂𝘃𝘄𝘅𝘆𝘇 (символи від 120302 до 120327)

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


3
Ласкаво просимо до PPCG!
Лайконі

6
♫ Філософія - просто 𝗌𝖺𝗇𝗌 gor строгість, сенс і практичність ... ♫
Езоляція фруктів

13
Ого! Ви отримали заголовок жирним шрифтом на бічній панелі? Що? Я ... не розумію .... чи інтернет порушений? Чи були ви порушили інтернет?
Zizouz212

26
i.stack.imgur.com/R4V3C.png Я прийшов сюди, думаючи, що цей виклик стосується складання коробок, барних діаграм чи чогось іншого
Matteo Italia

8
Це не повинно було бути забито близько. Ця проблема значно складніше, ніж проста транслітерація символів. Ведучий відповідь в цитованому виклик не може легко і конкурентно бути переданий з допомогою цієї ж методи (AFAICT, моя сітківка не велика)
Конор О'Браєн

Відповіді:


10

QuadR , 45 43 байт

-2 завдяки ngn.

\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 завдяки ngn.

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

'\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}
Ерік Атголфер

@EriktheOutgolfer Дякую Чому я не подумав піти мовчки?
Адам

Не знаю, але це трапляється зі мною, коли я втомився. :)
Erik the 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]

Спробуйте в Інтернеті!

Визначає функцію @, приймаючи a UStringі повертаючи aUString


3
Це також чистий бонус? : D
Conor O'Brien

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
Професійним желістам це, мабуть, очевидно, але ви можете додати коротке пояснення, щоб показати, що тут відбувається?
Мік Мнемонік

@MickMnemonic вибачте, зараз я не
встигаю

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

Пітон 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 Насправді, заміна карти-лямбда на (легше читати) розуміння зводить її до 149 байт .
ShreevatsaR

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

2
-2 , позбувшись пробілів ранішеfor
припадає на

3

Japt , 34 33 32 31 байт

Включає недрукований (charcode 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 дамп?
Стен Струм

Зворотний гексдумп? Для недрукованих матеріалів.
Стен Струм


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

Ах, я розумію! Кинджал.
Рік Хічкок

3
Збережіть 1 байт за допомогою charCodeAt()без 0.
Ніл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.