Сортировать строку по заданному порядку


23

Ваша задача состоит в сортировке строки, но вместо обычного алфавитного порядка (abc..xyz) вы будете сортировать строки по заданному алфавиту.

Вы должны написать программу или функцию , которая принимает два входа: алфавит A и строки S . Оба будут содержать только строчные английские буквы, и оба будут содержать хотя бы один символ.

Вы должны переместить буквы в S так, чтобы буква, которая появляется первой в A, появлялась первой, затем какая бы буква появлялась второй в A , и т. Д. В S могут быть некоторые буквы, которые не появляются в A , их следует оставить в конце и не перемещаться относительно друг друга.

Тестовые случаи:

A       S               Result
axd     haxuizzxaxduxha aaaxxxxdhuizzuh
a       xyz             xyz
abc     dcba            abcd
il      nmiuplliu       iillnmupu
asdf    qwerty          qwerty

Побеждает несколько байтов!


Можем ли мы напечатать / вернуть массив одиночных строк? Можем ли мы взять одну строку и один массив одиночных строк в качестве входных данных?
Деннис

@Dennis Да, оба - прекрасные представления строк.
Павел

Можем ли мы принять один или оба входа в виде массива отдельных символов?
лохматый

@ Shaggy Строка - это массив символов, так что да.
Павел

Ответы:


5

05AB1E , 4 байта

Rvy†

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

объяснение

R     # Reverse the alphabet
 vy   # For each letter ...
   †  # Push S with the current letter filtered to the front


Слишком плохо R€†работать, как ожидалось, хотя :). Иногда это может работать как меньший vyцикл. Хороший ответ мужчина.
Волшебная Урна Осьминога

10

Python 3 , 50 47 46 44 байта

-3 байта благодаря ngn!

-1 байт благодаря mypetlion

lambda a,s:s.sort(key=lambda c:a.find(c)%27)

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

Принимает строку как алфавит и список символов как строку и сортирует список по месту.

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


2
-a[::-1].find(c)->(a+c).find(c)
НГН,

1
(a+c).find(c)-> a.find(c)%27сохранить 1 байт
mypetlion

7

Haskell, 42 байта

a#s=[c|c<-a,d<-s,c==d]++[c|c<-s,all(/=c)a]

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

a#s=                     -- take alphabet a and string s
        c<-a             -- for all c in a
             d<-s        --   for all d in s
    [c|       c==d]             keep c if c equals d
   ++                    -- append
    [c|c<-s        ]     --   all c of s
         ,all(/=c)a      --   that are not in a 

7

Perl 6 ,  55  43 байта

