Sắp xếp các số


21

Trong phần lõm của các ký tự Unicode, tồn tại một khối Unicode gồm (hiện tại) 63 ký tự có tên "Biểu mẫu số", bao gồm các ký tự có các giá trị số như chữ số La Mã, các phân số thô tục như ⅑ hoặc hoặc các ký tự lạ như (10) hoặc (100000).

Nhiệm vụ của bạn là viết một chương trình hoặc hàm, khi được đưa ra một danh sách các ký tự Unicode được gán trong khối này, sắp xếp danh sách theo các giá trị số của mỗi ký tự.

Một danh sách (sắp xếp) các ký tự và giá trị có thể được tìm thấy trên Trang Wikipedia .

Để được khép kín, đây là danh sách các điểm mã và giá trị của chúng:

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

Các trường hợp thử nghiệm:

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

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

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

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

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

Lưu ý rằng bốn trong số các ký hiệu (những ký hiệu được sử dụng trong trường hợp cuối cùng) không phải là số unicode, mặc dù chúng vẫn có giá trị bằng số, vì vậy hãy đảm bảo kiểm tra trước khi chỉ đăng một tích hợp.

Quy tắc:

  • Nếu có thêm ký tự nào được gán cho khối này trong tương lai, bạn sẽ không cần cập nhật mã của mình để hỗ trợ chúng.
  • Thứ tự các ký tự có giá trị giống hệt nhau không thành vấn đề.
  • IO rất linh hoạt .
    • Đầu ra phải là các ký tự, không phải là các giá trị số
  • Lỗ hổng tiêu chuẩn bị cấm.
  • Tôi không cấm các phần dựng sẵn có thể lấy giá trị bằng số của một ký tự, nhưng tôi cũng khuyến khích thêm một câu trả lời không dựng sẵn nếu có thể.
  • Đây là , vì vậy câu trả lời ngắn nhất tính theo byte cho mỗi ngôn ngữ sẽ thắng! Chúc may mắn!

