Сортування чисел


21

У поглибленнях символів Unicode існує блок Unicode (на даний момент) 63 символи під назвою "Форми чисел", який складається з символів, що мають числові значення, такі як римська цифра Ⅻ, вульгарні дроби, як ⅑ або ↉, або дивні, як-от ↊ (10) або ↈ (100000).

Ваше завдання - написати програму або функцію, яка при наданні списку призначених символів Unicode у цьому блоці сортує список за числовими значеннями кожного символу.

Перелік символів та значень (сортуваний) можна знайти на сторінці Вікіпедії .

Щоб бути автономним, ось список кодових точок та їх значень:

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

Тестові приклади:

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

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

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

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

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

Зауважте, що чотири символи (ті, які використовувались в останньому випадку) не є однокодовими номерами, хоча вони все ще мають числове значення, тому переконайтеся, що перевірити, перш ніж публікувати вбудований.

Правила:

  • Якщо в майбутньому цьому блоку буде призначено більше символів, вам не потрібно буде оновлювати код для їх підтримки.
  • Порядок символів з однаковими значеннями не має значення.
  • IO гнучка .
    • Вихід повинен бути як символи, але не числові значення
  • Стандартні лазівки заборонені.
  • Я не забороняю вбудовані модулі, які можуть отримати числове значення символу, але я закликаю також додати не вбудовану відповідь, якщо можливо.
  • Це , тому найкоротша відповідь у байтах для кожної мови виграє! Удачі!

9
Монорозміщення RIP :(
Джо Кінг,

Відповіді:


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 байти, видаливши з рядка (знайдіть прибуток, -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в₂+?

На основі порядку символів по модулю-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. ;) Досі нудний підхід, але я побачу, чи зможу я знайти якусь арифметичну схему.
Кевін Крейссен

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, що відповідає бажаному числовому порядку, перш ніж вони будуть перетворені назад. Редагувати: Збережено 100 (!) Байт, вказавши порядок символів ASCII, а не числових символів.


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’просто велика кількість в базі 250, що використовує кодову сторінку Jelly в якості цифр, я буду використовувати “...’замість неї.

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>ÅΓ®Íè+

Спробуйте в Інтернеті!

В основі цього рішення лежить стислий список, який відображає кодові коди унікоду на сортувальний ключ. Символи, які відповідають одній і тій же кількості, відображаються в одному ключі, тому нам потрібно лише 40 різних клавіш.

70 - найменше число, за яким ми можемо модулювати всі вхідні кодові точки та отримувати чіткі результати. Оскільки індексація в 05AB1E обгортає, нам не потрібно явно 70%, лише переконайтеся, що список становить 70.

Зауважте, що є великі ділянки послідовних кодових точок із послідовними клавішами. Таким чином, кодування (ключ - кодова точка), а не просто (ключ) дає довгі розтяжки однакових чисел, які можуть бути закодовані довжиною. Однак діапазон кодових точок дуже великий (чорт ті 0xBC .. 0xBE), що було б проблемою. Тож замість (ключ - кодова точка) ми кодуємо (ключ - sum_of_digits (кодова точка)), що, на жаль, обмежує довжину розтягування до 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 , введення приймається через попередньо існуючу таблицю t з NCHAR(1)полем c .

Якщо визначити саму таблицю введення за допомогою двійкового зіставлення, ви можете залишити це, щоб зберегти 16 байт:

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

Які символи відповідали б один одному, якщо ви не використовували двійкове порівняння?
Ніл

1
@Neil Добре, залежить від того, яке інше порівняння ви використовуєте насправді! :). Найбільш очевидним, який я помітив (використовуючи моє серверне значення за замовчуванням SQL_Latin1_General_SP1_CI_AS), було те, що великі та малі римські цифри відповідають одна одній. Який .... хм ... насправді може працювати для мене тут, оскільки вони вирішують однакову кількість. Але якщо назва порівняння настільки довша, це протидіє заощадженням. БРБ, треба ще трохи випробувати ...
BradC

1
@Neil Ні, нічого хорошого. За допомогою небінарних порівнянь 10 менш рідких символів ( ⅐⅑⅒Ↄↄↅↆↇↈ↉↊↋якщо вам цікаво) всі відповідають один одному.
BradC

Ах, це соромно, але дякую за те, що повідомили мені!
Ніл


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.