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 golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach dla każdego języka! Powodzenia!
Odpowiedzi:
Python 3 ,
216213 bajtów-3 bajty dzięki TFeld
Wypróbuj online!
Z wbudowanym, który pobiera wartość liczbową, 111 bajtów
Wypróbuj online!
źródło
↉
z łańcucha (znajdź-1
najmniejsze zwroty )Perl 6 , 57 bajtów
Wypróbuj online!
Po prostu wyszukuje cztery wyjątkowe postacie w haszu lub wraca do wbudowanej
unival
metody.źródło
05AB1E (starsza wersja) ,
192746361 bajtów-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:
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ę:
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 .
źródło
"]&%/$-)`'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в
Siatkówka ,
193 bajty (UTF-8)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.
źródło
Galaretka , 55 bajtów
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.Na bok
Jak na ironię najbliżej „użyj wbudowanego podejścia” mogłem zebrać 85 bajtów , to używa skompresowanego ciągu:
który jest podzielony na nowe wiersze i połączony ze
⁸
s, aby dać kod Python:który jest wykonywalny w interpretatorze Jelly - umieści wartość liczbową znaku Unicode w lewym argumencie nilad,
⁸
do późniejszego wykorzystania.źródło
Japt , 72 bajty
Wypróbuj lub uruchom wszystkie przypadki testowe
Wyjaśnienie
Codepoints
Oryginalne rozwiązanie,
908988 bajtówWypróbuj lub uruchom wszystkie przypadki testowe
Wyjaśnienie
Codepoints
źródło
05AB1E,
565351504948 bajtówWypró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ódło
JavaScript (SpiderMonkey) , 117 bajtów
Wypróbuj online!
źródło
T-SQL, 207 bajtów
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_BIN
ponieważ 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:
źródło
⅐⅑⅒Ↄↄↅↆↇↈ↉↊↋
jeśli jesteś ciekawy) pasuje do siebie.Rubinowy , 77 bajtów
Zmienia wszystkie znaki na litery reprezentujące wartości liczbowe i sortuje według nich.
Wypróbuj online!
źródło
Perl 6 ,
1352 bajtówWypróbuj online!
źródło
*.sort:{%(<Ↄ 99 ↄ 99 ↊ 10 ↋ 11>){$_}//.EVAL}