𝗔𝗹𝘁𝗲𝗿𝗻𝗮𝘁𝗼𝗿


28

介绍

尝试将单词转换为两种不同的unicode字体。

挑战

您的任务是将输入字符串转换为𝖲𝖺𝗇𝗌和𝗕𝗼𝗹𝗱Unicode字符。

所有大写单词都应变为小写case𝗕𝗼𝗹𝗱𝗕𝗼𝗹𝗱单词。

  • 例如:WORD->𝘄𝗼𝗿𝗱

所有小写​​单词都应成为𝖲𝖺𝗇𝗌单词

  • 例如:other words->𝗈𝗍𝗁𝖾𝗋 𝗐𝗈𝗋𝖽𝗌

所有大小写混合的单词应保持不变

  • 例如:Mixed Case Words->Mixed Case Words

句号和空格应保持不变。

单词之间用空格或句点分隔

  • 例如(突出显示的内容是单词):

HelloThis is a wordSOare these

  • 输入:包含字母,空格和句点([A-Za-z .]+)的字符串
  • 输出:格式化的字符串

因为这是一场高尔夫挑战,所以最少的字节数获胜

输入和输出示例

输入:

这是可以输入的示例“ STRING”。它可以包含多个句子。

输出:

𝗂𝗌.𝗈.𝘂.𝗹.𝖽。𝗶𝗻𝗽𝘂𝘁𝘁𝗲𝗱。𝖼𝖺𝗇。

参考

Math Sans Bold:𝗮𝗯𝗰𝗱𝗲𝗳𝗴𝗵𝗶𝗷𝗸𝗹𝗺𝗻𝗼𝗽𝗾𝗿𝘀𝘁𝘂𝘃𝘄𝘅𝘆𝘇(字符120302至120327)

Math Sans:𝖺𝖻𝖼𝖽𝖾𝖿𝗀𝗁𝗂𝗃𝗄𝗅𝗆𝗇𝗈𝗉𝗊𝗋𝗌𝗍𝗎𝗏𝗐𝗑𝗒𝗓(字符120250至120275)


3
欢迎来到PPCG!
Laikoni

6
♫哲学只是𝗆𝖺𝗍𝗁严谨,理性和实用...♫
结出硕果

13
哇!您在侧边栏中以粗体显示了标题吗?什么?我...不明白......互联网中断了吗?有打破了互联网?
Zizouz212 '18

26
i.stack.imgur.com/R4V3C.png我来到这里的时候是在想这个挑战是关于堆叠盒子,条形图之类的东西……
Matteo Italia,

8
这不应该被严厉打击。这个问题比简单的字符音译要困难得多。引用的挑战中的主要答案无法使用相同的方法轻易或竞争地转移(确实,我的视网膜不好)
Conor O'Brien

Answers:


10

QuadR45 43字节

-2感谢ngn。

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

由于TIO扰乱了QuadR的Unicode输出,因此以下是在交互式会话中将QuadR用作APL库的屏幕截图: 互动会议记录


\w+ 将单词替换为对它们应用以下代码的结果:

⍵M 所找到的字
⎕UCS 的û niversal Ç haracter 小号等那的代码点
a← 存储在a
96> 0或1是否是96比每个那些更大
 取只是唯一的; [0][1][0,1][1,0]
b← 将其存储在b
 从
84× 乘以84中的第一个 乘以
120153+ 120153的基础上
( 乘以以下乘以:
≢b 计数(长度)b1如果是单写,2如果是混写)为
2> 0或1(是否为2)大于该值(1如果是单写,0如果是混合大小写),
a+ 则将原始代码点添加到该值
⎕UCS 将生成的代码点转换回字符


9

APL(Dyalog Unicode)63 57 53字节

-6多亏了Outgolfer的Erik。-4感谢ngn。

匿名默认前缀功能。

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

由于TIO扰乱了Dyalog APL的Unicode输出,因此下面是运行中的代码的屏幕截图:

实际代码


'\w+'⎕R PCRE [R与应用以下结果E放置的话...

{... } 匿名lambda:

⍵.Match 找到的词

⎕UCS 所述û niversal Ç haracter 小号的那等代码点

a← 存放在 a

96> 0或1,表示96是否大于每个

 采取独特的 [0][1][0,1][1,0]

b← 存放在 b

 从中选第一个

84× 乘以84

120153+ 添加120153

( 将以下内容乘以:

  ≢bb1如果是大写的话,2如果是大写的话) 的计数(长度)

  2> 0或1表示两个数是否大于(1如果是大写,0如果是大写)

a+ 原始代码点添加到

⎕UCS 将生成的代码点转换回字符


57个字节:'\b([A-Z]+|[a-z]+)\b'⎕R{⎕UCS(⎕UCS+120153+84×∊∘⎕A)⍵.Match}
Erik the Outgolfer

@EriktheOutgolfer谢谢。我为什么不默契
作答-Adám,

我不知道,但是当我累的时候会发生在我身上。:)
Erik the Outgolfer

@EriktheOutgolfer实际上,我想我是用我妻子的电脑在家中写的,没有APL键盘布局…
–Adám18年

@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并返回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

爪哇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

Haskell172170字节

(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,并且数学SANS集r。如果单词中的所有字符都在其中,则以math sans字体返回该单词,s否则返回空白列表。该t函数使用一个单词并尝试所有三个可能性(全部较高,全部较低或混合),返回不为空的第一个。该f函数通过使用span,进行转换t并将其与分隔符(.或空格)连接,然后在字符串的其余部分重复出现,来找到第一个单词。另一种情况是,如果span无法找到分隔符;我们只是转换字符串。

编辑:感谢@Laikoni腾出2个字节!我不习惯整个“带有三个参数的运算符”的事情


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方便地仅用两个字节进行编码,而且我还为它们加上了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

来自ShreevatsaR的-51字节

abccd的-2个字节

在线尝试!

在单词边界(re.split(r'\b(\w+)\b',s))上分割,然后将小写单词映射到𝗅𝗈𝗐𝖾𝗋𝖼𝖺𝗌𝖾𝗌𝖺𝗇𝗌 (),将大写单词映射到𝗯𝗼𝗹𝗱𝘀𝗮𝗻𝘀 (),然后仅保留+120153*t.islower()大小写+120237*t.isupper()混合的单词,然后join将单词备份。

非高尔夫和非lamed-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 :-)我会在这里停止;对于进一步打高尔夫球使它更易于阅读而感到自豪。仅在Python中!
ShreevatsaR

2
-2通过在之前删除空格for
abccd

3

Japt34 33 32 31字节

在last之后包括一个不可打印的(字符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,

可逆的十六进制转储?对于不可打印的东西。
Stan Strum,


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进行处理,您将需要使用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
charCodeAt()不使用可以节省1个字节0
尼尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.