Сортировать по алфавиту


9

Задача состоит в том, чтобы составить программу, которая сортирует список слов, только для того, чтобы слова были в порядке случайного заданного алфавита.

Ваша программа примет строку слов, разделенных запятыми, и новый алфавит.
Ваша программа будет выводить каждое слово таким же образом в новом отсортированном порядке.

Пример:

Входные данные:

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

Вывод:

cat,green,home,network,egg,oval

Это Таким образом, победителем становится человек с самой короткой программой.

Это мой первый вызов, поэтому любые улучшения вопроса / задачи приветствуются.


1. Я беру из вашего примера, что алфавит будет отделяться от слов пробелом. Это верно? 2. Слова всегда будут в нижнем регистре?
Деннис

@ Денис да обоим
Матетик

1
Это ошибка Я отредактирую это.
Matetic

+1 ОК вопрос (для первой попытки ;-)). Но я не вижу актуальности названия - возможно, вы можете переименовать его Sort by custom alphabetили что-то более креативное?
Цифровая травма

@DigitalTrauma Да, это может быть лучше. Я попытался немного поиграть со словами. Я нацелился на ссылку на ascii и utf-8 и тому подобное, чтобы спросить, что это такое. Но это не удалось. Я изменю это на ваше предложение, которое было лучше.
Matetic

Ответы:


2

CJam, 26 19 17 байт

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

Попробуйте онлайн.

Прецедент

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

Как это работает

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.                      ";

Ну, так как вы также использовали тот же подход, мой сейчас не имеет никакого смысла.
Оптимизатор

@ Оптимизатор: Вы избили меня на восемь секунд. Если вы отмените ответ, я верну ответ.
Деннис

Нет, я думаю, что это тривиальное и очень переменное изменение. Я должен был посмотреть ваши обновления, прежде чем публиковать свой ответ в первую очередь :)
Оптимизатор

4

Bash + coreutils, 37 байт

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

Вывод:

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

1
Хороший способ работы с запятыми!
Деннис

2

Pyth , 19 символов

j\,o_mx_zdNchczd\,

Тестовое задание:

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

Объяснение:

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

По сути, он сортирует порции с ключом списка индексов символов в строке, а затем соединяет их запятыми. Отмена бизнеса короче, чем разделение строки снова.


18 байтов:j\,_omx_zdNchczd\,
Деннис

@ Денис очень умный, спасибо.
Исаак

1

Рубин, 53 50 байт

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

Я использую Ruby trдля замены пользовательского алфавита a-zперед сортировкой. Ввод осуществляется через аргумент командной строки.


Вы можете сбрить байт, если будете использовать $><<для печати на экране (тогда вы можете удалить пробел). Вы можете сбрить еще два байта, присваивая $*переменные следующим образом: a,b=$*и используя #sort_byвместо #sort_by!.
Британцы

@britishtea Спасибо. Я думал, что мне нужно *$*(который у меня был сначала и который такой же длины).
Мартин Эндер

0

Python, 131

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

Там должно быть много места для улучшения.


Вам не нужно использовать ключ в качестве функции сортировки - просто используйте список a.find(c)напрямую.
Исаак

0

JavaScript (E6) 102 119

Сортировка с помощью функции отображения 'M' на основе алфавита в переменной 'a'
С помощью ввода-вывода с использованием всплывающего окна (приглашение + предупреждение)

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

Как (тестируемая) функция с 1 строковым параметром, возвращающая строковый массив (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))
)

Тест в консоли FireFox / FireBug

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

Вывод

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

1
-4 если вы замените функцию сортировки на(M(a)>M(b))-(M(a)<M(b))
DocMax

@DocMax очень хороший. Оказывается, это даже проще ( stackoverflow.com/a/7232172/3640407 )
edc65

Если вы повторно используете приглашение для ввода и вывода и его псевдоним, вы можете избежать разделения вызова, принимая входные данные отдельно. Я думаю, что следует сохранить несколько символов.
Инго Бюрк

Кроме того, я сейчас только на своем телефоне, но почему М такой сложный? Разве это не работает, чтобы использовать M=w=>[...a].indexOf(w)? Я не могу проверить это сейчас, к сожалению.
Инго Бюрк

@ IngoBürk w - это слово, а не символ. M заменяет каждый символ в w его положением в a.
edc65

0

Clojure, 115 байт

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

Ничего себе, это началось хорошо, (sort-by(fn[w](mapv(zipmap(sort %2)%2)w)))но потом я понял, vecчто не сортируются так же, как строки, и чередование этих запятых также требует значительного количества кода.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.