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


28

소개

단어를 두 개의 다른 유니 코드 글꼴로 변환하십시오.

도전

당신의 임무는 입력 문자열을 𝖬𝖺𝗍𝗁 𝖲𝖺𝗇𝗌 및 𝗠𝗮𝘁𝗵 𝗦𝗮𝗻𝘀 𝗕𝗼𝗹𝗱 유니 코드 문자로 변환하는 것입니다.

모든 대문자는 소문자 𝗠𝗮𝘁𝗵 𝗦𝗮𝗻𝘀 𝗕𝗼𝗹𝗱 단어가되어야합니다.

  • 예를 들어 : 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에 오신 것을 환영합니다!
Laikoni

6
♫ 철학은 𝗆𝖺𝗍𝗁 𝗌𝖺𝗇𝗌 엄격하고 감각적이며 실용적입니다 ... ♫
과일 만들기 Esolanging Fruit

13
우와! 사이드 바에 제목이 굵게 표시되어 있습니까? 뭐? 이해가 안 돼요 ... 인터넷이 끊어 졌나요? 적이 당신은 인터넷을 끊어?
Zizouz212

26
i.stack.imgur.com/R4V3C.png 이 도전이 상자, 막대 차트 또는 기타 물건을 쌓는 것에 관한 것이라고 생각했습니다.
Matteo Italia

8
이것은 망치질되어서는 안됩니다. 이 문제는 단순한 문자 음역보다 훨씬 어렵습니다. 최고의 대답 인용 도전에서 쉽게도 경쟁적으로 같은 방법을 사용하여 전송할 수 없습니다 (AFAICT, 내 망막은 크지 않다)
코너 오브라이언

답변:


10

QuadR , 45 43 바이트

ngn 덕분에 -2입니다.

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

TIO는 QuadR의 유니 코드 출력을 스크램블하므로 다음은 대화식 세션에서 QuadR을 APL 라이브러리로 사용하는 스크린 샷입니다. interactive session transcript


\w+ 다음 코드를 적용한 결과로 단어를 바꾸십시오.

⍵M 검색된 단어 U WiFi의 C haracter S 등 그 코드 포인트  에 저장하는  0 또는 1 96 여부를 그 각각의보다 큰  막 고유 권취; 또는 또는 또는  로 저장하는  것과 제 픽업  이 곱하기 84  것과 120,153 애드온 ...  곱 그와 다음  탈리 (길이)의 ( 하나의 경우는, 만약 대소 경우)  여부 개의 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 바이트

Outgolfer Erik에게 감사합니다. ngn 덕분에 -4입니다.

익명의 암묵적 접두사 기능.

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

TIO는 Dyalog APL의 유니 코드 출력을 스크램블하기 때문에 다음은 작동중인 코드의 스크린 샷입니다.

code in action


'\w+'⎕R PCRE R 다음을 적용한 결과와 eplace 단어 ...

{... } 익명 람다 :

⍵.Match 발견 된 단어

⎕UCSU는 WiFi의 C haracter S 그 외 코드 포인트

a← 그것을 저장 a

96> 96이 각 것보다 큰지 여부에 대해 0 또는 1

 독특한 것을 취하십시오. [0]또는 [1]또는 [0,1]또는[1,0]

b← 그것을 저장 b

 그것에서 첫 번째를 선택

84× 84를 곱하십시오

120153+ 그것에 120153을 추가하십시오

( 다음을 곱하십시오.

  ≢b tally (길이) 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 Erik

@EriktheOutgolfer 감사합니다. 내가 암묵적으로 생각하지 않은 이유
Adám

잘 모르겠지만 피곤할 때 나에게 일어납니다. :)
Outgolfer Erik

@EriktheOutgolfer 사실, 나는 APL 키보드 레이아웃없이 아내의 컴퓨터를 사용하여 집에서 이것을 작성했다고 생각합니다…
Adám

@ Adám 정규 표현식이 너무 깁니다. \w+dfn의 코드 포인트에 추가 할 금액을 사용 하고 계산하는 것이 좋습니다 .'\w+'⎕R{⎕UCS a+(2>≢b)×120153+84×⊃b←∪96>a←⎕UCS⍵.Match}
ngn

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를 반환하고 a 를 반환합니다.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

자바 (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

하스켈 , 172170 바이트

(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

온라인으로 사용해보십시오!

매우 간단합니다. #연산자 세트 얻어 scharcters (대소) 단어 w및 수학 산세 세트 r. 단어의 모든 문자가 포함 된 경우 math sans 글꼴로 단어를 반환 s하거나 그렇지 않으면 빈 목록을 반환합니다. 이 t함수는 단어를 취하고 세 가지 가능성 (모두 위, 모두 또는 모두 혼합)을 시도하여 비어 있지 않은 첫 번째 항목을 반환합니다. 이 f함수는을 사용하여 단어를 span변환 t하고 구분 기호 ( .또는 공백)로 연결하고 나머지 문자열에서 되풀이 하여 첫 번째 단어를 찾습니다 . 스팬이 구분 기호를 찾을 수없는 경우의 다른 경우입니다. 우리는 단지 문자열을 변형시킵니다.

편집 : 2 바이트를 벗어난 @Laikoni에게 감사드립니다! 나는 "세 개의 주장을 취하는 연산자"에 익숙하지 않다


1
(['A'..'Z']#w)['𝗮'..]일 수 있습니다 ['A'..'Z']#w$['𝗮'..].
Laikoni


3

레티 나 , 84 바이트

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

온라인으로 사용해보십시오! 설명 : Retina는 .NET 애플리케이션이므로 내부적으로 UTF-16으로 작동합니다. 불행히도 Math Sans 문자가 BMP에 없으므로 코드 포인트 수가 다르기 때문에 직접 음역 할 수 없습니다. 더구나, 나는 짝을 이루지 않은 대리자를 전혀 사용할 수 없다. 대신 적절한 단어 0xFF-0x7FF를 인코딩하는 데 2 ​​바이트 만 걸리는 범위의 문자 로 옮기고 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

ShreevatsaR에서 -51 바이트

abccd에서 -2 바이트

온라인으로 사용해보십시오!

단어 경계 ( re.split(r'\b(\w+)\b',s))를 분할 한 다음 소문자 단어를 𝗅𝗈𝗐𝖾𝗋𝖼𝖺𝗌𝖾 𝗆𝖺𝗍𝗁 𝗌𝖺𝗇𝗌 ( +120153*t.islower())에, 대문자 단어를 𝗯𝗼𝗹𝗱 𝗺𝗮𝘁𝗵 𝘀𝗮𝗻𝘀 ( +120237*t.isupper()) 에 매핑하고 대소 문자를 혼합 한 다음 join단어를 다시 씁니다 .

ungolfed 및 unlambda-ed :

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 :-) 나는 여기서 멈출 것이다. 골프를 더 쉽게 읽을 수있게 된 것을 자랑스럽게 생각합니다. 파이썬에서만!
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 덤프를 추가 하시겠습니까?
Stan Strum

뒤집을 수있는 hexdump? 인쇄 할 수없는 경우
Stan Strum


1

자바 스크립트 (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에게 감사합니다.)

@Neil 덕분에 -1 바이트.

단편:


이것은 & # 때문에 HTML에서만 작동합니다. 순수한 JS로 사용 String.fromCodePoint(120237)하려면 크기를 늘려야합니다.
pfg

아직 그 말을하지는 않았지만 나중에 다시 올 것이다. 고마워.
Rick Hitchcock

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.
Rick Hitchcock

3
charCodeAt()없이 사용하여 1 바이트를 저장하십시오 0.
Neil
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.