Sortuj ciąg według podanego porządku

23

Twoim zadaniem jest posortowanie łańcucha, ale zamiast normalnej kolejności alfabetycznej (abc..xyz), sortujesz łańcuchy według określonego alfabetu.

Musisz napisać program lub funkcję, która pobiera dwa wejścia: alfabet A oraz ciąg S . Oba będą zawierać tylko małe litery angielskie i oba będą zawierać co najmniej jeden znak.

Musisz przesunąć litery w S, aby pierwsza litera pojawiła się pierwsza w A , a następnie dowolna litera pojawiła się druga w A itd. Mogą występować pewne litery w S , które nie pojawiają się w A , należy je pozostawić na końcu i nie poruszały się względem siebie.

Przypadki testowe:

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

Wygrywa najmniej bajtów!

Pavel
źródło
Czy możemy wydrukować / zwrócić tablicę ciągów singletonów? Czy możemy przyjąć jeden ciąg i jedną tablicę ciągów singletonów jako dane wejściowe?
Dennis
@Dennis Tak, oba są świetnymi reprezentacjami ciągów.
Pavel
Czy możemy wziąć jedno lub oba dane wejściowe jako tablicę pojedynczych znaków?
Kudłaty
@Shaggy Ciąg jest tablicą znaków, więc tak.
Pavel

Odpowiedzi:

5

05AB1E , 4 bajty

Rvy†

Wypróbuj online!

Wyjaśnienie

R     # Reverse the alphabet
 vy   # For each letter ...
   †  # Push S with the current letter filtered to the front
Kaldo
źródło
Mądrzejszy niż Σ²sk>.
Magic Octopus Urn
Szkoda, że R€†pracuję zgodnie z oczekiwaniami :). Czasami może to działać jako mniejsza vypętla. Niezła odpowiedź, stary.
Magic Octopus Urn
10

Python 3 , 50 47 46 44 bajtów

-3 bajty dzięki ngn!

-1 bajt dzięki mypetlion

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

Wypróbuj online!

Pobiera ciąg jako alfabet i listę znaków jako ciąg i sortuje listę na miejscu.

W %27gwarantuje, że jeśli postać nie jest w alfabecie, indeks powrócił stawia go po resztę alfabetu.

Jo King
źródło
2
-a[::-1].find(c)->(a+c).find(c)
ngn
1
(a+c).find(c)-> a.find(c)%27aby zaoszczędzić 1 bajt
mypetlion
7

Haskell, 42 bajty

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

Wypróbuj online!

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 
nimi
źródło
7

Perl 6 ,  55  43 bajtów

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

Spróbuj

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

Spróbuj

Rozszerzony:

-> \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)
      }
}
Brad Gilbert b2gills
źródło
Ponieważ na wejściu będzie tylko 26 różnych znaków, a ∞ to 3 bajty, możesz go zastąpić 27, a on nadal będzie działał i zapisze bajt.
Pavel
6

Haskell , 40 34 bajtów

-6 bajtów ogromne dzięki Laikoni .

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

Wypróbuj online!

Pierwsza linia jest wyrażeniem ma dwa argumenty: S i A .

użytkownik 28667
źródło
1
Miły! Możesz nawet upuścić, f=ponieważ anonimowe funkcje są dozwolone.
Laikoni
1
Ponadto (<>)jest teraz w Preludium, więc można go skrócić do foldr(\c->r(==c)<>r(/=c))34 bajtów: Wypróbuj online!
Laikoni
6

Stax , 6 bajtów