9
RIP đơn cách :(
Jo King

Câu trả lời:


6

Python 3 , 216 213 byte

-3 byte nhờ TFeld

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

Hãy thử trực tuyến!

Với tích hợp sẵn, tìm nạp giá trị số, 111 byte

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

Hãy thử trực tuyến!


4
Bạn có thể lưu 3 byte bằng cách xóa khỏi chuỗi (tìm trả về giá trị -1nhỏ nhất)
TFeld 24/07/18

4

Perl 6 , 57 byte

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

Hãy thử trực tuyến!

Chỉ cần tra cứu bốn ký tự đặc biệt trong hàm băm hoặc quay lại univalphương thức tích hợp.


Bạn không cần không gian sau dấu hai chấm. Ngoài ra, liên kết của bạn vẫn ở trong một khối mã chứ không phải là lambda
Jo King

4

05AB1E (di sản) , 192 74 63 61 byte

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

-118 byte chỉ bằng cách sử dụng các ký tự của trang mã 05AB1E, vì vậy chúng tôi không cần sử dụng mã hóa UTF-8.
-11 byte nhờ @Adnan .
-2 byte nhờ @Grimy .

Dùng thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

Σ            # 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

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

Dựa trên thứ tự các ký tự modulo-100, chúng ta có được danh sách sau:

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

Chúng được tạo bởi chương trình sau:

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

Hãy thử trực tuyến.

•Bšā¿ÑáζΔÕæ₅"®GÙ₂®°ƶío"§óÏ4¸bćÔ!₃ùZFúÐìŸ\n,λ₂ϦP(Ì•65в₂+là một biến thể ngắn hơn của danh sách này bằng cách lấy số nén 1485725021600091112740267145165274006958935956446028449609419704394607952161907963838640094709317691369972842282463 , sau đó chuyển đổi nó thành Base-65, sau đó thêm 26 vào mỗi danh sách.

Hãy thử trực tuyếnxác minh rằng các danh sách là như nhau .


1
Có, không phải tất cả các ký tự đó đều ở dạng mã hóa của 05AB1E, do đó sẽ là 192 byte.
Okx

2
Vâng, không thể biểu diễn mã này dưới dạng tệp 68 byte buộc chúng ta phải quay lại UTF-8, thực sự là 192 byte .
Ad Nam

1
@JoKing Vì vậy, hiện tại tôi chỉ sử dụng các ký tự từ trang mã của 05AB1E. ;) Vẫn là một cách tiếp cận nhàm chán, nhưng sẽ xem liệu tôi có thể tìm thấy một số kiểu mẫu số học không.
Kevin Cruijssen

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

1
Hmm, đó có vẻ là một lỗi phân tích cú pháp không đăng ký khung đóng. Tôi sẽ xem xét điều này.
Ad Nam

3

Võng mạc , 1 93 byte (UTF-8)

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

Hãy thử trực tuyến!Giải thích: Sắp xếp các ký tự theo thứ tự điểm mã, sau đó ánh xạ giữa các ký tự số và ký tự ASCII sao cho các ký tự số có giá trị thấp nhất ánh xạ các ký tự ASCII có điểm mã thấp nhất và ngược lại. Sau đó lặp lại bài tập, để các ký tự được sắp xếp theo thứ tự ánh xạ ASCII này, tương ứng với thứ tự số mong muốn, trước khi chúng được chuyển đổi trở lại. Chỉnh sửa: Đã lưu 100 (!) Byte bằng cách chỉ định thứ tự của các ký tự ASCII thay vì các ký tự số.


3

Thạch , 55 byte

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

Một liên kết đơn âm chấp nhận một danh sách các ký tự mang lại một danh sách các ký tự.

Hãy thử trực tuyến!

Làm sao?

Đơn giản hơn nhiều so với vẻ ngoài của nó “$Żz*ṀḢD⁹VṢaʠƝ lẹkƝʋ9⁽ƭXmż4#⁺3ç%|ọṢLxƈ⁽}ÞƇ2’chỉ là một số lượng lớn trong cơ sở 250 sử dụng trang mã của Jelly làm chữ số, tôi sẽ sử dụng “...’ở vị trí của nó.

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

Qua một bên

Trớ trêu thay, gần nhất là "sử dụng một cách tiếp cận tích hợp" tôi có thể tập hợp được là 85 byte , điều này sử dụng một chuỗi nén:

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

được phân chia trên dòng mới và được nối với s để cung cấp mã Python:

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

có thể thực thi được trong trình thông dịch của Jelly - nó sẽ đặt giá trị số của ký tự Unicode vào nilad đối số bên trái, để sử dụng sau.


3

Japt , 72 byte

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

Hãy thử nó hoặc chạy tất cả các trường hợp thử nghiệm


Giải trình

ñ@                 :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

Mật mã

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

Giải pháp gốc, 90 89 88 byte

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

Hãy thử nó hoặc chạy tất cả các trường hợp thử nghiệm


Giải trình

   `...`                                :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

Mật mã

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 byte

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

Hãy thử trực tuyến!

Cốt lõi của giải pháp này là một danh sách nén ánh xạ mã unicode trỏ tới một khóa sắp xếp. Các ký tự tương ứng với cùng một số được ánh xạ tới cùng một khóa, vì vậy chúng ta chỉ cần 40 khóa khác nhau.

70 là số nhỏ nhất mà chúng ta có thể điều chỉnh tất cả các điểm mã đầu vào và nhận được kết quả khác biệt. Vì việc lập chỉ mục trong 05AB1E bao quanh, chúng tôi không cần phải rõ ràng 70%, chỉ cần đảm bảo danh sách có độ dài 70.

Lưu ý rằng có các đoạn mã dài liên tiếp với các phím liên tiếp. Do đó, mã hóa (khóa - mã hóa) chứ không chỉ đơn giản là (khóa) cho các đoạn dài giống hệt nhau, có thể được mã hóa theo chiều dài. Tuy nhiên, phạm vi của các điểm mã là rất lớn (chết tiệt 0xBC .. 0xBE), đó sẽ là một vấn đề. Vì vậy, thay vì (key - codepoint), chúng tôi mã hóa (key - sum_of_digits (codepoint)), không may giới hạn độ dài kéo dài xuống 10, nhưng làm khá tốt trong việc giảm phạm vi của các giá trị được mã hóa. (Các hàm khác tất nhiên là có thể, như codepoint% hằng, nhưng tổng các chữ số cho kết quả tốt nhất).

Ngoài ra, hóa ra việc xoay danh sách bằng 2 phát tốt với mã hóa thời lượng chạy, vì vậy chúng tôi trừ 2 từ mã số trước khi lập chỉ mục.

•Ω‘~È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 byte

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

Trả về ở giữa chuỗi chỉ để đọc. Tôi nghĩ rằng tôi đã đếm đúng số byte (3 trong số các ký tự số là 1 byte, phần còn lại là 2 byte), số ký tự là 148.

Tôi đã sắp xếp trước chuỗi theo thứ tự tăng dần, bỏ qua (trả về 0) theo gợi ý của các câu trả lời khác.

Bất kỳ đối chiếu nhị phân sẽ làm việc, tôi đã sử dụng Thai_BIN vì nó có tên ngắn nhất. (Một đối chiếu trong SQL quy định cách thực hiện sắp xếp / so sánh ký tự, tôi cần nhị phân để mỗi ký tự chỉ khớp với chính nó.)

Theo tiêu chuẩn IO của chúng tôi , đầu vào được lấy thông qua bảng t có sẵn có sẵn với NCHAR(1)trường c .

Nếu bạn xác định chính bảng đầu vào bằng cách sử dụng đối chiếu nhị phân, bạn có thể bỏ qua bảng đó để lưu 16 byte:

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

Những ký tự nào sẽ khớp với nhau nếu bạn không sử dụng đối chiếu nhị phân?
Neil

1
@Neil Vâng, phụ thuộc vào việc bạn sử dụng đối chiếu nào khác! :). Điều rõ ràng nhất mà tôi nhận thấy (sử dụng mặc định máy chủ của tôi là SQL_Latin1_GeneralClick1_CI_AS) là các chữ số La Mã viết hoa và viết thường khớp với nhau. Mà .... hmm ... thực sự có thể làm việc cho tôi ở đây, vì họ giải quyết cùng một số. Nhưng nếu tên đối chiếu dài hơn nhiều, điều đó sẽ chống lại sự tiết kiệm. BRB, phải kiểm tra thêm ...
BradC

1
@Neil Không, không tốt. Với các đối chiếu không nhị phân, 10 trong số các ký tự ít phổ biến hơn ( ⅐⅑⅒Ↄↄↅↆↇↈ↉↊↋nếu bạn tò mò) tất cả khớp với nhau.
BradC

Ah, đó là một sự xấu hổ, nhưng cảm ơn vì đã cho tôi biết!
Neil

1

Ruby , 77 byte

Thay đổi tất cả các ký tự thành các chữ cái đại diện cho các giá trị số và sắp xếp theo đó.

->a{a.sort_by{|e|e.tr'¼-¾⅐-↋','HLPECBIOGKMQFRDJNSaa-pa-ppqrnnfmstAjk'}}

Hãy thử trực tuyến!


1

Perl 6 , 13 52 byte

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

Hãy thử trực tuyến!


2
Sử dụng eval không phải là gian lận, nhưng điều này chỉ đơn giản là không giải quyết được thách thức. 52 mà thực sự hoạt động:*.sort:{%(<Ↄ 99 ↄ 99 ↊ 10 ↋ 11>){$_}//.EVAL}
Grimmy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.