Sayıların sıralaması


21

Unicode karakterlerinin girintilerinde, currently veya ↉ gibi kaba rakamlar, num veya ↉ gibi kaba rakamlar veya tuhaf olanlar gibi sayısal değerlere sahip karakterlerden oluşan (şu anda) 63 karakterden oluşan "Sayı Formları" adlı bir Unicode bloğu bulunmaktadır. ↊ (10) veya ↈ (100000).

Görevin, bu blok içindeki atanmış Unicode karakterlerin bir listesi verildiğinde, listeyi her karakterin sayısal değerlerine göre sıralayan bir program veya işlev yazmaktır.

Vikipedi Sayfasında bir (sıralanabilir) karakter ve değer listesi bulunabilir .

Yine de kendi içinde yer almak için kod noktalarının ve değerlerinin bir listesi:

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

Test durumları:

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

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

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

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

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

Dört sembolün (son durumda kullanılanların) unicode sayıları olmadığını, yine de sayısal bir değere sahip olduklarını unutmayın;

Kurallar:

  • Gelecekte bu bloğa daha fazla karakter atanmışsa, onları desteklemek için kodunuzu güncellemeniz gerekmez.
  • Aynı değerlere sahip karakterlerin sırası önemli değildir.
  • IO esnektir .
    • Çıktı, sayısal değerler değil, karakterler gibi olmalıdır
  • Standart Loopholes yasaktır.
  • Bir karakterin sayısal değerini getirebilecek yerleşik bileşenleri yasaklamıyorum, ancak mümkünse yerleşik olmayan bir yanıt eklemeyi de teşvik ediyorum.
  • Bu , her dil için bayt cinsinden en kısa cevap kazanır! İyi şanslar!