{xrINo

Uruchom i debuguj

Sortuje według bloku, który to robi.

  • Odwróć alfabet.
  • Pobierz indeks każdego znaku w odwróconym alfabecie. Brakujące zbiory -1.
  • Neguj indeks.
rekurencyjny
źródło
5

Python 2 , 38 bajtów

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

a musi być łańcuchem, s listą łańcuchów o długości 1. f sortuje s na miejscu.

Wypróbuj online!

Alternatywna wersja, string I / O, 48 bajtów

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

Wypróbuj online!

Jak to działa

s.sort(None,a[::-1],1)jest skrótem od s.sort(cmp=None,key=a[::-1],reverse=1).

Z dokumentów :

rewers jest wartością logiczną. Jeśli ustawione na True, elementy listy są sortowane tak, jakby każde porównanie zostało odwrócone.

Dennis
źródło
Sortowanie TIL może przyjmować 4 argumenty.
Pavel
Tylko w Pythonie 2. Python 3 nieaktualne cmpi wykonane keyi reversesłowa kluczowe tylko argumenty, więc jego list.sortzajmuje tylko jeden pozycyjnym argumentu.
Dennis
4

J , 5 bajtów

]/:i.

Czasownik dynastyczny, biorąc alfabet po lewej i ciąg znaków do sortowania po prawej.

i. znajduje indekty znaków ciągu w alfabecie, długość alfabetu, jeśli nie zostanie znaleziona.

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

/: sortuje lewy agrument zgodnie z kolejnością określoną w prawym.

] argument argumentu (ciąg)

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

Wypróbuj online!

Galen Iwanow
źródło
4

Python 2 , 35 50 bajtów

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

Wypróbuj online!

Bierze ai sjak struny; zwraca listę ciągów singeltonów.

Uwaga: Ojej! Zyskano 15 bajtów do naprawienia ...

Chas Brown
źródło
Ha! To jest właściwie dokładnie to samo, co mój oryginalny kod dla mojej odpowiedzi . Wielkie umysły myślą podobnie
Jo King
1
@Jo King: Przestań kontrolować moje myśli! :)
Chas Brown,
4

K (ngn / k) , 9 bajtów

{y@>-x?y}

Wypróbuj online!

{... }jest funkcją z argumentami xiy

x?yznajduje dla każdego elementu w yindeksie jego pierwszego wystąpienia w x; jeśli element nie zostanie znaleziony x, jego indeks jest brany pod uwagę 0N(-2 63 )

-neguje wszystkie indeksy oprócz tego, że zachowuje 0N-s nietknięte, ponieważ 2 63 ≡-2 63 (mod 2 64 )

> zwraca sortowanie malejące

y@indeksuje yz tym

ngn
źródło
3

Węgiel drzewny , 13 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

 θ              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
Neil
źródło
3

Galaretka , 4 bajty

fⱮ;ḟ

Dyadyczny link akceptujący ciąg po lewej stronie i alfabet po prawej stronie (jako listy znaków) i zwracający wynik (również jako listę znaków).

Wypróbuj online!

W jaki sposób?

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
Jonathan Allan
źródło
3

APL (Dyalog Unicode) , 5 bajtów SBCS

Anonimowa funkcja ukrytego przedrostka, przyjmująca [string,ordering]za argument.

⍋⍨/⌷⊃

Wypróbuj online!

/ Zmniejsz o następującą funkcję:

  … A  mianowicie wersja następującej funkcji z odwróconymi argumentami:

   ocenić prawą strunę zgodnie z lewą kolejnością (brakujące litery znajdują się na końcu)

 użyj tego, aby indeksować do…

 pierwszy element argumentu (tj. ciąg)

Adám
źródło
3

JavaScript (SpiderMonkey), 50 bajtów

Pobiera dane wejściowe w składni curry (a)(s), gdzie a jest łańcuchem, a s to tablica znaków. Zwraca tablicę znaków.

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

Wypróbuj online!

W jaki sposób?

Definiujemy funkcję pomocniczą g () jako:

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

który zwraca:

  • 1, jeżeli c nie należy do alfabetu
  • wartość zmiennoprzecinkowa w [-Inf, 0) w oparciu o pozycję c w alfabecie w przeciwnym razie (-Inf, -1, -1/2, -1/3 itd.)

Sortujemy s [] obliczając g (b) - g (c) dla każdej pary znaków (b, c) przekazanych do wywołania zwrotnego sort () .

Ponieważ implementacja sort () w SpiderMonkey jest stabilna, wszystkie znaki s [] , które nie należą do alfabetu, są po prostu przenoszone na końcu w kolejności pojawiania się i są pozostawione bez zmian, gdy są ze sobą porównywane.


