数字排序


21

在Unicode字符的凹处内,有一个(当前)63个字符的Unicode块,称为“数字形式”,该字符块由具有数值的字符组成,例如罗马数字Ⅻ,↉或like之类的小数部分,或诸如↊(10)或ↈ(100000)。

您的任务是编写一个程序或函数,当在此块中获得一个分配的Unicode字符列表时,该列表将按每个字符的数值排序。

字符和值的(可排序的)列表可以在Wikipedia Page上找到。

为了自成一体,这是代码点及其值的列表:

Hex     Char   Value
0x00BC: ¼   = 1/4 or 0.25
0x00BD: ½   = 1/2 or 0.5
0x00BE: ¾   = 3/4 or 0.75
0x2150: ⅐   = 1/7 or 0.142857
0x2151: ⅑   = 1/9 or 0.111111
0x2152: ⅒   = 1/10 or 0.1
0x2153: ⅓   = 1/3 or 0.333333
0x2154: ⅔   = 2/3 or 0.666667
0x2155: ⅕   = 1/5 or 0.2
0x2156: ⅖   = 2/5 or 0.4
0x2157: ⅗   = 3/5 or 0.6
0x2158: ⅘   = 4/5 or 0.8
0x2159: ⅙   = 1/6 or 0.166667
0x215A: ⅚   = 5/6 or 0.833333
0x215B: ⅛   = 1/8 or 0.125
0x215C: ⅜   = 3/8 or 0.375
0x215D: ⅝   = 5/8 or 0.625
0x215E: ⅞   = 7/8 or 0.875
0x215F: ⅟   = 1
0x2160: Ⅰ   = 1
0x2161: Ⅱ   = 2
0x2162: Ⅲ   = 3
0x2163: Ⅳ   = 4
0x2164: Ⅴ   = 5
0x2165: Ⅵ   = 6
0x2166: Ⅶ   = 7
0x2167: Ⅷ   = 8
0x2168: Ⅸ   = 9
0x2169: Ⅹ   = 10
0x216A: Ⅺ   = 11
0x216B: Ⅻ   = 12
0x216C: Ⅼ   = 50
0x216D: Ⅽ   = 100
0x216E: Ⅾ   = 500
0x216F: Ⅿ   = 1000
0x2170: ⅰ   = 1
0x2171: ⅱ   = 2
0x2172: ⅲ   = 3
0x2173: ⅳ   = 4
0x2174: ⅴ   = 5
0x2175: ⅵ   = 6
0x2176: ⅶ   = 7
0x2177: ⅷ   = 8
0x2178: ⅸ   = 9
0x2179: ⅹ   = 10
0x217A: ⅺ   = 11
0x217B: ⅻ   = 12
0x217C: ⅼ   = 50
0x217D: ⅽ   = 100
0x217E: ⅾ   = 500
0x217F: ⅿ   = 1000
0x2180: ↀ   = 1000
0x2181: ↁ   = 5000
0x2182: ↂ   = 10000
0x2183: Ↄ   = 100
0x2184: ↄ   = 100
0x2185: ↅ   = 6
0x2186: ↆ   = 50
0x2187: ↇ   = 50000
0x2188: ↈ   = 100000
0x2189: ↉   = 0
0x218A: ↊   = 10
0x218B: ↋   = 11

测试用例:

['½','ↆ','ↂ','⅒','Ⅽ','⅑','ⅷ'] -> ['⅒','⅑','½','ⅷ','ↆ','Ⅽ','ↂ']

['¼','↋','↉','ↅ','⅐','⅟','Ⅻ','ⅺ'] -> ['↉','⅐','¼','⅟','ↅ','↋','ⅺ','Ⅻ']

['¼','½','¾','⅐','⅑','⅒','⅓','⅔','⅕','⅖','⅗','⅘','⅙','⅚','⅛','⅜','⅝','⅞','⅟'] -> ['⅒','⅑','⅛','⅐','⅙','⅕','¼','⅓','⅜','⅖','½','⅗','⅝','⅔','¾','⅘','⅚','⅞','⅟']

