Ordenar los números de serie detallados

17

Dada una lista de dos o más números de serie detallados de igual longitud mayor que dos, por ej.

[[ "three" , "one"  , "four"  ],
 [ "one"   , "five" , "nine"  ],
 [ "two"   , "six"  , "five"  ],
 [ "three" , "five" , "eight" ]]

ordenar la lista por los números que representan las palabras:

[[ "one"   , "five" , "nine"  ],
 [ "two"   , "six"  , "five"  ],
 [ "three" , "one"  , "four"  ],
 [ "three" , "five" , "eight" ]]

Puede requerir que los números se deletreen en mayúsculas o minúsculas, pero no en mayúsculas.

Casos de prueba

[["three","one","four"],["one","five","nine"],["two","six","five"],["three","five","eight"]]
da
[["one","five","nine"],["two","six","five"],["three","one","four"],["three","five","eight"]]

[["two","seven"],["one","eight"],["two","eight"],["one","eight"],["two","eight"],["four","five"]]
da
[["one","eight"],["one","eight"],["two","seven"],["two","eight"],["two","eight"],["four","five"]]

[["one","four","one","four","two"],["one","three","five","six","two"],["three","seven","three","zero","nine"]]
da
[["one","three","five","six","two"],["one","four","one","four","two"],["three","seven","three","zero","nine"]]

[["zero","six","one"],["eight","zero","three"],["three","nine","eight"],["eight","seven","four"],["nine","eight","nine"],["four","eight","four"]]
da
[["zero","six","one"],["three","nine","eight"],["four","eight","four"],["eight","zero","three"],["eight","seven","four"],["nine","eight","nine"]]

Adán
fuente
No estoy seguro si lo entendí correctamente, ¿verdad ["three","one","four"] === 314?
Nit
@Nit Sí, eso es correcto.
Adám
@Nit Por los números que deletrean. Por ejemplo, [314,159,265,358][159,265,314,358].
Adám
¿Podemos suponer una cierta capitalización arbitraria de los números?
dylnan
@dylnanYou may require the numbers to be spelled in lower or upper, but not mixed, case.
totalmente humano

Respuestas:

14

Casco , 9 8 bytes

Ö†€¨tfṡn

Pruébalo en línea!

Algoritmo "inspirado" por la respuesta recursiva de Stax (acabo de cambiar un poco la cadena de búsqueda), ¡vota!

El truco consiste en asignar cada letra a su posición en la cadena tfsen(comprimida al final de este programa). Las listas de cáscaras están basadas en 1, y los elementos faltantes devuelven 0, por lo que obtenemos esta asignación:

"one"        [0,5,4]
"two"        [1,0,0]
"three"      [1,0,0,4,4]
"four"       [2,0,0,0]
"five"       [2,0,0,4]
"six"        [3,0,0]
"seven"      [3,4,0,4,5]
"eight"      [4,0,0,0,1]
"nine"       [5,0,5,4]

Como puede ver, las listas están perfectamente ordenadas.


Para que quede claro, así es como funciona la comparación de listas en Husk (y en muchos otros idiomas):

  1. Si una de las dos listas está vacía, esa es la más pequeña.
  2. Si los primeros elementos de las dos listas son diferentes, el que tiene el primer elemento más pequeño es la lista más pequeña.
  3. De lo contrario, descarte el primer elemento de ambas listas y regrese al punto 1.
León
fuente
Si no me equivoco, la "w" también se puede eliminar, ya que solo es útil comparar "dos" con "tres", pero ya tiene "h". No estoy seguro si eso te ayuda. No he descubierto cómo integrar este hecho en un programa stax que aún es más pequeño.
recursivo el
... si solo fueran las letras, podrían ser, tfrsenpero supongo que tienen palabras como withysen allí ayuda a la compresión.
Jonathan Allan
Gracias chicos, me inspiraron a encontrar una cadena aún más corta: D
Leo
Entonces, ¿es como reemplazar las comas con un punto decimal después de la primera coma?
Fresa
@Strawberry No realmente, [1,0,0]se considera más pequeño que [1,0,0,0](pero para este programa no haría la diferencia)
Leo
10

