Trier par alphabet personnalisé

9

Le défi est de créer un programme qui trie une liste de mots, mais seulement que les mots doivent être dans l'ordre d'un alphabet donné au hasard.

Votre programme acceptera une chaîne de mots séparés par des virgules et un nouvel alphabet.
Votre programme affichera chaque mot de la même manière dans le nouvel ordre trié.

Exemple:

Contribution:

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

Production:

cat,green,home,network,egg,oval

Il s'agit d'un , donc le gagnant est la personne avec le programme le plus court.

Ceci est mon premier défi, donc toute amélioration de la question / défi est appréciée.

Mathématique
la source
1. Je prends de votre exemple que l'alphabet sera séparé des mots par un espace. Est-ce exact? 2. Les mots seront-ils toujours en minuscules?
Dennis
@Dennis oui aux deux
Mathetic
1
C’est une erreur. Je vais éditer ça.
Math
+1 question OK (pour un premier essai ;-)). Mais je ne vois pas la pertinence du titre - peut-être pouvez-vous le renommer Sort by custom alphabetou quelque chose de plus créatif?
Digital Trauma
@DigitalTrauma Ouais, ça pourrait être mieux. J'ai essayé de jouer un peu avec les mots. Je visais une référence à ascii et utf-8 et autres pour demander de quoi il s'agit. Mais celui-là a échoué. Je vais le changer pour votre suggestion qui était meilleure.
Math

Réponses:

2

CJam, 26 19 17 octets

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

Essayez-le en ligne.

Cas de test

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

Comment ça fonctionne

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
la source
Eh bien, puisque vous avez également utilisé la même approche, la mienne n'a plus vraiment de sens maintenant.
Optimizer
@Optimizer: Vous m'avez battu de huit secondes. Si vous supprimez votre réponse, je vais annuler la mienne.
Dennis
Non, je pense que c'est un changement trivial et très évident. J'aurais dû regarder vos mises à jour avant de poster ma réponse en premier lieu :)
Optimizer
4

Bash + coreutils, 37 octets

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

Production:

$ ./alphasort.sh home,oval,cat,egg,network,green bcdfghijklmnpqrstvwxyzaeiouy
cat,green,home,network,egg,oval, $ 
Traumatisme numérique
la source
1
Belle façon de gérer les virgules!
Dennis
2

Pyth , 19 caractères

j\,o_mx_zdNchczd\,

Tester:

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

Explication:

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

Essentiellement, il trie les morceaux, avec une clé de la liste des index des caractères de la chaîne, puis les joint par des virgules. Les opérations de retournement sont plus courtes que de diviser à nouveau la chaîne.

isaacg
la source
18 octets:j\,_omx_zdNchczd\,
Dennis
@Dennis très intelligent, merci.
isaacg
1

Rubis, 53 50 octets

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

J'utilise Ruby trpour remplacer l'alphabet personnalisé a-zavant de trier. L'entrée se fait via un argument de ligne de commande.

Martin Ender
la source
Vous pouvez raser un octet si vous utilisez $><<pour imprimer à l'écran (vous pouvez alors supprimer l'espace). Vous pouvez raser deux octets supplémentaires en les affectant $*à des variables comme ceci: a,b=$*et en utilisant #sort_byau lieu de #sort_by!.
britishtea
@britishtea Merci. J'ai pensé que j'aurais besoin *$*(que j'avais au début et qui est de la même longueur).
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]))))

Il devrait y avoir beaucoup de place pour l'amélioration.

monopole
la source
Vous n'avez pas besoin d'utiliser une clé comme fonction de tri - utilisez simplement la liste de a.find(c)directement.
isaacg
0

JavaScript (E6) 102 119

Trier avec une fonction de cartographie 'M' basée sur l'alphabet dans la variable 'a'
Avec IO en utilisant popup (invite + alerte)

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)))

En tant que fonction (testable) avec 1 paramètre de chaîne, renvoyant un tableau de chaînes (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))
)

Test dans la console FireFox / FireBug

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

Production

["network", "home", "green", "cat", "egg", "oval"]
edc65
la source
1
-4 si vous remplacez votre fonction de tri par(M(a)>M(b))-(M(a)<M(b))
DocMax
@DocMax très agréable. Il s'avère que c'est encore plus simple que cela ( stackoverflow.com/a/7232172/3640407 )
edc65
Si vous réutilisez l'invite d'entrée et de sortie et l'alias, vous pouvez éviter l'appel fractionné en prenant les entrées séparément. Je pense que cela devrait sauver quelques caractères.
Ingo Bürk
De plus, je ne suis que sur mon téléphone en ce moment, mais pourquoi M est-il si complexe? Cela ne fonctionnerait-il pas M=w=>[...a].indexOf(w)? Je ne peux pas le tester pour l'instant, malheureusement.
Ingo Bürk
@ IngoBürk w est un mot, pas un caractère. M remplace chaque caractère en w par sa position en a.
edc65
0

Clojure, 115 octets

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

Wow, cela a bien commencé, (sort-by(fn[w](mapv(zipmap(sort %2)%2)w)))mais j'ai réalisé que je vecne suis pas trié de la même manière que les chaînes, et l'entrelacement de ces virgules nécessite également une quantité importante de code.

NikoNyrh
la source