Sortuj według niestandardowego alfabetu

9

Wyzwanie polega na stworzeniu programu, który sortuje listę słów, tyle że słowa muszą być w kolejności losowego danego alfabetu.

Twój program zaakceptuje ciąg słów oddzielonych przecinkami i nowy alfabet.
Twój program wyświetli każde słowo w ten sam sposób w nowej posortowanej kolejności.

Przykład:

Wejście:

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

Wynik:

cat,green,home,network,egg,oval

To jest , więc zwycięzcą jest osoba z najkrótszym programem.

To jest moje pierwsze wyzwanie, dlatego doceniam wszelkie ulepszenia pytania / wyzwania.

Matowy
źródło
1. Biorę z twojego przykładu, że alfabet zostanie oddzielony od słów spacją. Czy to jest poprawne? 2. Czy słowa zawsze będą pisane małymi literami?
Dennis
@Dennis tak dla obu
Mathetic
1
To jest błąd. Zmienię to.
Mathetic
+1 pytanie OK (za pierwszym razem ;-)). Ale nie widzę znaczenia tytułu - być może możesz zmienić jego nazwę na Sort by custom alphabetcoś bardziej kreatywnego?
Digital Trauma
@DigitalTrauma Tak, może być lepiej. Próbowałem trochę pograć ze słowami. Chciałem odnieść się do ascii i utf-8 i tym podobnych, aby zapytać, co to jest. Ale ten zawiódł. Zmienię to na twoją sugestię, która była lepsza.
Mathetic

Odpowiedzi:

2

CJam, 26 19 17 bajtów

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

Wypróbuj online.

Przypadek testowy

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

Jak to działa

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
źródło
Cóż, skoro również zastosowałeś to samo podejście, moje nie ma teraz żadnego sensu.
Optymalizator
@Optimizer: Pobiłeś mnie o osiem sekund. Jeśli cofniesz usunięcie swojej odpowiedzi, cofnę moją.
Dennis
Nie, myślę, że to trywialna i bardzo obv zmiana. Przede wszystkim powinienem był zapoznać się z waszymi aktualizacjami :)
Optymalizator
4

Bash + coreutils, 37 bajtów

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

Wynik:

$ ./alphasort.sh home,oval,cat,egg,network,green bcdfghijklmnpqrstvwxyzaeiouy
cat,green,home,network,egg,oval, $ 
Cyfrowa trauma
źródło
1
Fajny sposób radzenia sobie z przecinkami!
Dennis
2

Pyth , 19 znaków

j\,o_mx_zdNchczd\,

Test:

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

Wyjaśnienie:

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

Zasadniczo sortuje fragmenty za pomocą klucza listy indeksów znaków w ciągu, a następnie łączy je przecinkami. Transakcje odwracania są krótsze niż ponowne dzielenie łańcucha.

isaacg
źródło
18 bajtów:j\,_omx_zdNchczd\,
Dennis
@Dennis bardzo sprytny, dziękuję.
isaacg
1

Rubin, 53 50 bajtów

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

Używam Ruby trdo zastąpienia niestandardowego alfabetu a-zprzed sortowaniem. Dane wprowadzane są za pomocą argumentu wiersza poleceń.

Martin Ender
źródło
Możesz zgolić bajt, jeśli używasz $><<do drukowania na ekranie (możesz wtedy usunąć spację). Możesz ogolić kolejne dwa bajty, przypisując $*zmienne takie: a,b=$*i używając #sort_byzamiast #sort_by!.
britishtea
@britishtea Thanks. Myślałem, że będę potrzebował *$*(który miałem na początku i który ma taką samą długość).
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]))))

Powinno być dużo miejsca na ulepszenia.

monopole
źródło
Nie musisz używać klucza jako funkcji sortowania - wystarczy użyć listy a.find(c)bezpośrednio.
isaacg
0

JavaScript (E6) 102 119

Sortuj za pomocą funkcji mapowania „M” na podstawie alfabetu w zmiennej „a”
Z IO za pomocą wyskakującego okienka (monit + 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)))

Jako funkcja (testowalna) z 1 parametrem łańcucha, zwracająca tablicę łańcucha (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))
)

Testuj w konsoli FireFox / FireBug

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

Wynik

["network", "home", "green", "cat", "egg", "oval"]
edc65
źródło
1
-4, jeśli zamienisz swoją funkcję sortowania na(M(a)>M(b))-(M(a)<M(b))
DocMax
@DocMax bardzo miło. Okazuje się, że jest to jeszcze prostsze ( stackoverflow.com/a/7232172/3640407 )
edc65
Jeśli ponownie użyjesz monitu o dane wejściowe i wyjściowe oraz alias, możesz uniknąć rozdzielonego połączenia, biorąc osobno dane wejściowe. Myślę, że to powinno uratować kilka postaci.
Ingo Bürk
Jestem teraz tylko na telefonie, ale dlaczego M jest tak skomplikowany? Czy nie zadziałałoby użycie M=w=>[...a].indexOf(w)? Niestety nie mogę teraz tego przetestować.
Ingo Bürk
@ IngoBürk w to słowo, a nie postać. M zamień każdy znak w na jego pozycję w a.
edc65
0

Clojure, 115 bajtów

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

Wow, zaczęło się to dobrze, (sort-by(fn[w](mapv(zipmap(sort %2)%2)w)))ale potem zdałem sobie sprawę, vecże nie sortuję się w taki sam sposób jak ciągi, a przeplatanie tych przecinków wymaga również znacznej ilości kodu.

NikoNyrh
źródło