Stax , 24 22 17 16 14 bytes

▄Ωφ▐╧Kìg▄↕ñ▼!█

Ejecutar y depurarlo

Este programa toma matrices de dígitos deletreados en minúsculas para la entrada. La salida está separada por nueva línea de esta manera.

one five nine
two six five
three one four
three five eight

Este programa clasifica las entradas utilizando el orden obtenido bajo una transformación específica. Cada carácter en cada palabra se reemplaza por su índice en la cadena"wo thif sen" . Las matrices originales se ordenan por este orden. Luego, los resultados se imprimen después de unirlos con un espacio.

Los espacios no sirven para nada, pero en realidad permiten una mayor compresión en la cadena literal.

recursivo
fuente
¿Qué codificación usa Stax? Esto es 32 bytes en UTF-8.
OldBunny2800
55
CP437 modificado, como explica el hipervínculo "bytes".
recursivo el
¿Existe algún algoritmo / método estándar para llegar a tal cadena? ¿El concepto tiene un nombre?
Itai
@Itai: Parece que lo haría, pero no sé qué es.
recursivo el
6

Jalea , 12 bytes

OḌ%⁽Т%147µÞ

Un enlace monádico.

Pruébalo en línea! ... o ver el pruebas

¿Cómo?

Convirtiendo los dígitos a ordinales y luego desde la base 10, luego tomando módulos por 4752 y luego 147, da un orden ascendente:

 zero            , one         , two         , three               , four
[122,101,114,111],[111,110,101],[116,119,111],[116,104,114,101,101],[102,111,117,114]
 133351          , 12301       , 12901       , 1276511             , 114384
 295             , 2797        , 3397        , 2975                , 336
 1               , 4           , 16          , 35                  , 42

 five            , six         , seven               , eight               , nine
[102,105,118,101],[115,105,120],[115,101,118,101,110],[101,105,103,104,116],[110,105,110,101]
 113781          , 12670       , 1263920             , 1126456             , 121701
 4485            , 3166        , 4640                , 232                 , 2901
 75              , 79          , 83                  , 85                  , 108

Esto se puede usar como una función clave para clasificar:

OḌ%⁽Т%147µÞ - Link: list of lists of lists of characters
          µÞ - sort (Þ) by the mondadic chain to the left (µ):
O            -   ordinals of the characters
 Ḍ           -   convert from base 10
   ⁽Т       -   literal 4752
  %          -   modulo
      %147   -   modulo by 147
Jonathan Allan
fuente
Esos son algunos módulos maravillosos que has encontrado allí, supongo que fue minucioso.
Erik the Outgolfer
No todo eso es meticuloso, aunque primero miré el binario.
Jonathan Allan
Como, forzaste a los módulos, ¿no?
Erik the Outgolfer
Sí, pero fue rápido.
Jonathan Allan
6

Python , 62 bytes

lambda m:sorted(m,key=lambda r:[int(s,36)%6779%531for s in r])

Pruébalo en línea! ... o ver el conjunto de pruebas

Nota:

lambda m:sorted(m,key=lambda r:[map("trfsen".find,s)for s in r])

que funciona en Python 2 (pero no 3) es más largo por dos bytes.

Jonathan Allan
fuente
1
¿Cómo descubriste los números mágicos?
mbomb007
1
Solo un bucle anidado que busca un aumento estricto sobre los resultados. Aunque posiblemente restringí la longitud de los dígitos del interior dado el exterior.
Jonathan Allan
5

APL (Dyalog Classic) , 12 bytes

'nesft'∘⍒⌷¨⊂

Pruébalo en línea!

Así es como encontré un argumento izquierdo adecuado para dyadic (probé y longitud 6 primero):

A←⊖a←↑'zero' 'one' 'two' 'three' 'four' 'five' 'six' 'seven' 'eight' 'nine'
{(aa[⍵⍒a;])∧Aa[⍵⍒A;]:⎕←⍵}¨,⊃∘.,/5⍴⊂∪∊a
ngn
fuente
3

