Mengurutkan angka

21

Dalam ceruk karakter Unicode, terdapat blok Unicode (saat ini) 63 karakter bernama "Bentuk Angka", yang terdiri dari karakter yang memiliki nilai numerik seperti angka romawi Ⅻ, pecahan vulgar seperti ⅑ atau ↉, atau yang aneh seperti ↊ (10) atau ↈ (100000).

Tugas Anda adalah menulis program atau fungsi yang, ketika diberi daftar karakter Unicode yang ditetapkan dalam blok ini, mengurutkan daftar berdasarkan nilai numerik setiap karakter.

Daftar (nilai) karakter dan nilai dapat ditemukan di Halaman Wikipedia .

Untuk menjadi mandiri, berikut adalah daftar codepoint dan nilainya:

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

Kasus uji:

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

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

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

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

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

Perhatikan bahwa empat simbol (yang digunakan dalam kasus terakhir) bukan angka unicode, meskipun mereka masih memiliki nilai numerik, jadi pastikan untuk memeriksa sebelum hanya memasang built-in.

Aturan:

  • Jika ada lebih banyak karakter yang ditugaskan pada blok ini di masa mendatang, Anda tidak perlu memperbarui kode Anda untuk mendukungnya.
  • Urutan karakter dengan nilai yang identik tidak masalah.
  • IO fleksibel .
    • Output harus sebagai karakter, bukan nilai numerik
  • Celah Standar dilarang.
  • Saya tidak melarang built-in yang dapat mengambil nilai numerik karakter, tetapi saya mendorong juga menambahkan jawaban non-builtin jika memungkinkan.
  • Ini adalah , jadi jawaban terpendek dalam byte untuk setiap bahasa akan menang! Semoga berhasil!
