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


28

Giới thiệu

Cố gắng chuyển đổi các từ thành hai phông chữ unicode khác nhau.

Thử thách

Nhiệm vụ của bạn là chuyển đổi chuỗi đầu vào của bạn thành các ký tự unicode 𝖬𝖺𝗍𝗁 𝖲𝖺𝗇𝗌 và 𝗦𝗮𝗻𝘀.

Tất cả các từ viết hoa nên trở thành chữ thường 𝗠𝗮𝘁𝗵 𝗦𝗮𝗻𝘀.

  • Ví dụ: WORD->𝘄𝗼𝗿𝗱

Tất cả các từ viết thường sẽ trở thành từ

  • Ví dụ: other words->𝗈𝗍𝗁𝖾𝗋 𝗐𝗈𝗋𝖽𝗌

Tất cả các từ trường hợp hỗn hợp nên không thay đổi

  • Ví dụ: Mixed Case Words->Mixed Case Words

Thời gian và không gian nên không thay đổi.

Các từ được phân cách bằng dấu cách hoặc dấu chấm

  • Ví dụ (những thứ được tô sáng là từ):

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

  • Đầu vào: Một chuỗi chứa các chữ cái, dấu cách và dấu chấm ( [A-Za-z .]+)
  • Đầu ra: Chuỗi được định dạng

Vì đây là một thử thách chơi gôn, số byte thấp nhất sẽ thắng

Ví dụ đầu vào và đầu ra

Đầu vào:

Đây là một ví dụ CHUINGI mà coULd được INPUTTED. Nó có thể CONTAIN nhiều câu.

Đầu ra:

Điều này 𝖺𝗇 𝖾𝗑𝖺𝗆𝗉𝗅𝖾 𝘀𝘁𝗿𝗶𝗻𝗴 .𝗈.𝘂.𝗹.. 𝖻𝖾 𝗶𝗻𝗽𝘂𝘁𝘁𝗲𝗱. Nó 𝗰𝗼𝗻𝘁𝗮𝗶𝗻 𝗆𝗎𝗅𝗍𝗂𝗉𝗅𝖾.

Tài liệu tham khảo

Math Sans Bold: (ký tự 120302 đến 120327)

Toán Sans: (ký tự 120250 đến 120275)


3
Chào mừng đến với PPCG!
Laikoni

6
Triết lý chỉ là 𝗆𝖺𝗍𝗁 sự nghiêm khắc, ý nghĩa và tính thực tế ...
Trái cây Esolanging

13
Whoa! Bạn có một tiêu đề in đậm trong thanh bên? Gì? Tôi ... không hiểu .... là internet phá vỡ? Đã bạn chia internet?
Zizouz212

26
i.stack.imgur.com/R4V3C.png Tôi đến đây nghĩ rằng thử thách này là về việc xếp các hộp, biểu đồ thanh hoặc thứ gì đó ...
Matteo Italia

8
Điều này không nên được đóng búa. Vấn đề này khó khăn hơn đáng kể so với phiên âm ký tự đơn giản. Các câu trả lời hàng đầu trong thử thách trích dẫn có thể không dễ dàng và cũng không cạnh tranh được chuyển giao sử dụng phương pháp tương tự (afaict, võng mạc của tôi là không lớn)
Conor O'Brien

Câu trả lời:


10

QuadR , 45 43 byte

-2 nhờ ngn.

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

Do TIO xáo trộn đầu ra Unicode từ QuadR, nên đây là ảnh chụp màn hình sử dụng QuadR làm thư viện APL trong phiên tương tác: bảng điểm tương tác


\w+ thay thế các từ bằng kết quả của việc áp dụng mã sau đây cho chúng:

⍵M từ tìm thấy
⎕UCS các U niversal C haracter S et điểm quy tắc rằng
a← cửa hàng đó trong a
96> 0 hoặc 1 cho dù 96 là lớn hơn mỗi người
 mất chỉ là độc đáo; [0]hay [1]hay [0,1]hay [1,0]
b← cửa hàng mà trong b
 chọn ngày đầu tiên từ đó
