Tipo de números

21

Dentro de los huecos de los caracteres Unicode, existe un bloque Unicode de (actualmente) 63 caracteres llamado "Formularios numéricos", que consiste en caracteres que tienen valores numéricos como el número romano Ⅻ, fracciones vulgares como ⅑ o ↉, o extraños como ↊ (10) o ↈ (100000).

Su tarea es escribir un programa o función que, cuando se le da una lista de caracteres Unicode asignados dentro de este bloque, clasifica la lista por los valores numéricos de cada carácter.

Se puede encontrar una lista (ordenable) de caracteres y valores en la página de Wikipedia .

Sin embargo, para ser autónomo, aquí hay una lista de los puntos de código y sus valores:

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

Casos de prueba:

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

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

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

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

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

Tenga en cuenta que cuatro de los símbolos (los que se usaron en el último caso) no son números unicode, aunque todavía tienen un valor numérico, así que asegúrese de verificar antes de simplemente publicar un incorporado.

Reglas:

  • Si se asignan más caracteres a este bloque en el futuro, no necesitará actualizar su código para admitirlos.
  • El orden de los caracteres con valores idénticos no importa.
  • IO es flexible .
    • Sin embargo, la salida debe ser como los caracteres, no los valores numéricos
  • Las lagunas estándar están prohibidas.
  • No estoy prohibiendo los complementos que pueden obtener el valor numérico de un personaje, pero también animo a agregar una respuesta no incorporada si es posible.
  • Este es el , por lo que gana la respuesta más corta en bytes para cada idioma ¡Buena suerte!
