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


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.

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.


¿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

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.


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

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.


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 .


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.





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


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.


@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





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.


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".


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

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



@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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.