Perl 6 , 37 bytes

*.sort:{('digit 'X~$_)».parse-names}

Intentalo

Expandido:

*\     # WhateverCode lambda (this is the parameter)
.sort:
{  # block with implicit parameter 「$_」
  (
    'digit ' X~ $_  # concatenate 'digit ' to each named digit
  )».parse-names    # call .parse-names on each
}

El bloque de código tomará un valor del formulario ("three","one","four")y lo traducirá a ("3","1","4")un valor que .sortpuede usar fácilmente.

Brad Gilbert b2gills
fuente
3

APL (Dyalog) , 38 bytes

{⍵[⍋(531∘⊥⍤1)(531|6779|369+⎕A⍳⊢)¨↑⍵]}

Pruébalo en línea!

Basado en la increíble solución de Jonathan Allan .

Uriel
fuente
1
@ JonathanAllan Edité un crédito durante el tiempo de cambio inicial. No tengo idea de por qué no se modificó. arreglado ahora
Uriel
1
31:, ⊂⌷¨⍨∘⍋(531⊥531|6779|36⊥9+⎕A⍳⊢)¨pero puede hacerlo mucho más simple en menos de la mitad de su conteo de bytes actual.
Adám
@ Adám entonces, ¿tolera la entrada y salida en diferentes formatos (mixto vs no mezclado)?
ngn
@ngn Claro. Pero la solución que tengo en mente tiene E / S completamente mixtas.
Adám
3

Ruby, 48 bytes

->x{x.sort_by{|y|y.map{|s|s.to_i(35)**2%47394}}}

Abusa del hecho de que "zero".to_i(35)es 0 (ya que 'z' no es un dígito válido en la base 35), por lo que es mucho más fácil forzar una fórmula para los otros nueve dígitos.

histocrat
fuente
2

Ruby , 47 bytes

->x{x.sort_by{|y|y.map{|s|s.to_i(32)%774%538}}}

Pruébalo en línea!

Utiliza el hecho de que el uso de una base menor que el dígito máximo produce un resultado de cero (como señaló el histocrat en su respuesta )

Jonathan Allan
fuente
2

Python 2 , 85 81 80 bytes

Simplemente usa las dos primeras letras de cada palabra para determinar el número, luego ordena cada lista usando esa función de indexación como clave.

lambda _:sorted(_,key=lambda L:['zeontwthfofisiseeini'.find(s[:2])/2for s in L])

Pruébalo en línea!

Guardado 4 bytes, gracias a Jonathan Allan

mbomb007
fuente
La comprensión de la lista de bucles for en la función clave es 4 bytes más corta.
Jonathan Allan
1

05AB1E , 27 bytes

Σ“¡×€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š“#skJ

Pruébalo en línea!


Σ                           # Sort input by...
 “¡×€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š“     # "zero one two three four five size seven eight nine"
                       #    # Split on spaces.
                        sk  # Find index of each input...
                          J # Join up.
Urna de pulpo mágico
fuente
25 bytes
Kaldo
@Kaldo ah ... ¿codifica las 2 letras iniciales de cada una? Siento que esa debería ser su propia respuesta.
Magic Octopus Urn
1

Haskell , 133 122 109 107 106 bytes

import Data.List
sortOn$abs.read.(>>=show.head.(`elemIndices`words"ze on tw th fo fi si se ei ni").take 2)

Sin golf:

import Data.List

nums = ["ze","on","tw","th","fo","fi","si","se","ei","ni"]

lookup' :: Eq a => a -> [a] -> Int
lookup' v = head . elemIndices v

wordToInt :: String -> Int
wordToInt (x:y:_) = lookup' [x,y] nums

wordsToInt :: [String] -> Int
wordsToInt = read . concatMap (show . wordToInt)

sortN :: [[String]] -> [[String]]
sortN = sortOn wordsToInt
usuario9549915
fuente
1

Java (JDK 10) , 132 bytes

