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 código de golf , por lo que gana la respuesta más corta en bytes para cada idioma ¡Buena suerte!
Respuestas:
Python 3 ,
216213 bytes-3 bytes gracias a TFeld
Pruébalo en línea!
Con una función incorporada que obtiene el valor numérico, 111 bytes
Pruébalo en línea!
fuente
↉
de la cadena (encuentre los retornos-1
más pequeños)Perl 6 , 57 bytes
Pruébalo en línea!
Simplemente busca los cuatro caracteres excepcionales en un hash, o recurre al
unival
método incorporado .fuente
05AB1E (heredado) ,
192746361 bytes-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:
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:
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 comprimido1485725021600091112740267145165274006958935956446028449609419704394607952161907963838640094709317691369972842282463
, 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 .
fuente
"]&%/$-)`'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в
Retina ,
193 bytes (UTF-8)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.
fuente
Jalea , 55 bytes
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.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:
que se divide en líneas nuevas y se une con
⁸
s para dar el código Python: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.fuente
Japt , 72 bytes
Pruébalo o ejecuta todos los casos de prueba
Explicación
Puntos de código
Solución original,
908988 bytesPruébalo o ejecuta todos los casos de prueba
Explicación
Puntos de código
fuente
05AB1E,
565351504948 bytesPrué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.
fuente
JavaScript (SpiderMonkey) , 117 bytes
Pruébalo en línea!
fuente
T-SQL, 207 bytes
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_BIN
ya 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:
fuente
⅐⅑⅒Ↄↄↅↆↇↈ↉↊↋
si tiene curiosidad) coinciden entre sí.Ruby , 77 bytes
Cambia todos los caracteres a letras que representan los valores numéricos y los ordena por eso.
Pruébalo en línea!
fuente
Perl 6 ,
1352 bytesPruébalo en línea!
fuente
*.sort:{%(<Ↄ 99 ↄ 99 ↊ 10 ↋ 11>){$_}//.EVAL}