'⅞ⅾ↊ↄⅨⅮⅺↁⅸⅰⅩⅱⅶ¾ⅧↅↃ↋ↆ⅔ⅼⅲ⅘⅒ⅽⅦ⅕ⅤⅭⅳↂⅪⅬⅯↇⅠⅷ⅛Ⅵ½ⅵ¼ⅻ⅐Ⅱ⅜⅗⅝⅚Ⅳ⅓ⅴ↉ⅿⅫⅹↀↈ⅙⅑Ⅲ⅖⅟' -> '↉⅒⅑⅛⅐⅙⅕¼⅓⅜⅖½⅗⅝⅔¾⅘⅚⅞⅟ⅠⅰⅡⅱⅢⅲⅣⅳⅤⅴⅥⅵↅⅦⅶⅧⅷⅨⅸⅩⅹ↊Ⅺⅺ↋ⅫⅻⅬⅼↆⅭⅽↄↃⅮⅾⅯⅿↀↁↂↇↈ'

['Ↄ','ↄ','↊','↋'] -> ['↊','↋','ↄ','Ↄ']

请注意,尽管其中四个符号(在最后一种情况下使用的符号)仍具有数字值,但它们不是unicode数字,因此请确保在发布内置符号之前先进行检查。

规则:

  • 如果将来再有其他字符分配给该块,则无需更新代码以支持它们。
  • 具有相同值的字符顺序无关紧要。
  • IO是灵活的
    • 输出必须是字符,而不是数值
  • 禁止使用标准漏洞
  • 我并没有禁止可获取字符数值的内置函数,但我鼓励尽可能添加一个非内置答案。
  • 这是,因此每种语言的最短答案以字节为单位!祝好运!

