Todos conocemos diferentes algoritmos de clasificación sofisticados, pero ninguno de estos nos da números de una manera fácil de pronunciar. Para remediar esto, propongo usar PronunciaciónSort ™, la forma más natural de ordenar listas de números.
Pronunciación
Las reglas oficiales para pronunciar números (en este desafío) es que los dígitos se pronuncian uno por uno, y la cadena resultante se ordena en orden lexicográfico. Como ejemplo, esto significa que el número 845
se pronuncia "eight four five"
y debe clasificarse en consecuencia.
Números negativos
Los números negativos se pronuncian anteponiendo la palabra "minus"
. Por lo tanto, -23
se pronuncia como "minus two three"
. Tenga en cuenta que esto hace que los números negativos terminen en el medio de la salida, justo entre los números que comienzan con 4
(cuatro) y 9
(nueve).
Como guía, el orden oficial de las palabras para PronunciaciónSort ™ es:
- ocho
- cinco
- cuatro
- menos
- nueve
- uno
- Siete
- seis
- Tres
- dos
- cero
Es decir,
8, 5, 4, -, 9, 1, 7, 6, 3, 2, 0
Entrada
Una lista de enteros en el rango , que contiene como máximo 100 elementos. La entrada como una lista de cadenas no está permitida. Si su idioma no admite la entrada como lista, es permisible dar entrada como enteros separados.
La entrada no contendrá ningún número inválido, o cualquier número que comience con un 0 (excepto el número 0 en sí). La entrada generalmente no se ordenará, se puede dar en cualquier orden.
Salida
Los mismos enteros, en el orden de PronunciaciónSort ™. Tenga en cuenta que los números solo deben convertirse a sus pronunciaciones para obtener la clasificación, la salida no debe contener cadenas.
Ejemplos
Para los ejemplos, el paso intermedio (entre paréntesis) solo sirve como guía y no es parte de la salida.
[1, 2, 3] -> (['one', 'two', 'three']) -> [1, 3, 2]
[-1, 0, 1, 2] -> (['minus one', 'zero', 'one', 'two']) -> [-1, 1, 2, 0]
[-100, 45, 96] -> (['minus one zero zero', 'four five', 'nine six']) -> [45, -100, 96]
[11, 12, 13, 134, 135] -> (['one one', 'one two', 'one three', 'one three four', 'one three five']) -> [11, 13, 135, 134, 12]
También hay un script para verificar sus resultados .
Respuestas:
05AB1E (heredado) , 15 bytes
Pruébalo en línea!
Explicación
fuente
•ĆU‘•
. Agrega una nueva línea durante el mapeo / clasificación por cualquier razón.Σ•ĆU‘•"54-ÿ"sSk
podría haber sido una alternativa de 15 bytes en la que estaba trabajando, si no fuera por ese error extraño ... Si cambio•ĆU‘•
al literal9176320
, funciona bien ...…54-ì
inclusoΣ•RT‹•Á…54-ìsSk
por 15•t∍ýJ•'-ìÁÁ
también funcionaríaHaskell , 57 bytes
Pruébalo en línea!
fuente
Jalea ,
1513 bytesPruébalo en línea!
Un enlace monádico que acepta una lista de enteros que produce una lista de enteros.
¿Cómo?
Ordena por los valores ordinales de los dígitos de los enteros (donde
-
es un "dígito" de -1) convertidos en cadenas usando los caracteres en su índice basado en 1 y modular en la cadena mágica "murgeon lix".El tipo es efectivamente alfabético donde un espacio se considera menos que cualquier letra.
La cadena mágica "murgeon lix" se encontró inspeccionando los diccionarios de Jelly utilizados en la compresión. No hay palabras de 11 letras que cumplan los requisitos (y ninguna más que lo haría en caso de deduplicación). Dado que un espacio se ordena antes de las letras, la siguiente opción más obvia es una palabra de longitud siete seguida de un espacio seguido de una palabra de longitud tres. "murgeon" y "lix" es la única combinación satisfactoria, aunque sin un espacio otros pueden ser posibles (por ejemplo,
“£Py:ƥ»
es "murgeonalix" que funciona para el mismo número de bytes)Anterior @ 15 bytes :
Aquí se
“¡Zo⁶’Œ?¤
encuentra la primera permutación de números naturales que residiría en el índice 21,340,635 cuando todas las permutaciones de los números se ordenan lexicográficamente, que es[6,10,9,3,2,8,7,1,5,4,11]
. (“¡Zo⁶’
es una representación de base 250 de 21340635, mientrasŒ?
realiza el cálculo y¤
agrupa estas instrucciones)fuente
Perl 6 , 30 bytes
Pruébalo en línea!
Puerto de la solución Ruby de GB.
Versión original de 35 bytes
Pruébalo en línea!
Convierta cada número en una cadena, obtenga el nombre Unicode de cada carácter, quite la primera palabra ("DIGIT" o "HYPHEN"), luego ordene.
fuente
JavaScript (SpiderMonkey) , 69 bytes
Pruébalo en línea!
fuente
+''
, ya que está tomando la entrada como una matriz de cadenas.K (ngn / k) ,
2120 bytesPruébalo en línea!
{
}
funcionar con argumentox
$
formatear como cadenas"
"?
"8"
<
calcular permutación ascendentex@
el argumento en esos índicesfuente
Python 3,
68 bytes67 bytes64 bytesUtiliza la
sorted
función integrada con una lambda anónima para la clave. Codifique el orden de clasificación y compare cada dígito en cada valor de la lista de entrada con su posición en la lista de clasificación.Editar: se guardó 1 byte al eliminarlo
8
de la lista de clasificación para aprovechar elstr.find
retorno-1
cuando no se encuentra el parámetro. Gracias a maxb.Edit2: guardado 3 bytes usando la sintaxis destacada de desempaquetado en un
list
literal en lugar delist
constructorPruébalo en línea!
fuente
lambda x:sorted(x,key=lambda y:map('54-9176320'.find,`y`))
Pyth,
1716 bytesPruébelo en línea aquí , o verifique todos los casos de prueba a la vez aquí .
Se guardó 1 byte gracias a @ngn y su respuesta K , al omitir 8 desde el comienzo de la cadena del diccionario
fuente
Japt, 19 bytes
Intentalo
fuente
S.n(s)
:ñ_s ®n"54-9176320
(aparentementeS.n(s)
es exactamente lo mismo ques.b(S)
para laS
longitud 1, excepto que regresa0
en lugar de-1
)Retina 0.8.2 , 36 bytes
Pruébalo en línea! El enlace incluye un conjunto de pruebas. Explicación:
Traslade el signo menos y los dígitos a su posición en el orden de pronunciación, utilizando
:
para la décima posición.Ordenar en orden de pronunciación.
Vuelva a traducir el pedido al signo menos original y a los dígitos.
fuente
Ruby , 50 bytes.
Pruébalo en línea!
fuente
R , 58 bytes
Pruébalo en línea!
La entrada es una lista de números que se convierte implícitamente como una cadena usando
chartr
.order
luego usa el orden lexigográfico para recuperar el orden por el cual se debe ordenar la lista original.fuente
Java (JDK 10) , 123 bytes
Pruébalo en línea!
Esta es una ingenua implementación de Java. Debería ser mucho golfable.
Créditos
fuente
.chars
-IntStream y.reduce
a un bucle normal ahorra 2 bytes:n->{var r="";for(var c:(""+n).split(""))r+=10+"854-9176320".indexOf(c);return r;}
. Además, se puede guardar un byte más cambiando10+"85
a20+"5
, ya que el.indexOf
dígito for8
generaría -1. Pruébelo en línea 123 bytesJavaScript (SpiderMonkey) ,
8773 bytesPruébalo en línea!
Gracias @Arnauld por decir que el tipo en SpiderMonkey es estable, por lo que la
||-(F(q)>F(p))
parte finalmente se puede descartar.fuente
Rojo , 114 bytes
Pruébalo en línea!
Más legible:
fuente
C ++, 353 bytes
Esta es una especie de entrada de comedia, pero estaba perdiendo el tiempo y la escribí, así que no puedo no publicarla ... ¡Disfruta de una risita y avísame si me perdí algún ahorrador de espacio!
Salida:
fuente
Mathematica, 68 bytes
Función. Toma una lista de enteros como entrada y devuelve la lista ordenada como salida. Simplemente separa los dígitos de cada número con
IntegerDigits
, convierte cada dígito en"zero"
,"one"
etc., conIntegerName
, convierte la lista en una cadena separada por espacios conStringRiffle
, antepone un"m "
si el número es negativo y se ordena según esta cadena. De hecho, este fue el enfoque más corto que pude encontrar, ya que Mathematica solo utiliza de forma nativa la clasificación lexicográfica para listas de la misma longitud; así, un enfoque basado en854-9176320
termina tomando más bytes ya que las funciones de cadena son muy caras.fuente
05AB1E ,
1514 bytes-1 byte gracias a @Emigna .
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
Ver este consejo 05AB1E mío (sección Cómo comprimir grandes números enteros ) para entender por qué
•ĆU‘•
es9176320
.fuente