Nach benutzerdefiniertem Alphabet sortieren

9

Die Herausforderung besteht darin, ein Programm zu erstellen, das eine Liste von Wörtern sortiert, nur dass die Wörter in der Reihenfolge eines zufällig gegebenen Alphabets sein müssen.

Ihr Programm akzeptiert eine durch Kommas getrennte Zeichenfolge und ein neues Alphabet.
Ihr Programm gibt jedes Wort auf die gleiche Weise in der neuen sortierten Reihenfolge aus.

Beispiel:

Eingang:

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

Ausgabe:

cat,green,home,network,egg,oval

Dies ist ein , der Gewinner ist also die Person mit dem kürzesten Programm.

Dies ist meine erste Herausforderung, daher sind Verbesserungen der Frage / Herausforderung willkommen.

Mathematik
quelle
1. Ich nehme aus Ihrem Beispiel, dass das Alphabet durch ein Leerzeichen von den Wörtern getrennt wird. Ist das korrekt? 2. Werden die Wörter immer in Kleinbuchstaben geschrieben?
Dennis
@ Tennis ja zu beiden
Mathetic
1
Das ist ein Fehler. Ich werde das bearbeiten.
Mathetic
+1 OK Frage (für einen ersten Versuch ;-)). Aber ich sehe die Relevanz des Titels nicht - vielleicht können Sie ihn umbenennen Sort by custom alphabetoder etwas kreativeres?
Digitales Trauma
@ DigitalTrauma Ja, das könnte besser sein. Ich habe versucht, ein wenig mit den Worten zu spielen. Ich wollte einen Verweis auf ASCII und UtF-8 und dergleichen, um zu fragen, was es ist. Aber dieser ist gescheitert. Ich werde es auf Ihren Vorschlag ändern, der besser war.
Mathetic

Antworten:

2

CJam, 26 19 17 Bytes

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

Probieren Sie es online aus.

Testfall

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

Wie es funktioniert

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
quelle
Nun, da du auch den gleichen Ansatz gewählt hast, macht meiner jetzt keinen Sinn.
Optimierer
@ Optimizer: Du hast mich um acht Sekunden geschlagen. Wenn Sie Ihre Antwort nicht wiederherstellen, rolle ich meine zurück.
Dennis
Nein, ich denke, es ist eine triviale und sehr offensichtliche Änderung. Ich hätte mir deine Updates ansehen sollen, bevor ich meine Antwort veröffentlicht habe :)
Optimizer
4

Bash + Coreutils, 37 Bytes

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

Ausgabe:

$ ./alphasort.sh home,oval,cat,egg,network,green bcdfghijklmnpqrstvwxyzaeiouy
cat,green,home,network,egg,oval, $ 
Digitales Trauma
quelle
1
Gute Art, mit Kommas umzugehen!
Dennis
2

Pyth , 19 Zeichen

j\,o_mx_zdNchczd\,

Prüfung:

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

Erläuterung:

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

Im Wesentlichen werden die Chunks mit einem Schlüssel aus der Liste der Indizes der Zeichen in der Zeichenfolge sortiert und dann durch Kommas verbunden. Das Umkehrgeschäft ist kürzer als das erneute Teilen der Zeichenfolge.

isaacg
quelle
18 Bytes:j\,_omx_zdNchczd\,
Dennis
@ Tennis sehr klug, danke.
isaacg
1

Ruby, 53 50 Bytes

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

Ich verwende Ruby's tr, um das benutzerdefinierte Alphabet a-zvor dem Sortieren durch zu ersetzen . Die Eingabe erfolgt über ein Befehlszeilenargument.

Martin Ender
quelle
Sie können ein Byte rasieren, wenn Sie $><<zum Drucken auf dem Bildschirm verwenden (Sie können dann das Leerzeichen entfernen). Sie können weitere zwei Bytes sparen $*, indem Sie Variablen wie folgt zuweisen : a,b=$*und #sort_byanstelle von verwenden #sort_by!.
Britishtea
@ Britishtea Danke. Ich dachte, ich würde brauchen *$*(was ich zuerst hatte und was die gleiche Länge hat).
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]))))

Es sollte viel Raum für Verbesserungen geben.

Monopol
quelle
Sie müssen keinen Schlüssel als Sortierfunktion verwenden - verwenden Sie einfach die Liste von a.find(c)direkt.
isaacg
0

JavaScript (E6) 102 119

Sortieren Sie mit einer Zuordnungsfunktion 'M' basierend auf dem Alphabet in der Variablen 'a'.
Mit E / A über Popup (Eingabeaufforderung + Warnung)

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

Als (testbare) Funktion mit 1 String-Parameter wird ein String-Array (92) zurückgegeben.

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 In FireFox / Firebug - Konsole

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

Ausgabe

["network", "home", "green", "cat", "egg", "oval"]
edc65
quelle
1
-4 wenn Sie Ihre (M(a)>M(b))-(M(a)<M(b))
Sortierfunktion
@ DocMax sehr schön. Es stellt sich heraus, dass es noch einfacher ist ( stackoverflow.com/a/7232172/3640407 )
edc65
Wenn Sie die Eingabeaufforderung für Eingabe und Ausgabe und den Alias ​​wiederverwenden, können Sie den geteilten Aufruf vermeiden, indem Sie die Eingaben separat verwenden. Ich denke, das sollte ein paar Zeichen sparen.
Ingo Bürk
Außerdem bin ich gerade nur auf meinem Handy, aber warum ist M so komplex? Würde es nicht funktionieren M=w=>[...a].indexOf(w)? Ich kann es momentan leider nicht testen.
Ingo Bürk
@ IngoBürk w ist ein Wort, kein Zeichen. M Ersetzen Sie jedes Zeichen in w durch seine Position in 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, das hat gut angefangen, (sort-by(fn[w](mapv(zipmap(sort %2)%2)w)))aber dann wurde mir klar, dass veces nicht wie Strings sortiert wird, und das Verschachteln dieser Kommas erfordert auch eine erhebliche Menge an Code.

NikoNyrh
quelle