Ordenar por alfabeto personalizado


9

El desafío es hacer un programa que clasifique una lista de palabras, solo que las palabras deben estar en el orden de un alfabeto dado al azar.

Su programa aceptará una cadena de palabras separadas por comas y un nuevo alfabeto.
Su programa mostrará cada palabra de la misma manera en el nuevo orden ordenado.

Ejemplo:

Entrada:

home,oval,cat,egg,network,green bcdfghijklmnpqrstvwxzaeiouy

Salida:

cat,green,home,network,egg,oval

Este es un , por lo que el ganador es la persona con el programa más corto.

Este es mi primer desafío, por lo que cualquier mejora en la pregunta / desafío es apreciada.


1. Tomo de tu ejemplo que el alfabeto estará separado de las palabras por un espacio. ¿Es eso correcto? 2. ¿Las palabras siempre estarán en minúsculas?
Dennis

@Dennis sí a ambos
Mathetic

1
Eso es un error Lo editaré.
Mathetic

+1 pregunta OK (para un primer intento ;-)). Pero no veo la relevancia del título, ¿tal vez puedas cambiarle el nombre Sort by custom alphabeto algo más creativo?
Trauma digital

@ Digital Trauma Sí, eso podría ser mejor. Traté de jugar un poco con las palabras. Apunté a una referencia a ascii y utf-8 y similares para preguntar cuál es. Pero ese falló. Lo cambiaré a su sugerencia, que fue mejor.
Mathetic

Respuestas:


2

CJam, 26 19 17 bytes

rr:A;',/{Af#}$',*

Pruébalo en línea.

Caso de prueba

$ cjam sort.cjam <<< 'home,oval,cat,egg,network,green bcdfghjklmnpqrstvwxzaeiouy'
cat,green,home,network,egg,oval

Cómo funciona

rr                    " Read two whitespace-separated tokens from STDIN. ";
  :A;                 " Save the second token (the alphabet) in A.       ";
     ',/              " Split the remaining token at commas.             ";
        {Af#}$        " Sort by the chunks' characters' indexes in A.    ";
               ',*    " Join, separating by commas.                      ";

Bueno, ya que también usaste el mismo enfoque, el mío realmente no tiene ningún sentido ahora.
Optimizador

@Optimizer: me ganaste ocho segundos. Si recuperas tu respuesta, revertiré la mía.
Dennis

No, creo que es un cambio trivial y muy obvio. Debería haber mirado tus actualizaciones antes de publicar mi respuesta en primer lugar :)
Optimizer

4

Bash + coreutils, 37 bytes

tr ,$2 \\na-z<<<$1|sort|tr \\na-z ,$2

Salida:

$ ./alphasort.sh home,oval,cat,egg,network,green bcdfghijklmnpqrstvwxyzaeiouy
cat,green,home,network,egg,oval, $ 

1
¡Buena manera de lidiar con las comas!
Dennis

2

Pyth , 19 caracteres

j\,o_mx_zdNchczd\,

Prueba:

$ pyth -c "j\,o_mx_zdNchczd\," <<< 'home,oval,cat,egg,network,green bcdfghjklmnpqrstvwxzaeiouy'
cat,green,home,network,egg,oval

Explicación:

                            Implicit: d=" "
                            Implicit: z=input()
j\,                         ",".join(
   o                                 order_by(lambda N:
    _                                                  rev(
     m                                                     map(lambda d:
      x_zd                                                              rev(z).index(d),
      N                                                                 N),
    chczd\,                                            z.split(" "[0].split(",")

Básicamente, ordena los fragmentos, con una clave de la lista de índices de los caracteres en la cadena, luego los une en comas. El negocio de reversión es más corto que dividir la cadena nuevamente.


18 bytes:j\,_omx_zdNchczd\,
Dennis

@Dennis muy inteligente, gracias.
isaacg

1

Ruby, 53 50 bytes

a,b=$*
$><<a.split(?,).sort_by{|w|w.tr b,'a-z'}*?,

Estoy usando Ruby trpara reemplazar el alfabeto personalizado con a-zantes de ordenar. La entrada es a través del argumento de la línea de comandos.


Puede eliminar un byte si usa $><<para imprimir en la pantalla (puede eliminar el espacio entonces). Puede eliminar otros dos bytes asignándolos $*a variables como esta: a,b=$*y usando en #sort_bylugar de #sort_by!.
britishtea

@britishtea Gracias. Pensé que necesitaría *$*(que tenía al principio y que tiene la misma longitud).
Martin Ender

0

Python, 131

w,a=input().split()
print(",".join(sorted(w.split(","),key=lambda s:"".join(["abcdefghijklmnopqrstuvwxyz"[a.find(c)]for c in s]))))

Debe haber mucho espacio para mejorar.


No tiene que usar una tecla como función de clasificación, solo use la lista a.find(c)directamente.
isaacg

0

JavaScript (E6) 102 119

Ordenar con una función de mapeo 'M' basada en el alfabeto en la variable 'a'
Con IO usando popup (prompt + alert)

x=prompt().split(/[ ,]/),
a=x.pop(),
M=w=>[10+a.search(c)for(c of w)]+'',
alert(x.sort((a,b)=>M(a)>M(b)))

Como una función (comprobable) con 1 parámetro de cadena, que devuelve una matriz de cadena (92)

F=x=>(
  M=w=>[10+a.search(c)for(c of w)],
  x=x.split(/[ ,]/),
  a=x.pop(),
  x.sort((a,b)=>M(a)>M(b))
)

Prueba en la consola FireFox / FireBug

F('home,oval,cat,egg,network,green zyxwvtsrqpnmlkjhgfdcbaeiou')

Salida

["network", "home", "green", "cat", "egg", "oval"]

1
-4 si reemplaza su función de clasificación con(M(a)>M(b))-(M(a)<M(b))
DocMax

@DocMax muy agradable. Resulta que es aún más simple que eso ( stackoverflow.com/a/7232172/3640407 )
edc65

Si reutiliza la solicitud de entrada y salida y alias, puede evitar la llamada dividida tomando las entradas por separado. Creo que eso debería salvar algunos caracteres.
Ingo Bürk

Además, solo estoy en mi teléfono en este momento, pero ¿por qué M es tan complejo? ¿No funcionaría usarlo M=w=>[...a].indexOf(w)? No puedo probarlo ahora, desafortunadamente.
Ingo Bürk

@ IngoBürk w es una palabra, no un personaje. M reemplaza cada carácter en w con su posición en a.
edc65

0

Clojure, 115 bytes

#(apply str(butlast(interleave(sort-by(fn[w](apply str(map(zipmap(sort %2)%2)w)))(re-seq #"[a-z]+"%))(repeat \,))))

Wow, esto comenzó bien, (sort-by(fn[w](mapv(zipmap(sort %2)%2)w)))pero luego me di cuenta de vecque no se ordena de la misma manera que las cadenas, e intercalar esas comas también requiere una cantidad significativa de código.

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.