Unicode分数


21

形式の分数m/n(mおよびnは互いに素な整数)を指定すると、対応するUnicode分数を出力します。プログラム/関数は、Unicode文字に対応しない入力を受け取ることはありません。配列は、たとえば[2, 3]とは対照的に2/3受け入れられます。m / nとは対照的にm/nも大丈夫です。二つの別々の入力mnも有効です。

処理する必要があるUnicodeの分数は次のとおりです。

½, ⅓, ⅔, ¼, ¾, ⅕, ⅖, ⅗, ⅘, ⅙, ⅚, ⅐, ⅛, ⅜, ⅝, ⅞, ⅑, ⅒

したがって、可能な入力は次のとおりです。

1/2, 1/3, 2/3, 1/4, 3/4, 1/5, 2/5, 3/5, 4/5, 1/6, 5/6, 1/7, 1/8, 3/8, 5/8, 7/8, 1/9, 1/10

文字のUnicodeコードポイントは次のとおりです。

188 ¼
189 ½
190 ¾
8528 ⅐
8529 ⅑
8530 ⅒
8531 ⅓
8532 ⅔
8533 ⅕
8534 ⅖
8535 ⅗
8536 ⅘
8537 ⅙
8538 ⅚
8539 ⅛
8540 ⅜
8541 ⅝
8542 ⅞

テストケース

1/2 -> ½
1/3 -> ⅓
2/3 -> ⅔
1/4 -> ¼
3/4 -> ¾
3/8 -> ⅜
1/10 -> ⅒

コードをできるだけ短くします。これはコードゴルフです。


各分数にUnicodeコードポイントを追加できますか?
ロッド

4
188 ¼, 189 ½, 190 ¾, 8528 ⅐, 8529 ⅑, 8530 ⅒, 8531 ⅓, 8532 ⅔, 8533 ⅕, 8534 ⅖, 8535 ⅗, 8536 ⅘, 8537 ⅙, 8538 ⅚, 8539 ⅛, 8540 ⅜, 8541 ⅝, 8542 ⅞
リーキー修道女

Unicode文字に対応しない入力は許可されません。無効な入力を検出する必要があるということですか?または、これが起こるはずがないと?
アーナルド

@Arnauld後者。
user202729

入力は分数を表すオブジェクトにできますか?
ブラッドギルバートb2gills

回答:


14

JavaScript(Node.js)78 77バイト

@HermanLauensteinのおかげで1バイト節約

カリー化構文の入力を受け取ります(m)(n)

m=>n=>'¾⅗  ⅜    ⅞⅘½⅓¼⅕⅙⅐⅛⅑⅒⅚⅔⅝⅖'[(m*9+n)%31]

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


@ user202729他の場所でも同様の式を使用したはずです。ただし、どの課題について覚えていません。さて、で文字を生成しようとする価値があるかもしれませんがString.fromCharCode()、私は同様のバイト数を期待しています。
アーナルド


@HermanLauensteinありがとう!(最初は最小のモジュロを探していたので、それを逃しました。末尾の空のスロットを削除し始めたときにすでにXORメソッドに切り替えていました。)
Arnauld

あなたもすぐにあなたの答えを投稿した場合、それは...人のほとんどは、あなたのアプローチを使用するようになります
user202729

12

Perl 6の 48の  43バイト

{chr first *.unival==$^m/$^n,(|^191,|(8528..*))}

それを試してみてください

{chr first *.unival==$_,(|^191,|(8528..*))}

それを試してみてください

拡張:

{  # bare block lambda with implicit parameter 「$_」
  chr

    first               # find the first value

      *.unival ==       # which has a unicode value that matches
          $_,           # the input fraction (as a Rational)

      (
        |^191,     # ¼(189) ½(188) ¾(190)
        |(8528..*) # all of the rest
      )
}