Jo King
fuente
99
RIP monoespaciamiento :(
Jo King

Respuestas:

6

Python 3 , 216 213 bytes

-3 bytes gracias a TFeld

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

Pruébalo en línea!

Con una función incorporada que obtiene el valor numérico, 111 bytes

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

Pruébalo en línea!

Barra
fuente
44
Puede guardar 3 bytes quitándolos de la cadena (encuentre los retornos -1más pequeños)
TFeld
4

Perl 6 , 57 bytes

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

Pruébalo en línea!

Simplemente busca los cuatro caracteres excepcionales en un hash, o recurre al univalmétodo incorporado .

Sean
fuente
No necesitas el espacio después del colon. Además, su enlace todavía está en un bloque de código en lugar de un Lambda Cualquiera
Jo King
4

05AB1E (heredado) , 192 74 63 61 bytes

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

-118 bytes usando solo caracteres de la página de códigos 05AB1E, por lo que no necesitamos usar la codificación UTF-8.
-11 bytes gracias a @Adnan .
-2 bytes gracias a @Grimy .

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

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

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

Basado en el orden de los caracteres modulo-100 obtenemos la siguiente lista:

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

Estos son generados por el siguiente programa:

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

Pruébalo en línea.

•Bšā¿ÑáζΔÕæ₅"®GÙ₂®°ƶío"§óÏ4¸bćÔ!₃ùZFúÐìŸ\n,λ₂ϦP(Ì•65в₂+es una variación más corta de esta lista al tomar el número comprimido 1485725021600091112740267145165274006958935956446028449609419704394607952161907963838640094709317691369972842282463 , luego convertirlo a Base-65 y luego agregar 26 a cada uno.

Pruébelo en línea y verifique que las listas sean las mismas .

Kevin Cruijssen
fuente
1
Sí, no todos esos caracteres están en la codificación 05AB1E, por lo que serían 192 bytes.
Okx
2
Sí, no es posible representar este código como un archivo de 68 bytes que nos obliga a recurrir a UTF-8, que en realidad es de 192 bytes .
Adnan
1
@JoKing Entonces, ahora solo estoy usando caracteres de la página de códigos de 05AB1E. ;) Sigue siendo un enfoque aburrido, pero veré si puedo encontrar algún tipo de patrón aritmético.
Kevin Cruijssen
1
Creo que puede reemplazar "]&%/$-)`'0*a+1(b,.234D5E6F7G8H9IY:J;K<L=M^>N_?O@PZAQWXBRCSTUV[\"Ç8-con•4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91в
Adnan
1
Hmm, eso parece ser un error de análisis al no registrar el corchete de cierre. Investigaré esto.
Adnan
3

Retina , 1 93 bytes (UTF-8)

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

Pruébalo en línea! Explicación: Ordena los caracteres en orden de puntos de código, luego los asigna entre los caracteres numéricos y los caracteres ASCII para que los caracteres numéricos con el valor más bajo asignen los caracteres ASCII con el punto de código más bajo y viceversa. Luego repite el ejercicio, de modo que los caracteres ahora se ordenan en el orden de este mapeo ASCII, que corresponde al orden numérico deseado, antes de que se vuelvan a transformar. Editar: se guardaron 100 (!) Bytes especificando el orden de los caracteres ASCII en lugar de los caracteres numéricos.

Neil
fuente
3

Jalea , 55 bytes

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

Un enlace monádico que acepta una lista de caracteres que produce una lista de caracteres.

Pruébalo en línea!

¿Cómo?

Mucho más simple de lo que parece, ya que “$Żz*ṀḢD⁹VṢaʠƝ lẹkƝʋ9⁽ƭXmż4#⁺3ç%|ọṢLxƈ⁽}ÞƇ2’es solo un gran número en la base 250 que usa la página de códigos de Jelly como dígitos, usaré “...’en su lugar.

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

Aparte

Irónicamente, el más cercano a un "uso de un enfoque integrado" que pude reunir fue de 85 bytes , esto usa una cadena comprimida:

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

que se divide en líneas nuevas y se une con s para dar el código Python:

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

que es ejecutable dentro del intérprete de Jelly: colocará el valor numérico del carácter Unicode en el argumento izquierdo nilad, para su uso posterior.

Jonathan Allan
fuente
3

Japt , 72 bytes

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

Pruébalo o ejecuta todos los casos de prueba


Explicación

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

Puntos de código

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

Solución original, 90 89 88 bytes

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

Pruébalo o ejecuta todos los casos de prueba


Explicación

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

Puntos de código

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
Lanudo
fuente
3

05AB1E, 56 53 51 50 49 48 bytes

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

Pruébalo en línea!

En el núcleo de esta solución hay una lista comprimida que asigna puntos de código Unicode a una clave de clasificación. Los caracteres que corresponden al mismo número se asignan a la misma clave, por lo que solo necesitamos 40 teclas diferentes.

70 es el número más pequeño por el cual podemos modular todos los puntos de código de entrada y obtener resultados distintos. Dado que la indexación en 05AB1E se ajusta, no necesitamos hacerlo explícitamente 70%, solo asegúrese de que la lista tenga una longitud de 70.

Observe que hay largos tramos de puntos de código consecutivos con teclas consecutivas. Por lo tanto, la codificación (clave - punto de código) en lugar de simplemente (clave) proporciona largos tramos de números idénticos, que se pueden codificar por longitud de ejecución. Sin embargo, el rango de puntos de código es muy grande (malditos esos 0xBC .. 0xBE), lo que sería un problema. Entonces, en lugar de (key - codepoint), codificamos (key - sum_of_digits (codepoint)), que desafortunadamente limita la longitud del estiramiento a 10, pero funciona bastante bien al reducir el rango de valores codificados. (Por supuesto, otras funciones son posibles, como codepoint% constante, pero la suma de dígitos da los mejores resultados).

Además, resulta que rotar la lista por 2 juega bien con la codificación de longitud de ejecución, por lo que restamos 2 del punto de código antes de la indexación.

•Ω‘~È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
Mugriento
fuente
1

T-SQL, 207 bytes

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

El retorno en el medio de la cadena es solo para legibilidad. Creo que obtuve el recuento de bytes correcto (3 de los caracteres numéricos son de 1 byte, el resto son de 2 bytes), el recuento de caracteres es 148.

Pre-ordené la cadena en orden ascendente, dejando de lado (que devuelve 0) como lo sugieren otras respuestas.

Cualquier intercalación binaria funcionará, utilicé Thai_BINya que tiene el nombre más corto. (Una recopilación en SQL prescribe cómo se realiza la clasificación / comparación de caracteres, necesito binario para que cada carácter solo coincida).

Según nuestros estándares de IO , la entrada se toma a través de la tabla t preexistente con el NCHAR(1)campo c .

Si define la tabla de entrada en sí utilizando una intercalación binaria, puede omitirla para guardar 16 bytes:

CREATE TABLE t(c NCHAR(1) COLLATE Thai_BIN)
BradC
fuente
¿Qué caracteres coincidirían entre sí si no utilizaras la intercalación binaria?
Neil
1
@Neil ¡Bueno, depende de qué otra colación uses, en realidad! :). El más obvio que noté (usando el valor predeterminado de mi servidor SQL_Latin1_General_SP1_CI_AS) fue que los números romanos en mayúscula y minúscula coinciden entre sí. Lo cual ... hmm ... en realidad podría funcionar para mí aquí, ya que se resuelven al mismo número. Pero si el nombre de la recopilación es mucho más largo, eso contrarresta los ahorros. BRB,
tengo
1
@Neil No, no está bien. Con las intercalaciones no binarias, 10 de los caracteres menos comunes ( ⅐⅑⅒Ↄↄↅↆↇↈ↉↊↋si tiene curiosidad) coinciden entre sí.
BradC
Ah, es una pena, pero gracias por hacérmelo saber.
Neil
1

Ruby , 77 bytes

Cambia todos los caracteres a letras que representan los valores numéricos y los ordena por eso.

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

Pruébalo en línea!

Tinta de valor
fuente
1

Perl 6 , 13 52 bytes

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

Pruébalo en línea!

bb94
fuente
2
Usar eval no es hacer trampa, pero esto simplemente no resuelve el desafío. 52 que realmente funciona:*.sort:{%(<Ↄ 99 ↄ 99 ↊ 10 ↋ 11>){$_}//.EVAL}
Grimmy