9
RIP monospacing :(
Jo King

Yanıtlar:


6

Python 3 , 216 213 bayt

TFeld sayesinde -3 bayt

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

Çevrimiçi deneyin!

Sayısal değeri getiren yerleşik, 111 bayt

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

Çevrimiçi deneyin!


4
-1
Dizeden

4

Perl 6 , 57 bayt

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

Çevrimiçi deneyin!

Sadece karışmadaki dört istisnai karakteri arar veya yerleşik univalyönteme geri döner .


Kolondan sonra boşluğa ihtiyacınız yok. Ayrıca, bağlantınız bir Whatever lambda yerine hala bir kod bloğundadır
Jo King

4

05AB1E (eski) , 192 74 63 61 bayt

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

-118 bayt sadece 05AB1E kod sayfası karakterlerini kullanarak, bu yüzden UTF-8 kodlamasını kullanmamıza gerek yok. @Adnan
sayesinde -11 bayt . @Grimy sayesinde -2 bayt .

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

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

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

Modulo-100 karakterlerinin sırasına göre aşağıdaki listeye sahibiz:

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

Bunlar aşağıdaki program tarafından üretilir:

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

Çevrimiçi deneyin.

•Bšā¿ÑáζΔÕæ₅"®GÙ₂®°ƶío"§óÏ4¸bćÔ!₃ùZFúÐìŸ\n,λ₂ϦP(Ì•65в₂+bu listenin, sıkıştırılmış numarayı alarak 1485725021600091112740267145165274006958935956446028449609419704394607952161907963838640094709317691369972842282463, ardından onu Baz 65'e dönüştürerek ve ardından her birine 26 ekleyerek daha kısa bir varyasyonudur .

Çevrimiçi deneyin ve listelerin aynı olduğunu doğrulayın .


1
Evet, bu karakterlerin tümü 05AB1E'nin kodunda değil, bu yüzden 192 bayt olacak.
Okx

2
Evet, bu kodu, aslında 192 bayt olan UTF-8'e geri dönmemize zorlayan 68 baytlık bir dosya olarak gösterilemez .
Adnan

1
@JoKing Yani, şimdi sadece 05AB1E'nin kod sayfasındaki karakterleri kullanıyorum. ;) Hala sıkıcı bir yaklaşım, ancak bir tür aritmetik kalıp bulabilir miyim göreceksiniz.
Kevin Cruijssen

1
Ben değiştirmek düşünüyorum "]&%/$-)`'0*a+1(b,.234D5E6F7G8H9IY:J;K<L=M^>N_?O@PZAQWXBRCSTUV[\"Ç8-ile•4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91в
Adnan

1
Hmm, bu kapanış braketini kaydetmeyen bir ayrıştırma hatası gibi görünüyor. Buna bakacağım.
Adnan

3

Retina , 1 93 bayt (UTF-8)

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

Çevrimiçi deneyin! Açıklama: Karakterleri kod noktası sırasına göre sıralar, ardından sayısal karakterler ve ASCII karakterleri arasında eşleştirir, böylece en düşük değere sahip sayısal karakterler ASCII karakterlerini en düşük kod noktasına sahip olan ve tersi ile eşleştirir. Ardından alıştırmayı tekrarlar, böylece karakterler şimdi geri dönüştürülmeden önce istenen sayısal sıraya karşılık gelen bu ASCII eşlemesi sırasına göre sıralanır. Düzenleme: Sayısal karakterler yerine ASCII karakterlerinin sırasını belirterek 100 (!) Bayt kaydedildi.


3

Jöle , 55 bayt

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

Bir karakter listesi veren bir karakter listesini kabul eden bir monadik bağlantı.

Çevrimiçi deneyin!

Nasıl?

Göründüğünden çok daha basit, çünkü “$Żz*ṀḢD⁹VṢaʠƝ lẹkƝʋ9⁽ƭXmż4#⁺3ç%|ọṢLxƈ⁽}ÞƇ2’250 kodunda basamağıyla Jelly kod sayfasını rakamlar olarak kullanarak “...’, onun yerine kullanacağım .

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

bir kenara

Biraz ironik bir şekilde "yerleşik bir yaklaşımı kullan" seçeneğine en yakın olanı, toplayabildiğim 85 bayttı , bu sıkıştırılmış bir dizi kullanıyordu:

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

Yeni hatlara bölünmüş ve Python kodunu vermek için s ile birleştirilmiştir :

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

Jelly'in yorumlayıcısında çalıştırılabilir - Unicode karakterinin sayısal değerini daha sonra kullanmak üzere sol argüman niladına yerleştirir .


3

Japt , 72 bayt

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

Deneyin veya tüm test durumlarını çalıştırın


açıklama

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

Orijinal Çözüm, 90 89 88 bayt

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

Deneyin veya tüm test durumlarını çalıştırın


açıklama

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

3

05AB1E, 56 53 51 50 49 48 bayt

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

Çevrimiçi deneyin!

Bu çözümün merkezinde bir unicode kodunun bir sıralama anahtarına işaret ettiği sıkıştırılmış bir liste bulunur. Aynı sayıya karşılık gelen karakterler aynı anahtara eşlenir, bu yüzden sadece 40 farklı anahtara ihtiyacımız var.

70, tüm girdi kod noktalarını modüle edip farklı sonuçlar alabileceğimiz en küçük sayıdır. 05AB1E’de indeksleme işlemi tamamlanmadığından, açıkça belirtmemize gerek yok 70%, listenin uzunluğu 70 olduğundan emin olun.

Ardışık tuşlarla uzun süreli ardışık kod noktaları olduğuna dikkat edin. Bu nedenle, basitçe (anahtar) yerine kodlama (anahtar - kod noktası), çalışma uzunluğu kodlu olabilen uzun özdeş numara uzantıları verir. Ancak, kod noktaları aralığı çok büyük (bu lanet olsun 0xBC .. 0xBE), bu bir sorun olurdu. Bu yüzden (key-codepoint) yerine, kodlama (key - sum_of_digits (codepoint)) kodunu koyarız; (Diğer işlevler elbette mümkündür, kod noktası% sabiti gibi, ancak basamakların toplamı en iyi sonuçları verir).

Ek olarak, listenin 2 döndürüldüğü ve çalışma uzunluğu kodlamasıyla iyi çalıştığı için indekslemeden önce kod noktasından 2 çıkardık.

•Ω‘~È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 bayt

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

Dizenin ortasındaki dönüş sadece okunabilirlik içindir. Sanırım bayt sayısını doğruladım (sayısal karakterlerden 3'ü 1 bayt, kalanı 2 bayt), karakter sayısı 148.

Dizeyi artan sırayla önceden sıraladım, diğer cevapların önerdiği şekilde (0 döndürür) bıraktım .

Herhangi bir ikili harmanlama işe yarayacak, kullandığım Thai_BINen kısa isim. (SQL'deki bir harmanlama, karakter sıralama / karşılaştırmanın nasıl yapıldığını belirtir, her karakterin yalnızca kendisiyle eşleşmesi için ikiliye ihtiyacım vardır.)

Bizim IO standartlarına Başına , giriş önceden varolan tablo aracılığıyla alınır t ile NCHAR(1)tarla c .

Giriş tablosunu ikili bir harmanlama kullanarak tanımlarsanız, 16 bayttan tasarruf etmek için bunu dışarıda bırakabilirsiniz:

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

İkili harmanlama kullanmasanız hangi karakterler birbiriyle eşleşir?
Neil,

1
@Neil Aslında, hangi harmanlamayı kullandığınıza bağlı ! :). Fark ettiğim en belirgin olanı (SQL_Latin1_General_SP1_CI_AS sunucumun varsayılanını kullanarak), büyük ve küçük Roma rakamlarının birbiriyle eşleşmesiydi. Hangi .... hmm ... aslında işe yarayabilecek için aynı numaraya gidermek beri, beni burada. Ancak, harmanlama adı çok daha uzunsa, bu tasarrufları önler. BRB, biraz daha test
etmeliyim

1
@Neil Hayır, iyi değil. İkili olmayan harmanlamalarda, daha az yaygın olan karakterlerden 10 tanesinin ( ⅐⅑⅒Ↄↄↅↆↇↈ↉↊↋merak ediyorsanız) hepsi birbiriyle eşleşir.
BradC,

Ah, bu utanç verici, ama haber verdiğin için teşekkürler!
Neil,


1

Perl 6 , 13 52 bayt

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

Çevrimiçi deneyin!


2
Eval kullanarak hile değildir, ancak bu basitçe sorunu çözmez. 52 aslında işe yarıyor:*.sort:{%(<Ↄ 99 ↄ 99 ↊ 10 ↋ 11>){$_}//.EVAL}
Grimmy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.