Sortuj liczby

21

W zagłębieniach znaków Unicode istnieje blok Unicode (obecnie) 63 znaków o nazwie „Formularze liczbowe”, który składa się ze znaków o wartościach liczbowych takich jak cyfra rzymska Ⅻ, wulgarne ułamki jak ⅑ lub ↉ lub dziwne jak ↊ (10) lub ↈ (100000).

Twoim zadaniem jest napisanie programu lub funkcji, która po otrzymaniu listy przypisanych znaków Unicode w tym bloku sortuje listę według wartości liczbowych każdego znaku.

(Sortowalna) lista znaków i wartości znajduje się na stronie Wikipedii .

Aby być samodzielnym, oto lista współrzędnych kodowych i ich wartości:

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

Przypadki testowe:

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

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

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

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

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

Zauważ, że cztery symbole (te użyte w ostatnim przypadku) nie są liczbami Unicode, chociaż nadal mają wartość liczbową, więc upewnij się, że sprawdziłeś przed opublikowaniem wbudowanego.

Zasady:

  • Jeśli w przyszłości do tego bloku zostanie przypisanych więcej znaków, nie będziesz musiał aktualizować kodu, aby je obsługiwać.
  • Kolejność znaków o identycznych wartościach nie ma znaczenia.
  • IO jest elastyczny .
    • Dane wyjściowe muszą być takie same jak znaki, a nie wartości liczbowe
  • Standardowe luki są zabronione.
  • Nie zakazuję wbudowanych funkcji, które mogą pobierać wartość liczbową znaku, ale zachęcam również do dodawania niewbudowanej odpowiedzi, jeśli to możliwe.
  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach dla każdego języka! Powodzenia!
