Сортувати за спеціальним алфавітом


9

Завдання полягає в тому, щоб скласти програму, яка сортує список слів, лише щоб слова були у порядку випадкового заданого алфавіту.

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

Приклад:

Вхід:

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

Вихід:

cat,green,home,network,egg,oval

Це , тому переможець - людина з найкоротшою програмою.

Це мій перший виклик, тому будь-які вдосконалення питання / виклику оцінюються.


1. Я беру з вашого прикладу, що алфавіт буде відокремлений від слів пробілом. Це правильно? 2. Чи завжди слова будуть мати малі літери?
Денніс

@Dennis так для обох
Mathetic

1
Це помилка. Я це відредагую.
Математичний

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

@DigitalTrauma Так, це може бути краще. Я спробував трохи пограти зі словами. Я мав на меті посилання на ascii та utf-8 тощо, щоб запитати, що це таке. Але це не вдалося. Я зміню його на вашу пропозицію, яка була кращою.
Математичний

Відповіді:


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

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

@Optimizer: Ти побив мене на вісім секунд. Якщо ви скасуєте свою відповідь, я відкату.
Денніс

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

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

Піта , 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\,
Денніс

@Денніс дуже розумний, дякую.
isaacg

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

@britishtea Дякую Я думав, що мені знадобиться *$*(що я мав спочатку і який однакової довжини).
Мартін Ендер

0

Пітона, 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)безпосередньо.
isaacg

0

JavaScript (E6) 102 119

Сортувати за допомогою функції відображення "M" на основі алфавіту в змінній "a"
З IO за допомогою спливаючого вікна (підказка + попередження)

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 настільки складний? Не вдалося б це використати 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.