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


28

前書き

単語を2つの異なる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
♫哲学の単なる𝗆𝖺𝗍𝗁𝗌𝖺𝗇𝗌厳格さ、感覚、そして実用性...♫
エソランジングフルーツ

13
おっ!サイドバーに太字のタイトルがありますか?何?私は…わかりません…インターネットが壊れていますか?持っているあなたは、インターネットが壊れて?
Zizouz212

26
i.stack.imgur.com/R4V3C.png私が...ボックス、棒グラフや何かを積み重ねについては、この挑戦をして考えてここに来た
マッテオイタリア

8
これは、打撃されるべきではありませんでした。この問題は、単純な文字の音訳よりもはるかに困難です。引用された課題の主要な答えは、同じ方法を使用して簡単に、または競争的に移すことはできません(注意、私の網膜は大きくありません)
コナーオブライエン

回答:


10

QuadR、45 43バイト

-2 ngnに感謝します。

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

TIOはQuadRからのUnicode出力をスクランブルするので、対話型セッションでQuadRをAPLライブラリとして使用するスクリーンショットを次に示します。 インタラクティブセッションのトランスクリプト


\w+ 単語を次のコードを適用した結果に置き換えます。

⍵MU niversal C haracter S etコードポイントが  発見した単語
⎕UCS は、 96がそれぞれが 一意であるよりも大きいかどうかを0または1に  格納します あるいはまたはまたは でその店舗 とは第一のピック  ものと乗算84  と追加120153 ...  乗算それと次  タリー(長さ)の(単一ケースであれば、もし混合場合)  0又は2であるかどうか1それよりも大きい(単一ケースの場合、混合ケースの場合)  元のコードポイントがそれに追加される
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>≢b)×120153+84×⊃b←∪96>a←⎕UCS⍵.Match}

TIOはDyalog APLからのUnicode出力をスクランブルするため、実行中のコードのスクリーンショットを次に示します。

アクションのコード


'\w+'⎕R PCRE Rは、以下を適用した結果で単語を置き換えます…

{... } 匿名ラムダ:

 ⍵.Match 見つかった言葉

 ⎕UCSU niversal C haracter Sことの他のコードポイント

 a← それを保管する a

 96> 96がそれらのそれぞれより大きいかどうかは0または1

 ∪ 唯一のユニークなものを取ります。[0]または[1]または[0,1]または[1,0]

 b← それを保管する b

 ⊃ その中から最初のものを選びます

 84× 84を掛けます

 120153+ 120153を追加します

 (… )× 次をそれに掛けます:

  ≢b 集計(長さ)b(1単一ケースの場合、2混合ケースの場合)

  2> 2がそれより大きいかどうかについては0または1(1大文字と小文字が0混在する場合、大文字と小文字が混在する場合)

 a+ それに追加された元のコードポイント

 ⎕UCS 結果のコードポイントを文字に変換します


57バイト:'\b([A-Z]+|[a-z]+)\b'⎕R{⎕UCS(⎕UCS+120153+84×∊∘⎕A)⍵.Match}
エリック・ザ・アウトゴルファー

@EriktheOutgolferありがとう。どうしてタシトゥに行くことを考えなかったのか
アダム

わかりませんが、疲れたときに起こります。:)
エリック・ザ・アウトゴルファー

@EriktheOutgolfer実際に、私は自宅でこのソフトウェアをAPLキーボードレイアウトなしで妻のコンピューターを使って書いたと思います…
アダム

@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]

オンラインでお試しください!

関数を定義し@、を取得しUStringて返す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

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

オンラインでお試しください!

かなり簡単です。#オペレータがセットかかりscharctersの(大文字または小文字)ワードw、及び数学サンセリフセットr。単語内のすべての文字が含まれている場合は数学sansフォントで単語を返し、sそうでない場合は空のリストを返します。このt関数は単語を受け取り、3つの可能性(すべて上位、すべて下位、または混合)をすべて試し、空でない最初の可能性を返します。このf関数は、を使用して最初の単語を見つけ、spanそれを変換tし、区切り文字(.またはスペース)で連結し、残りの文字列で繰り返します。別のケースは、spanがセパレータを見つけられない場合です。文字列を変換するだけです。

編集:2バイトを削除してくれた@Laikoniに感謝します!「3つの引数を取る演算子」のこと全体に慣れていない


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をエンコードするのに2バイトしか必要としない範囲の文字にシフトし、さらにその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バイト

-abcddから-2バイト

オンラインでお試しください!

単語の境界で分割し(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実際、map-lambdaを(読みやすい)内包表記に置き換えると、149バイトになります。
ShreevatsaR

5
122 :-)ここでやめます。さらにゴルフをすることで読みやすくなったことを非常に誇りに思っています。Pythonのみで!
シュ

2
-2前にスペースをfor
削除

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ダンプを追加することに注意してください。
スタン・ストラム

リバーシブルhexdump?印刷できないものについて。
スタン・ストラム


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に感謝します。)

@Neilのおかげで-1バイト。

スニペット:


これは、あなたが使用する必要があり、純粋なJSでそれを行うには、理由&#のHTMLで動作する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。
ニール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.