数字の並べ替え


21

Unicode文字のくぼみの中には、「Number Forms」という名前の(現在の)63文字のUnicodeブロックがあります。 ↊(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

テストケース:

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

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

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

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

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

4つのシンボル(最後のケースで使用されているもの)はUnicode番号ではありませんが、まだ数値を持っているため、組み込みを投稿する前に必ず確認してください。

ルール:

  • 今後このブロックにさらに文字が割り当てられる場合、それらをサポートするためにコードを更新する必要はありません。
  • 同じ値を持つ文字の順序は関係ありません。
  • IOは柔軟です。
    • ただし、数値ではなく文字として出力する必要があります
  • 標準の抜け穴は禁止されています。
  • キャラクターの数値を取得できるビルトインを禁止していませんが、可能であればビルトインではない回答を追加することもお勧めします。
  • これはなので、各言語のバイト単位の最短回答が勝ちです!がんばろう!

9
RIPモノスペース:(
ジョーキング

回答:


6

Pythonの3216の 213バイト

TFeldのおかげで-3バイト

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バイトを節約できます(-1最小のリターンを見つける)
TFeld

4

Perl 6、57バイト

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

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

ハッシュで4つの例外文字を検索するか、組み込みのunivalメソッドにフォールバックします。


コロンの後にスペースは必要ありません。また、リンクは、Whatever lambdaではなく、まだコードブロック内にあります
Jo King

4

05AB1E(レガシー)192 74 63 61 バイト

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

05AB1Eのコードページの文字のみを使用して-118バイトなので、UTF-8エンコードを使用する必要はありません。@Adnanの
おかげで-11バイト。@Grimyの おかげで-2バイト。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

Σ            # 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в₂+ですか?

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バイトのファイルとして表現することはできません。これにより、UTF-8(実際は192バイト)にフォールバックするように強制されます
アドナン

1
@JoKingしたがって、現在は05AB1Eのコードページの文字のみを使用しています。;)まだ退屈なアプローチですが、何らかの算術パターンを見つけることができるかどうかを確認します。
ケビン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в
アドナン・

1
うーん、それは右角かっこを登録しない解析エラーのようです。これを調べます。
アドナン

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マッピングは、目的の数値順序に対応してから、変換されます。編集:数字ではなく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-codepoint)の代わりに、(key-sum_of_digits(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)

文字列の中央に戻るのは読みやすくするためだけです。バイトカウントが正しくなったと思います(数字の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

ああ、それは残念ですが、私に知らせてくれてありがとう!
ニール


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