Jo King
sumber
9
RIP monospacing :(
Jo King

Jawaban:

6

Python 3 , 216 213 byte

-3 byte berkat TFeld

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

Cobalah online!

Dengan built-in yang mengambil nilai numerik, 111 byte

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

Cobalah online!

tongkat
sumber
4
Anda dapat menyimpan 3 byte dengan menghapus dari string (temukan pengembalian -1yang terkecil)
TFeld
4

Perl 6 , 57 byte

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

Cobalah online!

Lihat saja empat karakter luar biasa dalam hash, atau kembali ke univalmetode bawaan.

Sean
sumber
Anda tidak membutuhkan ruang setelah titik dua. Juga, tautan Anda masih dalam blok kode alih-alih Apa pun lambda
Jo King
4

05AB1E (warisan) , 192 74 63 61 byte

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

-118 byte dengan menggunakan karakter halaman kode 05AB1E saja, jadi kita tidak perlu menggunakan pengkodean UTF-8.
-11 byte terima kasih kepada @Adnan .
-2 byte terima kasih kepada @Grimy .

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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

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

Berdasarkan urutan karakter modulo-100 kita mendapatkan daftar berikut:

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

Ini dihasilkan oleh program berikut:

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

Cobalah online.

•Bšā¿ÑáζΔÕæ₅"®GÙ₂®°ƶío"§óÏ4¸bćÔ!₃ùZFúÐìŸ\n,λ₂ϦP(Ì•65в₂+adalah variasi yang lebih pendek dari daftar ini dengan mengambil angka yang dikompresi 1485725021600091112740267145165274006958935956446028449609419704394607952161907963838640094709317691369972842282463 , kemudian mengubahnya ke Base-65, dan kemudian menambahkan 26 masing-masing.

Cobalah online dan verifikasi bahwa daftar itu sama .

Kevin Cruijssen
sumber
1
Ya, tidak semua karakter tersebut ada dalam pengkodean 05AB1E, sehingga akan menjadi 192 byte.
Okx
2
Ya, tidak mungkin merepresentasikan kode ini sebagai file 68-byte yang memaksa kita untuk kembali ke UTF-8, yang memang 192 byte .
Adnan
1
@ JoKing Jadi, sekarang saya hanya menggunakan karakter dari halaman kode 05AB1E. ;) Masih pendekatan yang membosankan, tetapi akan melihat apakah saya dapat menemukan semacam pola aritmatika.
Kevin Cruijssen
1
Saya pikir Anda dapat menggantinya "]&%/$-)`'0*a+1(b,.234D5E6F7G8H9IY:J;K<L=M^>N_?O@PZAQWXBRCSTUV[\"Ç8-dengan•4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91в
Adnan
1
Hmm, itu sepertinya kesalahan parsing tidak mendaftarkan braket penutup. Saya akan melihat ini.
Adnan
3

Retina , 1 93 byte (UTF-8)

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

Cobalah online! Penjelasan: Mengurutkan karakter dalam urutan titik kode, lalu memetakan antara karakter numerik dan karakter ASCII sehingga karakter numerik dengan nilai terendah memetakan karakter ASCII dengan titik kode terendah dan sebaliknya. Kemudian ulangi latihan, sehingga karakter sekarang diurutkan dalam urutan pemetaan ASCII ini, yang sesuai dengan urutan numerik yang diinginkan, sebelum mereka diubah kembali. Sunting: Disimpan 100 (!) Byte dengan menentukan urutan karakter ASCII daripada karakter numerik.

Neil
sumber
3

Jelly , 55 byte

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

Tautan monadik yang menerima daftar karakter yang menghasilkan daftar karakter.

Cobalah online!

Bagaimana?

Jauh lebih sederhana daripada yang terlihat karena “$Żz*ṀḢD⁹VṢaʠƝ lẹkƝʋ9⁽ƭXmż4#⁺3ç%|ọṢLxƈ⁽}ÞƇ2’hanya sejumlah besar di basis 250 yang menggunakan halaman kode Jelly sebagai digit, saya akan menggunakan “...’tempatnya.

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

Ke samping

Agak ironisnya yang terdekat dengan "menggunakan pendekatan bawaan" yang bisa saya kumpulkan adalah 85 byte , ini menggunakan string terkompresi:

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

yang dibagi pada baris baru dan bergabung dengan s untuk memberikan kode Python:

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

yang dapat dieksekusi dalam juru bahasa Jelly - itu akan menempatkan nilai numerik karakter Unicode ke argumen nilad kiri, untuk digunakan nanti.

Jonathan Allan
sumber
3

Japt , 72 byte

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

Cobalah atau jalankan semua test case


Penjelasan

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

Codepoints

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

Solusi Asli, 90 89 88 byte

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

Cobalah atau jalankan semua test case


Penjelasan

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

Codepoints

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
Shaggy
sumber
3

05AB1E, 56 53 51 50 49 48 byte

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

Cobalah online!

Inti dari solusi ini adalah pemetaan daftar kode unicode terkompresi menunjuk ke kunci penyortiran. Karakter yang sesuai dengan nomor yang sama dipetakan ke tombol yang sama, jadi kita hanya perlu 40 tombol yang berbeda.

70 adalah angka terkecil yang dengannya kita dapat memodulasi semua titik input codep dan mendapatkan hasil yang berbeda. Karena pengindeksan dalam 05AB1E membungkus, kita tidak perlu secara eksplisit70% , pastikan daftar panjangnya 70.

Perhatikan bahwa ada rentang panjang poin kode berturut-turut dengan kunci berurutan. Dengan demikian, pengkodean (key - codepoint) daripada hanya (key) memberikan bentang panjang angka yang identik, yang dapat dikodekan dengan run-length. Namun, kisaran poin kode sangat besar (sialan itu 0xBC .. 0xBE), yang akan menjadi masalah. Jadi alih-alih (key-codepoint), kami menyandikan (key-sum_of_digits (codepoint)), yang sayangnya membatasi panjang peregangan menjadi 10, tetapi tidak cukup baik dalam mengurangi rentang nilai yang dikodekan. (Fungsi lain tentu saja mungkin, seperti codepoint% konstan, tetapi jumlah digit memberikan hasil terbaik).

Selain itu, ternyata memutar daftar dengan 2 bermain baik dengan pengkodean run-length, jadi kita kurangi 2 dari codepoint sebelum pengindeksan.

•Ω‘~È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
Grimmy
sumber
2

JavaScript (SpiderMonkey) , 117 byte

a=>a.sort((a,b)=>(g=c=>';<=>GHIJCDEF?@AB/37~15:;8-9+6.24,*)0N(DEH@GMJKLH'[(c.charCodeAt()&127^44)%92%76%60])(a)>g(b))

Cobalah online!

Arnauld
sumber
1

T-SQL, 207 byte

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

Kembali di tengah-tengah string hanya untuk dibaca. Saya pikir saya mendapatkan jumlah byte yang benar (3 karakter numerik adalah 1-byte, sisanya 2-byte), jumlah karakter adalah 148.

Saya pra-mengurutkan string dalam urutan menaik, meninggalkan (yang mengembalikan 0) seperti yang disarankan oleh jawaban lain.

Setiap pemeriksaan biner akan berhasil, saya menggunakan Thai_BIN karena memiliki nama terpendek. (Sebuah kumpulan dalam SQL menentukan bagaimana penyortiran karakter / perbandingan dilakukan, saya perlu biner sehingga setiap karakter hanya cocok dengan dirinya sendiri.)

Sesuai standar IO kami , input diambil melalui tabel t yang sudah ada dengan NCHAR(1)bidang c .

Jika Anda mendefinisikan tabel input itu sendiri dengan menggunakan binary collation, Anda bisa membiarkannya untuk menghemat 16 byte:

CREATE TABLE t(c NCHAR(1) COLLATE Thai_BIN)
BradC
sumber
Karakter mana yang akan cocok satu sama lain jika Anda tidak menggunakan susunan biner?
Neil
1
@ Neil Nah, tergantung pada mana pemeriksaan lain yang Anda gunakan, sebenarnya! :) Yang paling jelas saya perhatikan (menggunakan default server saya dari SQL_Latin1_General_SP1_CI_AS) adalah bahwa angka Romawi huruf besar dan kecil cocok satu sama lain. Yang .... hmm ... mungkin benar-benar bekerja untuk saya di sini, karena mereka memutuskan untuk nomor yang sama. Tetapi jika nama pemeriksaan jauh lebih lama, itu meniadakan penghematan. BRB, harus menguji lagi ...
BradC
1
@Neil Nggak, tidak bagus. Dengan koleksi non-biner, 10 karakter yang kurang umum ( ⅐⅑⅒Ↄↄↅↆↇↈ↉↊↋jika Anda penasaran) semuanya cocok satu sama lain.
BradC
Ah, itu memalukan, tapi terima kasih sudah memberi tahu saya!
Neil
1

Ruby , 77 byte

Mengubah semua karakter menjadi huruf yang mewakili nilai numerik dan mengurutkannya.

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

Cobalah online!

Nilai Tinta
sumber
1

Perl 6 , 13 52 byte

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

Cobalah online!

bb94
sumber
2
Menggunakan eval tidak curang, tapi ini tidak menyelesaikan tantangan. 52 yang benar-benar berfungsi:*.sort:{%(<Ↄ 99 ↄ 99 ↊ 10 ↋ 11>){$_}//.EVAL}
Grimmy