同じユニバルを持つ他のUnicode文字を返さないように、検索を分割する必要があることに注意してください。(それ以外の場合は(1..*)


3
待ってください、Perl 6にはこの正確な機能が組み込まれていますか?
エリックアウトゴルファー

2
@EriktheOutgolferそれがそれをどのように見ているのかよくわかりませんが、はい、ファイルのUnicode Character Databaseから9番目の列に反映されたコードポイントの数値にアクセスできますUnicodeData.txt。たとえば、U + 109BC MEROITIC CURSIVE FRACTION ELEVEN TWELFTHSにはcharacterプロパティがありますnv=11/12。空ではない数値を含むコードポイントは約1500個あります。この小さな課題が解決を求めるものではありません。これらは整数または合理的です。
tchrist

7

JavaScript(ES6)、88 86 84 81 79バイト

@Arnauldのおかげで2バイト節約

m=>n=>String.fromCharCode((4%n?8528:188)|"  130470912"[n]*1.3+~-m/-~"3 1"[n-6])

他のJSの答えほど短くはありませんが、各分数のコードポイントを数学的に計算するのは楽しかったです。

テストスニペット

古い方法(82バイト):

m=>n=>String.fromCharCode((4%n?8539:189)-("0x"+"  08162b0a9"[n])+~-m/-~"3 1"[n-6])

@Arnauldのおかげで、これで4バイト節約されました。


1
-2の両方のバージョンにバイト-~'3 1'[n-6]
アルノー


2

SOGL V0.12、51のバイト

5*+'æ%'⁵%"∫}ΣS“LI─{"#!“+ζ}¹"¾ŗŗŗŗŗŗ⅛ŗ⅜½⅝ŗ⅞ ⅓⅔ŗ  ¼”W

ここで試してみてください!

マッピングを使用します (m + n*5)%33%22

説明:

5*                        multiply the 1st input by 5
  +                       add to the 2nd input
   'æ%                    modulo 33
      '⁵%                 module 22

"∫}ΣS“                    push 2153527158
      LI─                 base 11 decode that - [10 0 5 6 7 8 9 1 2]
         {     }          for each of that
          "#!“+             add 8528
               ζ            and convert to a character
                "...”     push "¾ŗŗŗŗŗŗ⅛ŗ⅜½⅝ŗ⅞ ⅓⅔ŗ  ¼", replacing ŗ with each character of the above array
                     W    and get the (m + n*5)%33%22th item from that

2

Clojure、127バイト

(comp{2/3\⅔ 4/5\⅘ 1/3\⅓ 1/2\½ 5/6\⅚ 1/5\⅕ 1/4\¼ 3/5\⅗ 1/7\⅐ 3/4\¾ 2/5\⅖ 1/6\⅙ 1/9\⅑ 1/8\⅛ 3/8\⅜ 1/10\⅒ 5/8\⅝ 7/8\⅞}read-string)

入力をとして受け取り"1/2"、対応する文字を返す無名関数。

Clojure Ratioから分数文字へのストレートマッピング。compそして、Clojureマップが機能であるという事実は、ここで本当に役に立ちました。文字列入力を渡してread-string比率型として評価する必要がありました。これにより、マップ内の膨張する引用符をすべて破棄できるからです。compポイントなしでそれをさせてくれました。「フル」コードは次のとおりです。

(defn to-unicode-fraction [frac]
  (get {2/3\⅔ 4/5\⅘ 1/3\⅓ 1/2\½ 5/6\⅚ 1/5\⅕ 1/4\¼ 3/5\⅗ 1/7\⅐,
        3/4\¾ 2/5\⅖ 1/6\⅙ 1/9\⅑ 1/8\⅛ 3/8\⅜ 1/10\⅒ 5/8\⅝ 7/8\⅞}
       (read-string frac)))

他の答えを見た後、このアプローチはかなりナイーブであることに気付きました。私はそれを改善する方法を探しています。



1

77 48 46バイト

F§§⪪“YW³⦄Eν~vγ@⊖Xμ~?Iw⸿M➙b℅¦⦃”,NN℅⁺℅ι×⁹⁰∨№βι⁹⁴

オンラインでお試しください!リンクは、コードの詳細バージョンです。編集:ASCII文字からマルチバイト文字へのマッピングにより29 31バイトを保存しました。説明:

    “....”                  Compressed string `R,EFcGbIMDO,H J,K  Pd,L,N Q,`
   ⪪      ,                 Split on commas
           N                First input
  §                         Circularly index
            N               Second input
 §                          Circularly index
F                           "Loop over" character (loop variable `i`)
                     №βι    Count of `i`s in lowercase letters
                    ∨   ⁹⁴  Replace zero result with 94
                 ×⁹⁰        Multiply by 90
               ℅ι           Take ordinal of `i`
              ⁺             Sum
             ℅              Convert back to character
                            Implicitly print



0

Vimスクリプト、67バイト

fu!F(m,n)
if a:n==10|norm a⅒ 
else|exe'norm a'.a:m.a:n
endif
endfu

Vimの持つ機能の動作有向グラフ彼らはiwth開始後に入力されているctrl-k.どうやら、関連するctrl-k文字の後にexe'norm上記のコードブロックでレンダリングされていません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.