Unicode分数


21

给定格式的分数m/n(其中m和n是互质整数),输出相应的Unicode分数。您的程序/函数不应接受任何与Unicode字符不对应的输入。接受数组(例如[2, 3]与相对)2/3m / 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代码点吗?
Rod

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

您将不会允许任何与Unicode字符不对应的输入。这是否意味着我们必须检测到无效输入?还是不应该发生这种情况?
Arnauld

@Arnauld后一个。
user202729 '17

输入可以是代表分数的对象吗?
布拉德·吉尔伯特b2gills

Answers:


14

JavaScript(Node.js)78 77字节

感谢@HermanLauenstein,节省了1个字节

以currying语法接受输入(m)(n)

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

在线尝试!


@ user202729我确定我在其他地方使用了类似的公式。不过,我不记得要面对哪个挑战。现在,可能值得尝试使用生成字符String.fromCharCode(),但是我希望字节数相似。
Arnauld


@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 内置了此功能吗?
暴民埃里克(Erik the Outgolfer)'17年

2
@EriktheOutgolfer我不确定这是怎么看的,但是是的,您可以从文件的Unicode字符数据库访问第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]
Arnauld

7

APL(Dyalog)88 64字节

{⎕UCS(⌊(⍺-1)÷(1+⍵≡8)⌈4×⍵≡6)-(291194049⊤⍨1012)[⍵]-1898539××⍵|4}

在线尝试!

-3感谢dzaima

使用ETHproductions的84字节方法。

f←包括在TIO不计,因为它放在那里只是为了能够测试功能。


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

Python 3,87字节

lambda n:'⅛⅑⅜¾⅗⅔⅚⅖⅝⅘⅞⅒½⅓¼⅕⅙⅐'[int(n[::2])%50%36%31%18]

在线尝试!

要么

lambda n:'⅝⅔⅜⅖__⅞¾⅗⅘_⅒½⅓¼⅕⅙⅐⅛⅑⅚'[int(n[::2])%36%27%22]

在线尝试!



0

Vim脚本,67字节

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

该功能适用​​于Vim 有向图ctrl-k.显然,在将它们启动后才输入它们,上述代码块中未呈现到ctrl-k之后的相关字符exe'norm

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.