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


28

pengantar

Cobalah untuk mengubah kata-kata menjadi dua font unicode yang berbeda.

Tantangan

Tugas Anda adalah mengubah string masukan Anda menjadi karakter unicode 𝖬𝖺𝗍𝗁 𝖲𝖺𝗇𝗌 dan 𝗠𝗮𝘁𝗵 𝗦𝗮𝗻𝘀 𝗕𝗼𝗹𝗱.

Semua huruf besar harus menjadi huruf kecil 𝗠𝗮𝘁𝗵 𝗦𝗮𝗻𝘀 𝗕𝗼𝗹𝗱 kata-kata.

  • Sebagai Contoh: WORD->𝘄𝗼𝗿𝗱

Semua kata kecil harus menjadi kata 𝖬𝖺𝗍𝗁 𝖲𝖺𝗇𝗌

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

Semua kata campuran harus tetap tidak berubah

  • Misalnya: Mixed Case Words->Mixed Case Words

Periode dan ruang harus tetap tidak berubah.

Kata-kata dipisahkan oleh spasi atau titik

  • Misalnya (hal-hal yang disorot adalah kata-kata):

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

  • Input: String yang berisi huruf, spasi, dan titik ( [A-Za-z .]+)
  • Output: String yang diformat

Karena ini adalah tantangan golf, jumlah byte terendah menang

Contoh Input dan Output

Memasukkan:

Ini adalah contoh STRING yang dapat INPUTTED. Itu dapat MENGANDUNG beberapa kalimat.

Keluaran:

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

Referensi

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

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


3
Selamat datang di PPCG!
Laikoni

6
♫ Hanya filosofi 𝗆𝖺𝗍𝗁 𝗌𝖺𝗇𝗌 ketelitian, kepekaan, dan kepraktisan ... ♫
Esolanging Fruit

13
Wah! Anda mendapat judul dalam huruf tebal di bilah sisi? Apa? Saya ... tidak mengerti ... apakah internet putus? Sudahkah Anda merusak internet?
Zizouz212

26
i.stack.imgur.com/R4V3C.png Saya datang ke sini berpikir tantangan ini adalah tentang menumpuk kotak, grafik batang atau sesuatu ...
Matteo Italia

8
Ini seharusnya tidak dipalu. Masalah ini secara signifikan lebih sulit daripada transliterasi karakter sederhana. The jawabannya terkemuka di tantangan dikutip tidak dapat dengan mudah atau kompetitif ditransfer menggunakan metode yang sama (afaict, retina saya tidak besar)
Conor O'Brien

Jawaban:


10

QuadR , 45 43 byte

-2 Terima kasih kepada ngn.

\w+
⎕UCS a+(2>≢b)×120153+84×⊃b←∪96>a←⎕UCS⍵M

Karena TIO mengacak keluaran Unicode dari QuadR, berikut adalah screenshot menggunakan QuadR sebagai pustaka APL dalam sesi interaktif: transkrip sesi interaktif


\w+ ganti kata-kata dengan hasil menerapkan kode berikut ini kepada mereka:

⍵M kata yang ditemukan bahwa
⎕UCS kode U niversal C haracter S et menunjuk
a← toko itu yang pada a
96> 0 atau 1 untuk apakah 96 lebih besar dari masing-masing
∪ mengambil hanya yang unik; [0]atau [1]atau [0,1]atau [1,0]
b← menyimpan yang di b
⊃ pilih yang pertama dari yang
84× kalikan 84 dengan yang
120153+ menambahkan 120153 untuk itu
(... )× kalikan yang berikut dengan itu:
 ≢b penghitungan (panjang) dari b( 1jika satu kasus, 2jika kasus campuran)
 2> 0 atau 1 untuk apakah dua adalah lebih besar dari itu ( 1jika satu kasus, 0jika kasus campuran)
a+ poin kode asli ditambahkan ke itu
⎕UCS mengkonversi kode yang dihasilkan poin kembali ke karakter