84× nhân với 84 với điều đó
120153+ add 120.153 đến đó
(...  nhân sau đây với điều đó:
≢b kiểm đếm (chiều dài) của b( 1nếu đơn hợp cụ thể, 2nếu hỗn hợp hợp cụ thể)
2> 0 hoặc 1 cho dù hai là lớn hơn thế ( 1nếu trường hợp đơn, 0nếu trường hợp hỗn hợp),
a+ các điểm mã ban đầu được thêm vào đó
⎕UCS chuyển đổi các điểm mã kết quả trở lại thành ký tự


9

APL (Dyalog Unicode) , 63 57 53 byte

-6 cảm ơn Erik the Outgolfer. -4 cảm ơn ngn.

Chức năng tiền tố ẩn danh.

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

Do TIO xáo trộn đầu ra Unicode từ Dyalog APL, nên đây là ảnh chụp màn hình của mã đang hoạt động:

mã trong hành động


'\w+'⎕R PCRE R sử dụng các từ có kết quả với việc áp dụng các từ sau

{... } lambda ẩn danh:

⍵.Match từ tìm thấy

⎕UCS các U niversal C haracter S điểm et quy tắc đó

a← lưu trữ nó trong a

96> 0 hoặc 1 cho dù 96 lớn hơn mỗi cái

 chỉ lấy cái duy nhất; [0]hoặc [1]hoặc [0,1]hoặc[1,0]

b← lưu trữ nó trong b

 chọn cái đầu tiên từ đó

84× nhân 84 với điều đó

120153+ thêm 120153 vào đó

(Nhiều  nhân như sau với điều đó:

  ≢b kiểm đếm (độ dài) của b( 1nếu trường hợp đơn, 2nếu trường hợp hỗn hợp)

  2> 0 hoặc 1 cho dù hai lớn hơn số đó ( 1nếu trường hợp đơn, 0nếu trường hợp hỗn hợp)

a+ các điểm mã ban đầu được thêm vào đó

⎕UCS chuyển đổi các điểm mã kết quả trở lại thành ký tự


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

@EriktheOutgolfer Cảm ơn. Tại sao tôi không nghĩ đến việc đi ngầm
Adám

Tôi không biết, nhưng nó xảy ra với tôi khi tôi mệt mỏi. :)
Erik the Outgolfer

@EriktheOutgolfer Thật ra, tôi nghĩ rằng tôi đã viết bài này từ nhà bằng máy tính của vợ tôi mà không có bố cục bàn phím APL
Adám

@ Adám mà regex quá dài; tốt hơn hết là bạn nên sử dụng \w+và tính toán số tiền cần thêm vào các điểm mã trong dfn:'\w+'⎕R{⎕UCS a+(2>≢b)×120153+84×⊃b←∪96>a←⎕UCS⍵.Match}
ngn

8

Sạch sẽ , 268 265 232 224 byte

Là một phần thưởng gọn gàng, điều này hoạt động với các chuỗi chứa bất kỳ ký tự nào . Bao gồm cả null.

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]

Hãy thử trực tuyến!

Xác định hàm @, lấy UStringvà trả vềUString


3
Nó cũng là một phần thưởng sạch? : D
Conor O'Brien

6

C, 292 ký tự, 448 byte (trong 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);}

Hãy thử trực tuyến!

Chưa được kiểm soát:

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 byte

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;}

Tôi phải sử dụng StringBufferthay vì thường xuyên Stringđể sử dụng .appendCodePoint, thật không may ..

Giải trình:

Hãy thử trực tuyến.

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 byte