Jo King
źródło
9
RIP monospacing :(
Jo King

Odpowiedzi:

6

Python 3 , 216 213 bajtów

-3 bajty dzięki TFeld

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

Wypróbuj online!

Z wbudowanym, który pobiera wartość liczbową, 111 bajtów

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

Wypróbuj online!

Pręt
źródło
4
Możesz zapisać 3 bajty, usuwając z łańcucha (znajdź -1najmniejsze zwroty )
TFeld
4

Perl 6 , 57 bajtów

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

Wypróbuj online!

Po prostu wyszukuje cztery wyjątkowe postacie w haszu lub wraca do wbudowanej univalmetody.

Sean
źródło
Nie potrzebujesz miejsca po dwukropku. Ponadto twój link jest nadal w bloku kodu, a nie w jakiejkolwiek lambda
Jo King
4

05AB1E (starsza wersja) , 192 74 63 61 bajtów

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

-118 bajtów przy użyciu znaków tylko strony kodowej 05AB1E, więc nie musimy używać kodowania UTF-8.
-11 bajtów dzięki @Adnan .
-2 bajty dzięki @Grimy .

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

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

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

W oparciu o kolejność znaków modulo-100 otrzymujemy następującą listę:

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

Są one generowane przez następujący program:

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

Wypróbuj online.

•Bšā¿ÑáζΔÕæ₅"®GÙ₂®°ƶío"§óÏ4¸bćÔ!₃ùZFúÐìŸ\n,λ₂ϦP(Ì•65в₂+jest krótszą odmianą tej listy, biorąc skompresowaną liczbę 1485725021600091112740267145165274006958935956446028449609419704394607952161907963838640094709317691369972842282463 , a następnie konwertując ją do Base-65, a następnie dodając 26 do każdej.

Wypróbuj online i sprawdź, czy listy są takie same .

Kevin Cruijssen
źródło
1
Tak, nie wszystkie z tych znaków są zakodowane w 05AB1E, więc będzie to 192 bajty.
Okx,
2
Tak, nie jest możliwe przedstawienie tego kodu jako pliku 68-bajtowego, co zmusza nas do powrotu do UTF-8, który w rzeczywistości ma 192 bajty .
Adnan
1
@JoKing Więc teraz używam tylko znaków ze strony kodowej 05AB1E. ;) Wciąż nudne podejście, ale zobaczę, czy uda mi się znaleźć jakiś wzór arytmetyczny.
Kevin Cruijssen
1
Myślę, że można zastąpić "]&%/$-)`'0*a+1(b,.234D5E6F7G8H9IY:J;K<L=M^>N_?O@PZAQWXBRCSTUV[\"Ç8-z•4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91в
Adnan
1
Hmm, to wydaje się być błędem analizy podczas rejestrowania zamka zamykającego. Zajmę się tym.
Adnan
3

Siatkówka , 1 93 bajty (UTF-8)

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

Wypróbuj online! Objaśnienie: Sortuje znaki w kolejności punktów kodowych, a następnie odwzorowuje między znakami numerycznymi a znakami ASCII, tak aby znaki numeryczne o najniższej wartości odwzorowały znaki ASCII o najniższym punkcie kodowym i odwrotnie. Następnie powtarza ćwiczenie, dzięki czemu znaki są teraz sortowane w kolejności tego odwzorowania ASCII, która odpowiada pożądanej kolejności numerycznej, zanim zostaną one przekształcone z powrotem. Edycja: Zapisano 100 (!) Bajtów, określając kolejność znaków ASCII zamiast znaków numerycznych.

Neil
źródło
3

Galaretka , 55 bajtów

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

Monadyczny link akceptujący listę znaków, który daje listę znaków.

Wypróbuj online!

W jaki sposób?

O wiele prostsze niż się wydaje, ponieważ “$Żz*ṀḢD⁹VṢaʠƝ lẹkƝʋ9⁽ƭXmż4#⁺3ç%|ọṢLxƈ⁽}ÞƇ2’jest to tylko duża liczba w bazie 250, używając strony kodowej Jelly jako cyfr, użyję “...’jej zamiast tego.

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

Na bok

Jak na ironię najbliżej „użyj wbudowanego podejścia” mogłem zebrać 85 bajtów , to używa skompresowanego ciągu:

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

który jest podzielony na nowe wiersze i połączony ze s, aby dać kod Python:

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

który jest wykonywalny w interpretatorze Jelly - umieści wartość liczbową znaku Unicode w lewym argumencie nilad, do późniejszego wykorzystania.

Jonathan Allan
źródło
3

Japt , 72 bajty

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

Wypróbuj lub uruchom wszystkie przypadki testowe


Wyjaśnienie

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

Oryginalne rozwiązanie, 90 89 88 bajtów

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

Wypróbuj lub uruchom wszystkie przypadki testowe


Wyjaśnienie

   `...`                                :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
Kudłaty
źródło
3

05AB1E, 56 53 51 50 49 48 bajtów

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

Wypróbuj online!

Podstawą tego rozwiązania jest skompresowana lista kodu Unicode odwzorowująca punkty na klucz sortujący. Znaki odpowiadające temu samemu numerowi są mapowane na ten sam klucz, więc potrzebujemy tylko 40 różnych kluczy.

70 jest najmniejszą liczbą, o którą możemy modulować wszystkie wejściowe punkty kodowe i uzyskiwać wyraźne wyniki. Ponieważ indeksowanie w 05AB1E się zawija, nie musimy tego wyraźnie 70%robić, po prostu upewnij się, że lista ma długość 70.

Zauważ, że istnieją długie odcinki kolejnych punktów kodowych z kolejnymi kluczami. Zatem kodowanie (klucz - kodowy punkt) zamiast po prostu (klucz) daje długie odcinki identycznych liczb, które można zakodować na całej długości. Jednak zakres punktów kodowych jest bardzo duży (cholera, 0xBC .. 0xBE), co stanowiłoby problem. Zamiast więc (key - codepoint), kodujemy (key - sum_of_digits (codepoint)), co niestety ogranicza długość odcinka do 10, ale całkiem nieźle zmniejsza zakres zakodowanych wartości. (Oczywiście możliwe są inne funkcje, takie jak stała kodowa punktu%, ale suma cyfr daje najlepsze wyniki).

Dodatkowo, okazuje się, że obrócenie listy o 2 gra dobrze z kodowaniem długości przebiegu, więc odejmujemy 2 od punktu kodowego przed indeksowaniem.

•Ω‘~È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
Ponury
źródło
1

T-SQL, 207 bajtów

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

Zwrot w środku ciągu służy wyłącznie do odczytu. Myślę, że mam poprawną liczbę bajtów (3 znaki numeryczne to 1 bajt, pozostałe 2 bajty), liczba znaków to 148.

Wstępnie posortowałem ciąg w porządku rosnącym, pomijając (co zwraca 0), jak sugerują inne odpowiedzi.

Każde zestawienie binarne będzie działać, użyłem, Thai_BINponieważ ma najkrótszą nazwę. (Zestawienie w języku SQL określa sposób sortowania / porównywania znaków. Potrzebuję danych binarnych, aby każdy znak pasował tylko do siebie.)

Zgodnie z naszymi standardami IO , wejście zostanie podjęta przez istniejące wcześniej tabeli T z NCHAR(1)pola C .

Jeśli sama tabela wejściowa zostanie zdefiniowana za pomocą sortowania binarnego, można to pominąć, aby zapisać 16 bajtów:

CREATE TABLE t(c NCHAR(1) COLLATE Thai_BIN)
BradC
źródło
Które postacie pasują do siebie, jeśli nie użyjesz sortowania binarnego?
Neil
1
@Neil Cóż, zależy od tego, jakiego innego sortowania używasz! :). Najbardziej oczywistym, jaki zauważyłem (używając domyślnego serwera SQL_Latin1_General_SP1_CI_AS) było to, że wielkie i małe cyfry rzymskie pasują do siebie. Który .... hmm ... może faktycznie pracują dla mnie tutaj, gdyż rozwiązanie do tego samego numeru. Ale jeśli nazwa sortowania jest znacznie dłuższa, to przeciwdziała oszczędnościom. BRB, muszę jeszcze trochę przetestować ...
BradC,
1
@Neil Nope, nie dobrze. W przypadku niebinarnych zestawień 10 mniej popularnych postaci ( ⅐⅑⅒Ↄↄↅↆↇↈ↉↊↋jeśli jesteś ciekawy) pasuje do siebie.
BradC,
Ach, szkoda, ale dzięki za poinformowanie mnie!
Neil
1

Rubinowy , 77 bajtów

Zmienia wszystkie znaki na litery reprezentujące wartości liczbowe i sortuje według nich.

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

Wypróbuj online!

Wartość tuszu
źródło
1

Perl 6 , 13 52 bajtów

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

Wypróbuj online!

bb94
źródło
2
Korzystanie z eval nie jest oszustwem, ale to po prostu nie rozwiązuje problemu. 52, który faktycznie działa:*.sort:{%(<Ↄ 99 ↄ 99 ↊ 10 ↋ 11>){$_}//.EVAL}
Grimmy