9
RIP monospacing :(
Jo King

Answers:


6

Python 3中216个 213字节

-3个字节归功于TFeld

lambda l:sorted(l,key='⅒⅑⅐⅙⅕¼⅓⅖½⅗⅔¾⅘⅚⅟ⅠⅰⅡⅱⅢⅲⅣⅳⅤⅴⅥⅵↅⅦⅶⅧⅷⅨⅸⅩⅹ↊Ⅺⅺ↋ⅫⅻⅬⅼↆⅭⅽↃↄ⅛⅜Ⅾⅾ⅝⅞Ⅿⅿↀↁↂↇↈ'.find)

在线尝试!

内置可获取数值的111字节

lambda l:sorted(l,key=lambda c:[10,11,100,100,0]['↊↋Ↄↄ'.find(c)]or numeric(c))
from unicodedata import*

在线尝试!


4
您可以通过删除保存3个字节的字符串(find返回-1这是最小的)
TFeld

4

Perl 6、57字节

*.sort: {%(<Ↄ 100 ↄ 100 ↊ 10 ↋ 11>){$_}//.unival}

在线尝试!

只需在哈希中查找四个特殊字符,或退回到内置unival方法。


您不需要在冒号后面加空格。此外,你的链接仍然是一个代码块,而不是不管拉姆达
乔金

4

05AB1E(旧版)192 74 63 61 字节

Σ•Bšā¿ÑáζΔÕæ₅"®GÙ₂®°ƶío"§óÏ4¸bćÔ!₃ùZFúÐìŸ
,λ₂ϦP(Ì•65в₂+sÇт%k

-118字节仅使用05AB1E的代码页字符,因此我们不需要使用UTF-8编码。
-11个字节,感谢@Adnan
-2个字节感谢@Grimy

在线尝试验证所有测试用例

说明:

Σ            # Sort the input by:
 Bšā¿ÑáζΔÕæ₅"®GÙ₂®°ƶío"§óÏ4¸bćÔ!₃ùZFúÐìŸ
 ,λ₂ϦP(Ì•65в₂+
             #  List of ASCII values modulo-100 of the characters we want to sort
 sÇ          #  Get the ASCII value of the current input-character
   т%        #  Take modulo 100 of this ASCII value
 k           #  And get the index in the list of ASCII values, as sorting order

那是什么•Bšā¿ÑáζΔÕæ₅"®GÙ₂®°ƶío"§óÏ4¸bćÔ!₃ùZFúÐìŸ\n,λ₂ϦP(Ì•65в₂+

根据字符modulo-100的顺序,我们得到以下列表:

[85,30,29,39,28,37,33,88,31,40,34,89,35,41,32,90,36,38,42,43,44,60,45,61,46,62,47,63,48,64,49,65,81,50,66,51,67,52,68,53,69,86,54,70,87,55,71,56,72,82,57,73,79,80,58,74,59,75,76,77,78,83,84]

这些是由以下程序生成的:

"↉⅒⅑⅛⅐⅙⅕¼⅓⅜⅖½⅗⅝⅔¾⅘⅚⅞⅟ⅠⅰⅡⅱⅢⅲⅣⅳⅤⅴⅥⅵↅⅦⅶⅧⅷⅨⅸⅩⅹ↊Ⅺⅺ↋ⅫⅻⅬⅼↆⅭⅽↃↄⅮⅾⅯⅿↀↁↂↇↈ"Çт%

在线尝试。

•Bšā¿ÑáζΔÕæ₅"®GÙ₂®°ƶío"§óÏ4¸bćÔ!₃ùZFúÐìŸ\n,λ₂ϦP(Ì•65в₂+是此列表的较短变体,方法是采用压缩数字 1485725021600091112740267145165274006958935956446028449609419704394607952161907963838640094709317691369972842282463,然后将其转换为Base-65,然后将每个数字加26。

在线尝试验证列表是否相同


1
是的,不是所有这些字符都采用05AB1E的编码,因此为192个字节。
Okx

2
是的,不可能将此代码表示为一个68字节的文件,这迫使我们回退到实际上是192个字节的 UTF-8 。
阿德南'18

1
@JoKing因此,现在我仅使用05AB1E的代码页中的字符。;)仍然是一种无聊的方法,但是会看看我是否可以找到某种算术模式。
凯文·克鲁伊森 Kevin Cruijssen)

1
我认为您可以替换"]&%/$-)`'0*a+1(b,.234D5E6F7G8H9IY:J;K<L=M^>N_?O@PZAQWXBRCSTUV[\"Ç8-•4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91в
Adnan

1
嗯,这似乎是一个解析错误,没有重新添加右括号。我会研究这个。
阿德南'18

3

视网膜1 93字节(UTF-8)

2{O`.
T`¼-¾⅐-↋\LI ^]Q@TU\\[ZYWSPNK\HFDB?=;975X\VR\OMJG\ECA><:86432\-)#1%0,*&.(!"$/+'`Ro

在线尝试!说明:按代码点顺序对字符进行排序,然后在数字字符和ASCII字符之间进行映射,以便具有最低值的数字字符映射具有最低代码点的ASCII字符,反之亦然。然后重复练习,以便在将字符转换回之前,按照此ASCII映射的顺序对字符进行排序,这与所需的数字顺序相对应。编辑:通过指定ASCII字符而不是数字字符的顺序保存了100(!)字节。


3

果冻,55 字节

O%70‘“$Żz*ṀḢD⁹VṢaʠƝ lẹkƝʋ9⁽ƭXmż4#⁺3ç%|ọṢLxƈ⁽}ÞƇ2’Œ?¤iµÞ

一个接受字符列表的单子链接,该链接产生一个字符列表。

在线尝试!

怎么样?

比起看起来要简单得多,因为“$Żz*ṀḢD⁹VṢaʠƝ lẹkƝʋ9⁽ƭXmż4#⁺3ç%|ọṢLxƈ⁽}ÞƇ2’使用Jelly的代码页作为数字在基数250中只是一个很大的数字,我将使用“...’它代替它。

O%70‘“...’Œ?¤iµÞ - Link: list of characters
               Þ - sort by:
              µ  -   the monadic function (i.e. f(character)):
O                -     get the ordinal value of the character
 %70             -     modulo by 70 (get the remainder after dividing by 70)
                 -       - giving integers in [0,69] excluding [52,58]
    ‘            -     increment (below code pattern can't have anything but '↉' map to 0)
            ¤    -     nilad followed by link(s) as a nilad:
     “...’       -       literal 7826363328008670802853323905140295872014816612737076282224746687856347808481112431487214423845098801
          Œ?     -       get the permutation of natural numbers [1,N] with minimal N such
                 -         that this permutation would reside at the given index in a
                 -         sorted list of all permutations of those same numbers
                 -         -> [46,52,53,54,55,56,57,58,61,60,70,59,68,64,49,62,1,65,50,66,2,63,51,67,69,3,4,5,21,6,22,7,23,8,24,9,25,10,26,42,11,27,12,28,13,29,14,30,47,15,31,48,16,32,17,33,43,18,34,40,41,19,35,20,36,37,38,39,44,45]
             i   -     first index of (the ordinal mod 70 plus 1) in that list

在旁边

具有讽刺意味的是,我可以召集的最接近“使用内置方法”的字节85个字节,它使用了压缩字符串:

from unicodedata import*; copy_to( atoms['
'], numeric( atoms['
'].call()))

它在换行符上分割并与s 结合在一起以提供Python代码:

from unicodedata import*; copy_to( atoms['⁸'], numeric( atoms['⁸'].call()))

它可以在Jelly的解释器中执行-将Unicode字符的数字值放入左侧参数nilad中,以备后用。


3

Japt,72个字节

ñ@`'%!x("y#) z$&*+,<-=.>/?0@1aq2b3c4d5ev6fw7g8hr9iop:j;klmn¡`u bXcuL

尝试运行所有测试用例


说明

ñ@                 :Sort by passing each X through a function
  `...`            :  A compressed string, which itself contains a bunch of unprintables (See below for codepoints of original string)
       u           :  Uppercase
         b         :  Index of
          Xc       :   Charcode of X
            uL     :   Mod 100 and get character at that codepoint

代码点

30,29,39,28,37,33,120,31,40,34,121,35,41,32,122,36,38,42,43,44,60,45,61,46,62,47,63,48,64,49,97,113,50,98,51,99,52,100,53,101,118,54,102,119,55,103,56,104,114,57,105,111,112,58,106,59,107,108,109,110,115,116

原始解决方案,90 89 88字节

ñ!b`(&" )#$*!%'+,-=.>/?0@1a2br3c4d5e6fw7gx8h9:jpq;k<lmÍ/`®iv u nLõd)dÃi6'¼ iA'½ iE'¾

尝试运行所有测试用例


说明

   `...`                                :A compressed string, which itself contains a bunch of unprintables (See below for codepoints of original string)
        ®                               :Map
         iv                             :  Prepend "v"
            u                           :  Convert to uppercase
               Lõ                       :  Range [1,100]
                 d                      :  Characters at those codepoints
              n   )                     :  Convert from that base to base-10
                   d                    :  Get the character at that codepoint
                    Ã                   :End map
                     i6'¼               :Insert "¼" at (0-based) index 6
                          iA'½          :Insert "½" at index 10
                               iE'¾     :Insert "¾" at index 14
ñ                                       :Sort the input array
 !b                                     :  By finding the index of the current element in the string above

代码点

31,30,40,29,38,34,32,41,35,36,42,33,37,39,43,44,45,61,46,62,47,63,48,64,49,97,50,98,114,51,99,52,100,53,101,54,102,119,55,103,120,56,104,57,105,115,58,106,112,113,59,107,60,108,109,110,111,116,117

3

05AB1E,56 53 51 50 49 48字节

ΣÇ©1ö•Ω‘~Èr–Õî5®Î¼ÓÂ∍_OûR•42в•мjāl†£•₂°*S>ÅΓ®Íè+

在线尝试!

此解决方案的核心是将Unicode代码点映射到排序键的压缩列表。对应于相同数字的字符被映射到相同的键,因此我们只需要40个不同的键。

70是最小的数字,通过它我们可以对所有输入代码点取模并获得不同的结果。由于05AB1E中的索引会回绕,因此我们不需要显式地70%确定列表的长度为70。

注意,带有连续键的连续代码点有很长的一段。因此,编码(键-代码点)而不是简单地(键)会给出相同数字的长段,可以进行游程长度编码。但是,代码点的范围非常大(该死的0xBC .. 0xBE),这将是一个问题。因此,我们对(key-sum_of_digits(codepoint))进行了编码,而不是(key-codepoint),它不幸地将拉伸长度限制为10,但是在减小编码值的范围方面做得很好。(当然也可以使用其他功能,例如常数%的代码点,但数字总和可获得最佳结果)。

此外,事实证明,将游程长度编码将列表旋转2可以很好地发挥作用,因此我们在索引之前从代码点减去2。

•Ω‘~Èr–Õî5®Î¼ÓÂ∍_OûR•42в    # compressed list [25, 34, 27, 36, 30, 38, 29, 35, 41, 0, 28, 16, 19, 31, 7, 4, 11, 17, 22, 13, 16, 17, 20, 8, 19, 4, 18, 21]
•мjāl†£•                    # compressed integer 79980000101007
        ₂°*                 # times 10**26
           S                # split to a list of digits
            >               # add 1 to each
             ÅΓ             # run-length decode, using the first list as elements and the second list as lengths

Σ                           # sort by
 Ç©1ö                       # sum of digits of the codepoint
           +                # plus
     ...  è                 # the element of the run-length decoded list
        ®Í                  # with index (codepoint - 2) % 70


1

T-SQL,207个字节

SELECT*FROM t ORDER BY
CHARINDEX(c,N'⅒⅑⅛⅐⅙⅕¼⅓⅜⅖½⅗⅝⅔¾⅘⅚⅞⅟ⅠⅰⅡⅱⅢⅲⅣⅳⅤⅴⅥ
              ⅵↅⅦⅶⅧⅷⅨⅸⅩⅹ↊Ⅺⅺ↋ⅫⅻⅬⅼↆⅭⅽↃↄⅮⅾⅯⅿↀↁↂↇↈ'COLLATE Thai_BIN)

字符串中间的return仅出于可读性。我想我得到了正确的字节数(3个数字字符为1字节,其余为2字节),字符数为148。

我按升序对字符串进行了预排序,但没有其他答案所建议的(返回0)。

我使用了任何二进制排序规则,Thai_BIN因为它的名称最短。(SQL中的排序规则规定了字符排序/比较的方式,我需要二进制,因此每个字符只能匹配自己。)

根据我们的IO标准,通过字段c预先存在的表t进行输入。NCHAR(1)

如果使用二进制归类定义输入表本身,则可以省去16个字节:

CREATE TABLE t(c NCHAR(1) COLLATE Thai_BIN)

如果您不使用二进制排序规则,哪些字符会彼此匹配?
尼尔

1
@Neil好,取决于的其它整理你使用,实际上!:)。我注意到的最明显的一个(使用我的服务器默认SQL_Latin1_General_SP1_CI_AS)是大写和小写罗马数字彼此匹配。哪个...嗯... 在这里实际上可能我有用,因为它们解析为相同的数字。但是,如果归类名称过长,则会抵消节省的费用。BRB,必须测试更多……
BradC

1
@Neil Nope,不好。对于非二进制排序规则,只有10个不常见的字符(⅐⅑⅒Ↄↄↅↆↇↈ↉↊↋如果您很好奇)会相互匹配。
BradC

啊,太可惜了,但是谢谢你让我知道!
尼尔,


1

Perl 6的13 52个字节

*.sort:{%(<Ↄ 99  99  10  11>){$_}//.EVAL}

在线尝试!


2
使用eval并不是作弊,但这根本不能解决挑战。52有效的方法:*.sort:{%(<Ↄ 99 ↄ 99 ↊ 10 ↋ 11>){$_}//.EVAL}
严峻的
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.