Classificar por alfabeto personalizado

9

O desafio é criar um programa que classifique uma lista de palavras, apenas que as palavras precisem estar na ordem de um determinado alfabeto aleatório.

Seu programa aceitará uma sequência de palavras separadas por vírgula e um novo alfabeto.
Seu programa produzirá cada palavra da mesma maneira na nova ordem classificada.

Exemplo:

Entrada:

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

Resultado:

cat,green,home,network,egg,oval

Este é um , então o vencedor é a pessoa com o programa mais curto.

Este é o meu primeiro desafio, portanto, qualquer melhoria na pergunta / desafio é apreciada.

Mathetic
fonte
1. Tomo como exemplo que o alfabeto será separado das palavras por um espaço. Isso está correto? 2. As palavras sempre estarão em minúsculas?
Dennis
@ Dennis sim a ambas
Mathetic
11
Isso é um erro. Eu vou editar isso.
Mathetic
+1 pergunta OK (para uma primeira tentativa ;-)). Mas não estou vendo a relevância do título - talvez você possa renomeá-lo para Sort by custom alphabetalgo mais criativo?
Digital Trauma
@DigitalTrauma Sim, isso pode ser melhor. Eu tentei brincar um pouco com as palavras. Eu apontei para uma referência a ascii e utf-8 e similares para perguntar qual é. Mas esse falhou. Vou mudar para a sua sugestão, que foi melhor.
Mathetic

Respostas:

2

CJam, 26 19 17 bytes

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

Experimente online.

Caso de teste

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

Como 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.                      ";
Dennis
fonte
Bem, como você também usou a mesma abordagem, a minha não faz muito sentido agora.
Optimizer
@ Otimizador: Você me venceu por oito segundos. Se você cancelar sua resposta, eu reverto a minha.
Dennis
Não, acho que é uma mudança trivial e muito óbvia. Eu deveria ter olhado suas atualizações antes de postar minha resposta em primeiro lugar :)
Optimizer
4

Bash + coreutils, 37 bytes

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

Resultado:

$ ./alphasort.sh home,oval,cat,egg,network,green bcdfghijklmnpqrstvwxyzaeiouy
cat,green,home,network,egg,oval, $ 
Trauma Digital
fonte
11
Ótima maneira de lidar com as vírgulas!
Dennis
2

Pitão , 19 caracteres

j\,o_mx_zdNchczd\,

Teste:

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

Explicação:

                            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(",")

Essencialmente, ele classifica os pedaços, com uma chave da lista de índices dos caracteres na sequência, e os une por vírgulas. Os negócios de reversão são mais curtos do que dividir a corda novamente.

isaacg
fonte
18 bytes:j\,_omx_zdNchczd\,
Dennis
@ Dennis muito inteligente, obrigado.
Isaacg #
1

Ruby, 53 50 bytes

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

Estou usando o Ruby trpara substituir o alfabeto personalizado a-zantes de classificar. A entrada é via argumento da linha de comando.

Martin Ender
fonte
Você pode cortar um byte se usar $><<para imprimir na tela (poderá remover o espaço). Você pode cortar outros dois bytes atribuindo $*variáveis ​​assim: a,b=$*e usando em #sort_byvez de #sort_by!.
britishtea
@britishtea Obrigado. Eu pensei que precisaria *$*(o que eu tinha no começo e que tem o mesmo comprimento).
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]))))

Deve haver muito espaço para melhorias.

monopolo
fonte
Você não precisa usar uma tecla como função de classificação - basta usar a lista de a.find(c)diretamente.
Isaacg #
0

JavaScript (E6) 102 119

Classifique com uma função de mapeamento 'M' com base no alfabeto na variável 'a'
Com E / S usando pop-up (prompt + alerta)

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 uma função (testável) com 1 parâmetro de sequência, retornando uma matriz de sequências (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))
)

Teste no console do FireFox / FireBug

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

Resultado

["network", "home", "green", "cat", "egg", "oval"]
edc65
fonte
11
-4 se você substituir sua função de classificação por(M(a)>M(b))-(M(a)<M(b))
DocMax 05/10
@DocMax very nice. Acontece que é ainda mais simples do que isso ( stackoverflow.com/a/7232172/3640407 )
edc65
Se você reutilizar a solicitação de entrada e saída e o alias, poderá evitar a chamada dividida tomando as entradas separadamente. Eu acho que isso deve salvar alguns caracteres.
Ingo Bürk
Também estou apenas no meu telefone agora, mas por que o M é tão complexo? Não funcionaria para usar M=w=>[...a].indexOf(w)? Infelizmente não posso testá-lo agora.
Ingo Bürk
@ IngoBürk w é uma palavra, não um personagem. M substitua cada caractere em w pela sua posição em 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 \,))))

Uau, isso começou bem, (sort-by(fn[w](mapv(zipmap(sort %2)%2)w)))mas então percebi vecque não são classificados da mesma maneira que as strings, e intercalar essas vírgulas também requer uma quantidade significativa de código.

NikoNyrh
fonte