숫자의 종류


21

유니 코드 문자의 오목한 부분에는 로마 숫자 Ⅻ, ⅑ 또는 ↉와 같은 저속한 분수 또는 이상한 문자와 같은 숫자 값을 갖는 문자로 구성된 "Number Forms"라는 (현재) 63 문자의 유니 코드 블록이 있습니다. ↊ (10) 또는 ↈ (100000).

이 블록 내에서 할당 된 유니 코드 문자 목록이 제공 될 때 각 문자의 숫자 값으로 목록을 정렬하는 프로그램 또는 함수를 작성해야합니다.

문자 및 값의 (정렬 가능한) 목록은 Wikipedia Page 에서 찾을 수 있습니다 .

자체 포함하기 위해 다음은 코드 포인트 및 해당 값 목록입니다.

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

테스트 사례 :

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

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

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

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

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

4 개의 기호 (마지막 경우에 사용 된 기호)는 유니 코드 숫자가 아니지만 여전히 숫자 값을 가지므로 기본 제공을 게시하기 전에 확인해야합니다.

규칙 :

  • 나중에이 블록에 더 많은 문자가 할당되면 해당 문자를 지원하기 위해 코드를 업데이트 할 필요가 없습니다.
  • 동일한 값을 가진 문자의 순서는 중요하지 않습니다.
  • IO는 유연 합니다.
    • 출력은 숫자가 아닌 문자이어야합니다.
  • 표준 허점 은 금지되어 있습니다.
  • 문자의 숫자 값을 가져올 수있는 내장 기능을 금지하지는 않지만 가능한 경우 내장되지 않은 답변을 추가하는 것이 좋습니다.
  • 이것은 이므로 각 언어에 대한 바이트 단위의 최단 답변이 승리합니다! 행운을 빕니다!

9
RIP 독점 :(
Jo King

답변:


6

파이썬 (3) , 216 (213) 바이트

TFeld 덕분에 -3 바이트

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

펄 6 , 57 바이트

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

온라인으로 사용해보십시오!

해시에서 4 개의 예외 문자를 조회하거나 내장 unival방법으로 넘어갑니다 .


콜론 뒤에 공백이 필요하지 않습니다. 또한, 귀하의 링크는 Whatever lambda가 아닌 코드 블록에 있습니다
Jo King

4

05AB1E (레거시) , 192 74 63 61 바이트

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

05AB1E의 코드 페이지 문자 만 사용하여 -118 바이트이므로 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в₂+ 입니까?

modulo-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 바이트 파일로 표현할 수 없으므로 실제로는 192 바이트 인 UTF-8로 대체됩니다 .
Adnan

1
@JoKing 그래서 지금은 05AB1E의 코드 페이지의 문자만을 사용하고 있습니다. ;) 여전히 지루한 접근법이지만 어떤 종류의 산술 패턴을 찾을 수 있는지 볼 것입니다.
Kevin Cruijssen

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
흠, 그것은 닫는 괄호를 등록하지 않은 파싱 오류 인 것 같습니다. 이것에 대해 살펴 보겠습니다.
Adnan

3

망막 , 1 93 바이트 (UTF-8)

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

온라인으로 사용해보십시오! 설명 : 코드 포인트 순서로 문자를 정렬 한 다음 가장 낮은 값을 가진 숫자가 가장 낮은 코드 포인트를 가진 ASCII 문자를 맵핑하고 그 반대의 경우도되도록 숫자와 ASCII 문자를 맵핑합니다. 그런 다음 연습을 반복하여 문자가 변환되기 전에 원하는 숫자 순서에 해당하는이 ASCII 맵핑 순서로 정렬됩니다. 편집 : 숫자 대신 ASCII 문자의 순서를 지정하여 100 (!) 바이트를 저장했습니다.


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’Jelly의 코드 페이지를 숫자로 사용하는 base 250의 숫자 보다 훨씬 간단하기 때문에 “...’대신 사용할 것 입니다.

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의 인터프리터 내에서 실행 가능합니다-유니 코드 문자의 숫자 값 을 나중에 인수를 위해 왼쪽 인수 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로 인해) 문제가 될 수 있습니다. 따라서 (key-codepoint) 대신에 (key-sum_of_digits (codepoint))를 인코딩하여 불행하게도 스트레치 길이를 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 표준에 따라 입력 필드 는 필드 c 와 함께 기존 테이블 t 를 통해 가져옵니다 .NCHAR(1)

이진 데이터 정렬을 사용하여 입력 테이블 자체를 정의하는 경우 16 바이트를 절약 할 수 있습니다.

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

이진 데이터 정렬을 사용하지 않은 경우 어떤 문자가 서로 일치합니까?
Neil

1
@Neil 음, 실제로 어떤 다른 데이터 정렬을 사용 하느냐에 달려 있습니다! :). 가장 눈에 띄는 것은 (서버 기본값 인 SQL_Latin1_General_SP1_CI_AS를 사용하여) 대소 문자 로마 숫자가 서로 일치한다는 것입니다. 어떤 .... 흠 ... 실제로 작동 할 수 있습니다 에 대한 그들은 같은 번호로 해결하기 때문에, 나를 여기에. 그러나 데이터 정렬 이름이 너무 길면 비용 절감에 영향을줍니다. BRB, 좀 더 테스트
해봐야합니다

1
@ Neil Nope, 좋지 않아. 이진이 아닌 데이터 정렬을 사용하면 일반적이지 않은 10 개의 문자 ( ⅐⅑⅒Ↄↄↅↆↇↈ↉↊↋호기심이있는 경우)가 모두 서로 일치합니다.
BradC

아, 그건 부끄러운 일이지만 알려 주셔서 감사합니다!
Neil


1

펄 6 , 13 52 바이트

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

온라인으로 사용해보십시오!


2
eval을 사용하는 것은 속임수가 아니지만 이것은 도전을 해결하지 않습니다. 실제로 작동하는 52 :*.sort:{%(<Ↄ 99 ↄ 99 ↊ 10 ↋ 11>){$_}//.EVAL}
Grimmy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.