l->{l.sort((a,b)->s(a)-s(b));}
int s(String[]a){int v=0;for(var s:a)v=v*99+"zeontwthfofisiseini".indexOf(s.substring(0,2));return v;}

Pruébalo en línea!

Olivier Grégoire
fuente
0

Perl 5 , 103 bytes

sub c{pop=~s%(..)\w+\s*%zeontwthfofisiseeini=~/$1/;$`=~y///c/2%ger}say s/\R//gr for sort{c($a)<=>c$b}<>

Pruébalo en línea!

Xcali
fuente
0

Retina 0.8.2 , 38 bytes

T`z\o\wit\hfsen`d
O`
T`d`z\o\wit\hfsen

Pruébalo en línea! El enlace incluye un conjunto de pruebas. Funciona reemplazando temporalmente las letras zowithfsencon su posición en esa cadena, lo que permite que los números se ordenen léxicamente.

Neil
fuente
0

Jalea , 30 28 27 bytes

w@€“¡¦ẇṆb~ṇjṚØ%ĖġṘḥḞṾṇJḌ»µÞ

Pruébalo en línea!

-1 gracias a Jonathan Allan.

Encuentra el índice de cada dígito en la cadena 'onetwo ... nueve' y luego ordena usar esto como una función clave con Þ. No es necesario incluir 'zero'al principio porque la búsqueda de los dos primeros caracteres de 'zero'fallará y 0se devolverá en lugar de un índice, lo que 'zero'lexicográficamente es "temprano".

dylnan
fuente
Usar una compresión de 'uno dos ... nueve' es un byte menos
Jonathan Allan
@ JonathanAllan Ah, gracias. No había pensado en comprobar eso. La compresión 'zeontw...ni'terminó siendo más larga.
dylnan
... ya no "... las dos primeras letras".
Jonathan Allan
0

Python 3, 141 bytes

print(sorted(eval(input()),key=lambda l:int(''.join([str("zero one two three four five six seven eight nine".split().index(i))for i in l]))))

Pruébalo en línea!

hakr14
fuente
131 bytes
caird coinheringaahing
0

C (sonido metálico) , 229 bytes

y,j,k,t[9];char *s="zeontwthfofisiseeini";r(char **x){for(j=y=k=0;k+1<strlen(*x);k+=j,y=y*10+(strstr(s,t)-s)/2)sscanf(*x+k,"%2[^,]%*[^,]%*[,]%n",t,&j);return y;}c(*x,*y){return r(x)-r(y);}f(*x[],l){qsort(&x[0],l,sizeof(x[0]),c);}

Pruébalo en línea!

No hay una forma directa de enviar una matriz de series de cadenas a las funciones de C, por lo que, en el espíritu del código golf, me he tomado una libertad menor en el formato de entrada.

f()acepta una matriz de punteros a cadenas, donde cada cadena es un número, representado por dígitos deletreados separados por comas en minúsculas. Además, necesita varias cadenas en la matriz en el segundo parámetro. Espero que esto sea aceptable.

f()reemplaza los punteros en su lugar en orden ordenado usando qsort().
r()lee el número de entrada de una cadena de números separados por comas. Solo compara los dos primeros caracteres para identificar el número.
c()es la función de comparación

GPS
fuente
1
207 bytes
ceilingcat el
@ceilingcat ¿Puedes explicarlo strstr("i"-19,t)-"zeontwthfofisiseeini"? ¿Es específico del compilador o estándar?
GPS
Eso se basa en que no hay otros patrones en .rodataese aspecto 0x69 0x00y el compilador coloca la dirección de "i"al final de"zeo..."
ceilingcat
pensé que sí ... ¿hay alguna manera de asegurar que el compilador haga eso? Sé que las reglas aquí permitirían esto, pero ¿podría depender de esto en verdad?
GPS
Mi instinto es evitar esto en el "mundo real", pero esto probablemente funcionará bien si sus fragmentos de cadena son lo suficientemente únicos. En realidad, puede haber algún caso de uso legítimo, tal vez relacionado con los canarios de pila, pero también podría estar alucinando.
ceilingcat