9

APL (Dyalog Unicode) , 63 57 53 byte

-6 Terima kasih kepada Erik the Outgolfer. -4 Terima kasih kepada ngn.

Fungsi awalan diam-diam anonim.

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

Karena TIO mengacak output Unicode dari Dyalog APL, berikut adalah tangkapan layar dari kode yang sedang digunakan:

kode dalam aksi


'\w+'⎕R PCRE R eplace kata-kata dengan hasil menerapkan berikut ...

{... } lambda anonim:

 ⍵.Match kata yang ditemukan

 ⎕UCS yang U niversal C haracter S et kode poin itu

 a← simpan di a

 96> 0 atau 1 untuk apakah 96 lebih besar dari masing-masing

 ∪ ambil saja yang unik; [0]atau [1]atau [0,1]atau[1,0]

 b← simpan di b

 ⊃ pilih yang pertama dari itu

 84× kalikan 84 dengan itu

 120153+ tambahkan 120153 ke sana

 (... )× gandakan yang berikut dengan itu:

  ≢b penghitungan (panjang) dari b( 1jika satu kasus, 2jika kasus campuran)

  2> 0 atau 1 untuk apakah dua lebih besar dari itu ( 1jika kasing tunggal, 0kasing campuran)

 a+ poin kode asli ditambahkan ke dalamnya

 ⎕UCS mengkonversi kode yang dihasilkan poin kembali ke karakter


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

@EriktheOutgolfer Terima kasih. Mengapa saya tidak berpikir untuk pergi diam
diam

Saya tidak tahu, tetapi itu terjadi pada saya ketika saya lelah. :)
Erik the Outgolfer

@EriktheOutgolfer Sebenarnya, saya pikir saya menulis ini dari rumah menggunakan komputer istri saya tanpa tata letak keyboard APL ...
Adám

@ Adm, regex itu terlalu panjang; Anda lebih baik menggunakan \w+dan menghitung jumlah untuk ditambahkan ke codepoint di dfn:'\w+'⎕R{⎕UCS a+(2>≢b)×120153+84×⊃b←∪96>a←⎕UCS⍵.Match}
ngn

8

Bersih , 268 265 232 224 byte

Sebagai bonus yang rapi, ini berfungsi dengan string yang berisi karakter apa pun . Termasuk nol.

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]

Cobalah online!

Menentukan fungsi @, mengambil UStringdan mengembalikan aUString


3
Apakah ini juga bonus bersih? : D
Conor O'Brien

6

C, 292 karakter, 448 byte (dalam 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);}

Cobalah online!

Belum dibuka:

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

Saya harus menggunakan StringBufferbukan biasa Stringuntuk menggunakan .appendCodePoint, sayangnya ..

Penjelasan:

Cobalah online.

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

Cobalah online!

Cukup mudah. The #Operator mengambil set sdari charcters (atas atau huruf kecil) kata w, dan matematika sans set r. Ini mengembalikan kata dalam font sans matematika jika semua karakter dalam kata berada di satau daftar kosong sebaliknya. The tfungsi mengambil kata dan mencoba semua tiga possiblities (semua atas, semua yang lebih rendah, atau campuran), kembali yang pertama yang tidak kosong. The fFungsi menemukan kata pertama dengan menggunakan span, mengubahnya dengan tdan concatenating dengan pemisah (baik .atau ruang) dan berulang pada sisa string. Kasing alternatif adalah jika rentang tidak dapat menemukan pemisah; kami hanya mengubah string.

Sunting: Terima kasih kepada @Laikoni karena melepaskan 2 byte! Saya tidak terbiasa dengan keseluruhan "operator yang membutuhkan tiga argumen"


