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 kode-golf , jadi jawaban terpendek dalam byte untuk setiap bahasa akan menang! Semoga berhasil!
Jawaban:
Python 3 ,
216213 byte-3 byte berkat TFeld
Cobalah online!
Dengan built-in yang mengambil nilai numerik, 111 byte
Cobalah online!
sumber
↉
dari string (temukan pengembalian-1
yang terkecil)Perl 6 , 57 byte
Cobalah online!
Lihat saja empat karakter luar biasa dalam hash, atau kembali ke
unival
metode bawaan.sumber
05AB1E (warisan) ,
192746361 byte-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:
Jadi apa
•Bšā¿ÑáζΔÕæ₅"®GÙ₂®°ƶío"§óÏ4¸bćÔ!₃ùZFúÐìŸ\n,λ₂ϦP(Ì•65в₂+
?Berdasarkan urutan karakter modulo-100 kita mendapatkan daftar berikut:
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 dikompresi1485725021600091112740267145165274006958935956446028449609419704394607952161907963838640094709317691369972842282463
, kemudian mengubahnya ke Base-65, dan kemudian menambahkan 26 masing-masing.Cobalah online dan verifikasi bahwa daftar itu sama .
sumber
"]&%/$-)`'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в
Retina ,
193 byte (UTF-8)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.
sumber
Jelly , 55 byte
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.Ke samping
Agak ironisnya yang terdekat dengan "menggunakan pendekatan bawaan" yang bisa saya kumpulkan adalah 85 byte , ini menggunakan string terkompresi:
yang dibagi pada baris baru dan bergabung dengan
⁸
s untuk memberikan kode Python:yang dapat dieksekusi dalam juru bahasa Jelly - itu akan menempatkan nilai numerik karakter Unicode ke argumen nilad kiri,
⁸
untuk digunakan nanti.sumber
Japt , 72 byte
Cobalah atau jalankan semua test case
Penjelasan
Codepoints
Solusi Asli,
908988 byteCobalah atau jalankan semua test case
Penjelasan
Codepoints
sumber
05AB1E,
565351504948 byteCobalah 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 eksplisit
70%
, 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.
sumber
JavaScript (SpiderMonkey) , 117 byte
Cobalah online!
sumber
T-SQL, 207 byte
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:
sumber
⅐⅑⅒Ↄↄↅↆↇↈ↉↊↋
jika Anda penasaran) semuanya cocok satu sama lain.Ruby , 77 byte
Mengubah semua karakter menjadi huruf yang mewakili nilai numerik dan mengurutkannya.
Cobalah online!
sumber
Perl 6 ,
1352 byteCobalah online!
sumber
*.sort:{%(<Ↄ 99 ↄ 99 ↊ 10 ↋ 11>){$_}//.EVAL}