(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

Hãy thử trực tuyến!

Khá đơn giản. Các #nhà điều hành mất tập scủa charcters (trên hoặc chữ thường) từ w, và tập sans toán r. Nó trả về từ trong phông chữ sans toán học nếu tất cả các ký tự trong từ nằm trong sdanh sách trống. Các tchức năng phải mất một từ và cố gắng cả ba possiblities (tất cả trên, tất cả thấp hơn, hoặc hỗn hợp), trở về là người đầu tiên mà không phải là trống rỗng. Các fchức năng tìm thấy từ đầu tiên bằng cách sử dụng span, chuyển nó bằng tvà concatenating nó với các dấu phân cách (hoặc .hoặc không gian) và định kỳ trên phần còn lại của chuỗi. Trường hợp thay thế là nếu span không thể tìm thấy dấu phân cách; chúng ta chỉ cần biến đổi chuỗi.

Chỉnh sửa: Cảm ơn @Laikoni vì đã gỡ 2 byte! Tôi không quen với toàn bộ "toán tử có ba đối số"


1
(['A'..'Z']#w)['𝗮'..]có thể ['A'..'Z']#w$['𝗮'..].
Laikoni

3

Thạch , 34 byte

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

Hãy thử trực tuyến!

Chương trình đầy đủ.


2
Điều này có thể rõ ràng đối với các Jellyists chuyên nghiệp, nhưng bạn có thể thêm một lời giải thích ngắn gọn để cho thấy đang diễn ra ở đây không?
Mick Mnemonic

@MickMnemonic xin lỗi, ngay bây giờ tôi không có thời gian để
Erik the Outgolfer 26/1/18

3

Võng mạc , 84 byte

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

Hãy thử trực tuyến! Giải thích: Retina là một ứng dụng .NET và do đó hoạt động trong UTF-16 trong nội bộ. Thật không may vì các ký tự Math Sans không có trong BMP nên tôi không thể chuyển ngữ trực tiếp chúng vì số lượng điểm mã khác nhau. Tệ hơn nữa, tôi không thể sử dụng những người thay thế không ghép đôi. Thay vào đó, tôi chuyển các từ thích hợp thành các ký tự trong phạm vi 0xFF-0x7FFchỉ thuận tiện lấy hai byte để mã hóa, ngoài ra tôi cũng thêm tiền tố vào chúng với 0x135ký tự. Cuối cùng, tôi ánh xạ phạm vi đó lên phạm vi chồng lấp các đại diện không ghép đôi, tạo các cặp BMP hợp lệ.


3

Python 3, 173 122 120 byte

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 byte từ ShreevatsaR

-2 byte từ abccd

Hãy thử trực tuyến!

Tách trên các ranh giới từ ( re.split(r'\b(\w+)\b',s)), sau đó ánh xạ các từ viết thường thành 𝗆𝖺𝗍𝗁 ( +120153*t.islower()) và các từ viết hoa thành 𝗺𝗮𝘁𝗵 ( +120237*t.isupper()) và để lại các từ viết hoa, sau đó joins các từ sao lưu.

Ungolfed và un-lambda-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

nó có thể là ít byte hơn nếu bạn đặt một biến thành 120237 hoặc 120153 tùy thuộc vào việc nó cao hơn hay thấp hơn? Có vẻ như nó có thể
pfg

1
@pfg Thật vậy, có thể dễ dàng cạo sạch 13 byte (giảm xuống 160 ).
ShreevatsaR

@pfg Trên thực tế, việc thay thế map-lambda bằng cách hiểu (dễ đọc hơn) sẽ giảm xuống còn 149 byte .
ShreevatsaR

5
122 :-) Tôi sẽ dừng ở đây; khá tự hào về cách chơi golf nó đã làm cho nó dễ đọc hơn. Chỉ có trong Python!
ShreevatsaR

2
-2 bằng cách loại bỏ khoảng trắng trướcfor
abccd

3

Japt , 34 33 32 31 byte

Bao gồm một không thể in (charcode 153) sau cùng #.

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

Thử nó


Giải trình

                        :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

Giải pháp 32 Byte Japt v2 gốc

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

Thử nó

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
Tâm thêm một bãi XXD?
Stan Strum

Một hexdump đảo ngược? Đối với các không thể in.
Stan Strum


1

JavaScript (ES6), 99 114 113 byte

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

(Cảm ơn @pfg đã chỉ ra một lỗ hổng quan trọng trong giải pháp đầu tiên của tôi.)

-1 byte nhờ @Neil.

Đoạn trích:


Điều này chỉ hoạt động với HTML vì & #, để làm điều đó với JS thuần túy, bạn sẽ cần sử dụng String.fromCodePoint(120237)để tăng kích thước
pfg

Đừng mò mẫm điều đó, nhưng tôi sẽ quay lại sau, cảm ơn.
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)))hoạt động thuần túy JS nhưng thêm nhiều byte bổ sung
pfg

À, tôi hiểu rồi! Daggum.
Rick Hitchcock

3
Lưu 1 byte bằng cách sử dụng charCodeAt()mà không có 0.
Neil
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.