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!


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

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.


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 

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

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

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.

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.


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!


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


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


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

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

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)


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!


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

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

<>{}}<>

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!


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

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`

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

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]




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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.