Alfabetizar enteros
Para un conjunto dado de números, póngalos en orden alfabético cuando se deletreen (es decir, 1: uno, 2: dos, 90: noventa, 19: diecinueve). Su código debería funcionar para el rango [-999999, 999999]
. La salida debe tener un delimitador entre números. Un espacio funcionará, al igual que un espacio y una coma como se muestra en los ejemplos a continuación. La entrada puede ser una matriz de enteros, una cadena de números delimitados, o como mejor le parezca. Se supone que todos los enteros son únicos.
Los números no están separados por guiones para los propósitos de este desafío y los espacios están ordenados alfabéticamente antes que cualquier otro personaje. Se supone que los números negativos se expresan usando la palabra minus
. Por ejemplo, four
precedería four thousand
y el número se -40
ordenaría usando la cadena minus forty
. Suponga que todos los números estarán compuestos únicamente por palabras numéricas y sin conjunciones (por ejemplo, use en two thousand forty two
lugar de two thousand and forty two
).
Casos de prueba
Enteros de un solo dígito:
Entrada:
1, 2, 3, 4, 5
Salida:
5, 4, 1, 3, 2
Múltiples dígitos enteros:
Entrada:
-1002, 5, 435012, 4, 23, 81, 82
Salida:
81, 82, 5, 4, 435012, -1002, 23
Espacios entre palabras, sin guiones, comas o "y":
Entrada:
6, 16, 60, 64, 600, 6000, 60000, 60004, 60008, 60204, 60804
Salida:
6, 600, 6000, 16, 60, 64, 60000, 60008, 60804, 60004, 60204
Recuerde, este es el código de golf , por lo que gana el código con la menor cantidad de bytes. ¡No se permiten escapatorias!
Respuestas:
JavaScript (ES6),
189179186 bytesLa idea básica es convertir cada número de entrada en una cadena corta que esté en la posición lexográfica correcta en comparación con todos los otros pares de cadenas de números. Aquí está el diccionario utilizado: (No ejecute el fragmento; solo se utiliza para ocultar la lista larga).
Mostrar fragmento de código
Esto crea una forma muy concisa de asignar cada número a su posición lexográficamente correcta. Eso es lo recursivo
q
función :El
0
principio de la cadena es asegurar que, por ejemplo, 100 (one hundred
, convertido aPK0
) se ordene antes101
(one hundred one
, convertido aPKP
). Esto crea un escenario extraño donde 0 (zero
) se ordena al frente de la matriz, por lo tanto, para evitar esto, en la función de clasificación primero ordenamos los ceros a la derecha!x-!y||(...
.fuente
[1100, 1000]
. Esperaría que la salida fuera1000 (one thousand), 1100 (one thousand one hundred)
, pero la salida es del mismo orden que la entrada.1000
se analiza comoone thousand zero
; Arreglaré esto momentáneamente. ¿Sin0
embargo, debemos apoyar por sí mismos? Es un caso único que agregará 15 bytes más o menos a mi código.Informar 7,
214201118 bytesInform 7 es un lenguaje absolutamente terrible para el golf, por lo que quería darle una oportunidad aquí.
La sangría debe usar caracteres tab (
\t
), pero a HTML no le gustan. Por el contrario, a Inform no le gustan los espacios para sangría, por lo que deberá reemplazar los espacios con pestañas si copia y pega el código desde aquí para probarlo. O simplemente copie y pegue de la fuente Markdown en su lugar.Golfizado:
La entrada debe ser una tabla Inform, así (con
\t
entre las columnas):Salida:
Esta función se ejecuta a través de la tabla una vez, agregando una representación textual de cada número en una nueva columna. Luego ordena las filas de la tabla de acuerdo con la columna de texto; en Inform, las cadenas se ordenan lexicográficamente. Finalmente, imprime la columna original en el nuevo orden. Convenientemente, el formato "crudo pero a veces útil" de Inform 7 para imprimir columnas de tablas resulta estar separado por comas, exactamente como se solicitó.
Ungolfed, con repetitivo que muestra cómo llamar a la función:
fuente
words
una referencia de las versiones detalladas de los números en Inform 7?say "[R entry] "
debería ser suficiente.Mathematica, 67 bytes
Función sin nombre que toma una lista de enteros como argumento y devuelve una lista de enteros como su valor.
#~IntegerName~"Words"
es una función integrada que cambia un número entero a su nombre en inglés.IntegerName
a veces tiene comas y guiones en su salida, por lo que laStringReplace
llamada los elimina. (Lamentablemente, el guión es en realidad el carácter de 3 bytes, 8208, en UTF-8.) LuegoSortBy
ordena la lista original alfabéticamente según el valor del nombre entero modificado.Una buena coincidencia:
IntegerName
usa ennegative
lugar deminus
en su salida, pero ninguna palabra que aparece en los nombres de ninguno de los números permitidos está alfabéticamente entre esas dos palabras, ¡por lo que no es necesario reemplazarla!(Punta de sombrero para ngenisis por recordarme
Sortby
).fuente
IntegerName
. La documentación de Wolfram dice que es unicode character 2010 .Bash + GNU utils + bsdgames, 52
I / O son líneas delimitadas por nueva línea.
number
), seguido de un:
forma numérica del número.sort
ed.sed
elimina los caracteres principales hasta e incluyendo el:
, dejando la forma numérica ordenada según sea necesario.number
maneja correctamente "menos", y su salida está lo suficientemente cerca del formato específico quesort
funciona como se requiere. Produce "cuarenta y cuatro" en lugar de "cuarenta y cuatro", pero esto no debería importar desde la perspectiva de la clasificación.El paquete bsdgames puede necesitar instalación:
Las utilidades
sed
ysort
casi seguramente ya están en su distribución.fuente
-t:
es inútil y puedes usarlonumber<<<&
-t:
. Sin embargo, lae
función val de sed ejecuta comandos usandosh
, por lo que las funciones bash como<<<
no funcionarán.sh
que trata de emular Posix sh tanto como sea posible, lo que significa que los bashismos como<<<
están desactivados.sed
Lae
función val de GNU inicia comandos con/bin/sh -c ...
y no/bin/bash -c ...
. ¿Has probado esto?<<<
, ni siquiera en modo posixPython + inflex,
979189 bytesUsó la
inflect
biblioteca para transformar lawords
matriz de enteros en su representación fonética / de cadena. Almacenado en un diccionario de pares k / v donde las claves eran la representación numérica y los valores eran la representación de la cadena. Devuelve la lista de claves ordenadas por valores.EDITAR: ¡Guardado 5 y 3 bytes, gracias a ETHproductions y Alex.S!
fuente
a={x:inflect.engine().number_to_words(x)for x in words}
.from inflect import*
y tirandoinflect.
en la segunda línea.Mathematica, 30 bytes
La siguiente respuesta genera una función pura que tomará una lista de enteros como entrada y los ordenará por su nombre alfabético. Justo lo que recetó el doctor ;)
Aquí está la versión sin golf:
Y aquí hay un ejemplo de uso:
Que también podría escribirse como
Producen salidas idénticas - en matemática,
f[x]
es equivalente af@x
.Hay una respuesta mucho más larga que otro usuario publicó en Mathematica. Esa respuesta trata de corregir algunas pequeñas diferencias entre la forma en que Mathica alfebatiza los números para ajustarse mejor a la forma en que los números indicados por OP deben alfebatizarse, sin embargo, las cosas que corrigen no afectan el orden de clasificación, y mi respuesta sale idénticamente a la suya:
fuente
TheirF
ordena correctamente 888 antes de 880,000, mientras queMyF
que no lo hace. Probablemente el problema esté relacionado con el copiado y pegado del extraño guión: su versión deTheirF
probablemente está reemplazando los guiones normales (de los cuales no hay ninguno), mientras que la versión real reemplaza el extraño guión Unicode de 3 bytes. (Todavía sería interesante ver si es necesario eliminar comas).Lisp común, 113 bytes
No se necesitan bibliotecas externas.
Salida si
x
es'(1 2 3 4 5)
:fuente