1
(['A'..'Z']#w)['𝗮'..]bisa ['A'..'Z']#w$['𝗮'..].
Laikoni

3

Jelly , 34 byte

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

Cobalah online!

Program lengkap.


2
Ini mungkin jelas untuk para ahli Jellyis profesional, tetapi bisakah Anda menambahkan penjelasan singkat untuk menunjukkan ẇƬƒ sedang terjadi di sini?
Mick Mnemonic

@MickMnemonic maaf, sekarang saya tidak punya waktu untuk
Erik the Outgolfer

3

Retina , 84 byte

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

Cobalah online! Penjelasan: Retina adalah aplikasi .NET dan karenanya berfungsi di UTF-16 secara internal. Sayangnya karena karakter Math Sans tidak ada dalam BMP, saya tidak bisa langsung mentransliterasinya karena jumlah titik kode berbeda. Lebih buruk lagi, saya tidak bisa menggunakan pengganti yang tidak berpasangan sama sekali. Sebagai gantinya, saya menggeser kata-kata yang sesuai menjadi karakter dalam rentang 0xFF-0x7FFyang dengan mudah hanya membutuhkan dua byte untuk menyandikan, ditambah saya juga mengawali mereka dengan 0x135karakter. Akhirnya saya memetakan rentang itu ke kisaran yang tumpang tindih dengan pengganti yang tidak berpasangan, membuat pasangan BMP yang valid.


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 dari ShreevatsaR

-2 byte dari abccd

Cobalah online!

Membagi pada batas kata ( re.split(r'\b(\w+)\b',s)), lalu memetakan kata huruf kecil ke 𝗅𝗈𝗐𝖾𝗋𝖼𝖺𝗌𝖾 𝗆𝖺𝗍𝗁 𝗌𝖺𝗇𝗌 ( +120153*t.islower()), dan kata-kata huruf besar menjadi 𝗺𝗮𝘁𝗵 𝗺𝗮𝘁𝗵 𝘀𝗮𝗻𝘀 ( +120237*t.isupper()), dan meninggalkan kata-kata dalam huruf campuran saja, lalu joinkembali mencadangkan kata-kata.

Tidak disatukan dan tidak-lambda-red:

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

mungkinkah lebih kecil byte jika Anda menetapkan variabel ke 120237 atau 120153 tergantung pada apakah itu atas atau bawah? Sepertinya mungkin
pfg

1
@ pfg Memang, dapat dengan mudah mencukur 13 byte (hingga 160 ).
ShreevatsaR

@ pfg Sebenarnya, mengganti peta-lambda dengan (mudah dibaca) pemahaman membawanya ke 149 byte .
ShreevatsaR

5
122 :-) Saya akan berhenti di sini; cukup bangga dengan bagaimana golf itu membuatnya lebih mudah untuk dibaca. Hanya dengan Python!
ShreevatsaR

2
-2 dengan menyingkirkan ruang sebelumnyafor
abccd

3

Japt , 34 33 32 31 byte

Termasuk yang tidak dicetak (charcode 153) setelah yang terakhir #.

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

Cobalah


Penjelasan

                        :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

Solusi Asli 32 Byte Japt v2

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

Cobalah

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
Pikiran menambahkan dump XXD?
Stan Strum

Hexdump yang dapat dibalik? Untuk yang belum dicetak.
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)))

(Terima kasih kepada @pfg karena menunjukkan kelemahan penting dalam solusi pertama saya.)

-1 byte, terima kasih kepada @Neil.

Potongan:


Ini hanya berfungsi dengan HTML karena tanda & #, untuk melakukannya dengan JS murni yang perlu Anda gunakan String.fromCodePoint(120237)yang akan menambah ukuran
pfg

Jangan grok itu, tapi saya akan kembali lagi nanti, terima kasih.
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)))berfungsi dengan JS murni tetapi menambahkan banyak byte tambahan
pfg

Oh saya mengerti! Daggum.
Rick Hitchcock

3
Hemat 1 byte dengan menggunakan charCodeAt()tanpa 0.
Neil
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.