->\A,\S{[~] S.comb.sort:{%(A.comb.antipairs){$_}//∞}}

Попытайся

->\A,\S{[~] S.comb.sort:{A.index($_)//∞}}

Попытайся

Expanded:

-> \A, \S {
  [~]  # reduce using &infix:«~» (shorter than `.join`)

    S.comb.sort: # split into character list and sort by:

      {  # bare block lambda with implicit parameter $_

        A.index( $_ ) # get the position

        //  # if it is undefined (not in `A`)
           # return Inf instead (so it comes at end of result)
      }
}

Поскольку на входе будет только до 26 различных символов, а ∞ составляет 3 байта, вы можете заменить его на 27, и он все равно будет работать и сохранять байт.
Павел

6

Haskell , 40 34 байта

-6 байт огромное спасибо Лайкони .

foldr(\c->r(==c)<>r(/=c))
r=filter

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

Первая строка является выражением , которое принимает два аргумента: S и A .


1
Ницца! Вы даже можете удалить, f=потому что анонимные функции разрешены.
Лайкони

1
Кроме того (<>), теперь в Prelude, так что это может быть сокращено до foldr(\c->r(==c)<>r(/=c))34 байтов: попробуйте онлайн!
Лайкони


5

Python 2 , 38 байт

def f(a,s):s.sort(None,a[::-1].find,1)

a должен быть строкой, s список строк длиной 1. f сортирует s на месте.

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

Альтернативная версия, строковый ввод / вывод, 48 байтов

lambda a,s:`sorted(s,None,a[::-1].find,1)`[2::5]

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

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

s.sort(None,a[::-1],1)это сокращение для s.sort(cmp=None,key=a[::-1],reverse=1).

Из документов :

обратное - это логическое значение. Если установлено значение True, то элементы списка сортируются так, как если бы каждое сравнение было обратным.


Сортировка TIL может принимать 4 аргумента.
Павел

Только в Python 2. Python 3 Устаревшие cmpи сделал keyи reverseключевые слова , только аргументы, так что его list.sortпринимает только один позиционный аргумент.
Деннис

4

J , 5 байт

]/:i.

Диадический глагол, с алфавитом слева и строкой для сортировки справа.

i. находит значения символов строки в алфавите, длину алфавита, если не найден.

   'axd' i. 'haxuizzxaxduxha'
3 0 1 3 3 3 3 1 0 1 2 3 1 3 0

/: сортирует свой левый набор в порядке, указанном в правом.

] правый аргумент (строка)

  'haxuizzxaxduxha' /: 3 0 1 3 3 3 3 1 0 1 2 3 1 3 0
aaaxxxxdhuizzuh

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


4

Python 2 , 35 50 байт

lambda a,s:sorted(s,key=lambda c:-a[::-1].find(c))

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

принимает a и sкак строки; возвращает список строк Singelton.

Примечание: Ой! Получил 15 байтов, чтобы исправить ...


Ха! На самом деле это точно так же, как мой оригинальный код для моего ответа . Великие умы думают одинаково
Джо Кинг,

1
@ Джо Кинг: Хватит контролировать мои мысли! :)
Час Браун

4

К (нгн / к) , 9 байт

{y@>-x?y}

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

{... }это функция с аргументами xиy

x?yнаходит для каждого элемента в yиндексе его первое вхождение в x; если элемент не найден в x, его индекс считается 0N(-2 63 )

-отменяет все индексы, за исключением того, что сохраняет 0N-s нетронутыми, потому что 2 63 ≡-2 63 (мод 2 64 )

> возвращает сортировку по убыванию

y@индексы yс этим


3

Древесный уголь , 13 байт

Fθ×ι№ηιΦη¬№θι

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

 θ              First input
F               Loop over characters
     η          Second input
      ι         Current character
    №           Count matches
   ι            Current character
  ×             Repeat
                Implicitly print
        η       Second input
       Φ        Filter
           θ    First input
            ι   Current character
          №     Count matches
         ¬      Logical not
                Implicitly print non-matching characters

3

Желе , 4 байта

fⱮ;ḟ

Диадическая ссылка принимает строку слева и алфавит справа (в виде списков символов) и возвращает результат (также в виде списка символов).

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

Как?

fⱮ;ḟ - Link: string; alphabet                                    e.g. smallnotxl; xl
 Ɱ   - map (for each character in the alphabet):                      1=x; 2=l
f    -   filter keep (keep occurrences of this character from string)   x    lll -> xlll
   ḟ - filter discard (discard all alphabet characters from string)   smanot
  ;  - concatenate                                                    xlllsmanot

3

APL (Dyalog Unicode) , 5 байтов SBCS

Функция анонимного молчаливого префикса, принимающая в [string,ordering]качестве аргумента.

⍋⍨/⌷⊃

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

/ Уменьшить с помощью следующей функции:

  ...  именно версия с обратными аргументами следующей функции:

   оцените правую строку в соответствии с левым порядком (пропущенные буквы идут в конце)

 использовать это для индексации в ...

 первый элемент аргумента (то есть строка)


3

JavaScript (SpiderMonkey), 50 байт

Вводится в синтаксисе карри (a)(s), где a - строка, а s - массив символов. Возвращает массив символов.

a=>s=>s.sort((b,c)=>(g=c=>-1/a.search(c))(b)-g(c))

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

Как?

Мы определяем вспомогательную функцию g () как:

c => -1 / a.search(c)

который возвращает:

  • 1, если с не принадлежит алфавиту
  • значение с плавающей запятой в [-Inf, 0) в зависимости от положения буквы c в алфавите (-Inf, -1, -1/2, -1/3 и т. д.)

Мы сортируем s [] , вычисляя g (b) - g (c) для каждой пары символов (b, c), переданных обратному вызову sort () .

Поскольку реализация sort () в SpiderMonkey стабильна, все символы s [], которые не принадлежат алфавиту, просто перемещаются в конце в порядке появления и не изменяются при сравнении друг с другом.


JavaScript (ES6), 61 байт

Принимает ввод в синтаксисе карри (a)(s), где и a, и s являются массивами символов. Возвращает строку.

a=>s=>a.map(C=>s=s.filter(c=>c!=C||!(o+=c)),o='')&&o+s.join``

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


3

R , 69 62 58 байт

function(a,s)c(rep(a,rowSums(outer(a,s,"=="))),s[!s%in%a])

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

Вход и выход - векторы отдельных символов.

Объяснение:

function(a,s)c(                              ,           ) #combine:
                   a,                                      #[each char in a
               rep(                                        #each repeated
                     rowSums(               )              #the number of
                             outer(a,s,"==")               #occurrence in s]
                                              s            #with s
                                               [ s%in%a]   #all chars in a
                                                !          #omitted

3

Brain-Flak (Брейнхак) , 118 байт

{({}(<>))<>}{}<>{<>([[]()]<{<>(({})<({}<>[({}<>)]){(<()>)}{}{}>)<>}<>({}<{({}<>)<>}<>>)>[]){({}()<(({}))>)}{}{}<>{}}<>

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

Ввод - первая строка, за которой следует ноль, а затем вторая строка. Версия, которая использует перевод строки в качестве разделителя, добавляет 24 байта:

Brain-Flak , 142 байта

(()){{}(({}(<>))[(()()()()()){}]<>)}{}<>{<>([[]()]<{<>(({})<({}<>[({}<>)]){(<()>)}{}{}>)<>}<>({}<{({}<>)<>}<>>)>[]){({}()<(({}))>)}{}{}<>{}}<>

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

объяснение

# Move A to other stack reversed
# Zeroes are pushed under each character for later.
# (This is the only part that needs to change in order to use newline as separator.)
{({}(<>))<>}{}<>

# For each character in A, starting at the end:
{

  # Track current length of S.
  <>([[]()]<

    # For each character in S:
    {

      # While keeping character from A
      <>(({})<

        # Move character from S to second stack and push difference
        ({}<>[({}<>)])

        # Delete character if equal
        {(<()>)}{}{}

      >)

    <>}

    # Move S back to first stack while maintaining character from A
    <>({}<{({}<>)<>}<>>)

  # Push difference between old and new lengths of S
  >[])

  # Insert character from A at beginning of S that many times
  {({}()<(({}))>)}{}{}

<>{}}<>

2

C (gcc) , 97 байт

f(D,d,S,s,i,o)char*D,*S;{
  while(d--){
    for(i=o=s;i--;)S[i]-D[d]?S[--o]=S[i]:0;
    while(o--)S[o]=D[d];
  }
}

Все пробелы (пробелы и новые строки) в приведенном выше коде предназначены только для удобства чтения и должны быть удалены.

Словарь передается Dи имеет длину d, строка передается Sи имеет длину s. iи oдолжен быть опущен.

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



2

Java 8, 98 байт

a->s->{for(int i=a.length;i-->0;s=s.replaceAll("[^"+a[i]+"]","")+s.replaceAll(a[i],""));return s;}

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

Объяснение:

a->s->{       // Method with String-array and String parameters, and String return-type
  for(int i=a.length;i-->0;
              //  Loop backwards over the alphabet
    s=        //   Replace the current `s` with:
      s.replaceAll("[^"+a[i]+"]","") 
              //    All the current characters of `a` in `s`
      +s.replaceAll(a[i],""));
              //    Concatted with everything else
  return s;}  //  Return the modified `s`

Не может быть ниже, даже с новым String.repeat(int)методом Java 11 . Ницца! :)
Оливье Грегуар

@ OlivierGrégoire О, я не знал, что ранний доступ к Java 11 уже был доступен. Это .repeat(n)выглядит многообещающе, хотя. : D
Кевин Круйссен

2

Perl 5 с -pF, 43 байта

$_=<>;print$F[0]x s/@{[shift@F]}//g while@F

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


Разве нет флага, который дает вам $_=<>;бесплатно?
Павел

@Pavel да, извините, я использую его для заполнения @F, но я не добавил его в шапку! Я сделаю это сейчас! Спасибо!
Дом Гастингс

Вы можете сократить это на 10 байт и при этом использовать ту же логику: попробуйте онлайн!
Xcali





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