JavaScript (ES6), 61 bajtów

Pobiera dane wejściowe w składni curry (a)(s), gdzie zarówno a i s są tablicami znaków. Zwraca ciąg.

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

Wypróbuj online!

Arnauld
źródło
3

R , 69 62 58 bajtów

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

Wypróbuj online!

Dane wejściowe i wyjściowe są wektorami poszczególnych znaków.

Wyjaśnienie:

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
JayCe
źródło
3

Brain-Flak (BrainHack) , 118 bajtów

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

Wypróbuj online!

Dane wejściowe to pierwszy ciąg, po nim null, a po nim drugi ciąg. Wersja, która używa separatora jako separatora, zamiast tego dodaje 24 bajty:

Brain-Flak , 142 bajty

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

Wypróbuj online!

Wyjaśnienie

# 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
  {({}()<(({}))>)}{}{}

<>{}}<>
Nitrodon
źródło
2

C (gcc) , 97 bajtów

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];
  }
}

Wszystkie białe znaki (spacje i znaki nowej linii) w powyższym kodzie służą wyłącznie do odczytu i powinny zostać usunięte.

Słownik jest przekazywany Di ma długość d, łańcuch jest przekazywany Si ma długość s. ii onależy je pominąć.

Wypróbuj online!

użytkownik202729
źródło
2

Pyth ,  9  5 bajtów

ox+vz

Wypróbuj tutaj!

ox + vz Pełny program. Format wejściowy: „S” \ n „A”.
o Sortuj znaki S według (zmienna: N) ...
 x ... indeks N w ...
  + vz ... A + N
Pan Xcoder
źródło
2

Java 8, 98 bajtów

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

Wypróbuj online.

Wyjaśnienie:

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`
Kevin Cruijssen
źródło
Nie można obniżyć, nawet przy nowej String.repeat(int)metodzie Java 11 . Miły! :)
Olivier Grégoire
@ OlivierGrégoire Och, nie wiedziałem, że wczesny dostęp do Java 11 był już dostępny. Że .repeat(n)wygląda obiecująco, choć. : D
Kevin Cruijssen
2

Perl 5 z -pF, 43 bajtów

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

Wypróbuj online!

Dom Hastings
źródło
Czy nie ma flagi, która daje ci $_=<>;za darmo?
Pavel
@Pavel tak, przepraszam, używam go do wypełnienia @F, ale nie dodałem go do nagłówka! Zrobię to teraz! Dziękuję Ci!
Dom Hastings
Możesz odciąć od tego 10 bajtów i nadal używać tej samej logiki: wypróbuj online!
Xcali,
2

Prolog (SWI) , 136 bajtów

X/_/[X|_].
X/Y/[Z|R]:-Y\=Z,X/Y/R.
i(_,X,[],[X]).
i(A,X,[Y|R],[X,Y|R]):-X/Y/A.
i(A,X,[Y|R],[Y|S]):-i(A,X,R,S).
A*S*T:-foldl(i(A),S,[],T).

Wypróbuj online! Przykładowe użycie:

[i,l]*[n,m,i,u,p,l,l,i,u]*S.
S = [i, i, l, l, n, m, u, p, u]
Laikoni
źródło
1

Czysty , 61 bajtów

import StdEnv
$a s=[c\\c<-a,k<-s|k==c]++[c\\c<-s|all((<>)c)a]

Wypróbuj online!

Definiuje funkcję $ :: [Char] [Char] -> [Char].

Nic dziwnego, że jest to dosłownie odpowiedź Haskella, ale dłuższa.

Obrzydliwe
źródło
1

PynTree , 13 bajtów

§yz:ṡzCæf+yxx

Wypróbuj online!

Odpowiedź Port Pythona na króla króla.

Wyjaśnienie

§yz:ṡzCæf+yxx  Anonymous lambda
§              lambda  ,
 y                    y
  z                     z
   :                     :
    ṡ                     sorted( ,lambda x:
     z                           z
      C                                     (          )( )
       æf                                    (   ).find
         +                                     +
          y                                   y
           x                                    x
            x                                            x
HyperNeutrino
źródło