Urutkan string dengan pemesanan yang diberikan

23

Tantangan Anda adalah untuk mengurutkan string, tetapi bukan dengan urutan alfabet normal (abc..xyz), Anda akan mengurutkan string berdasarkan alfabet yang ditentukan.

Anda harus menulis sebuah program atau fungsi yang mengambil dua input: Sebuah abjad A dan string S . Keduanya hanya akan berisi huruf Inggris kecil, dan keduanya akan mengandung setidaknya satu karakter.

Anda harus memindahkan huruf dalam S sehingga huruf yang muncul pertama kali dalam A muncul terlebih dahulu, lalu huruf mana saja yang muncul kedua di A , dll. Mungkin ada beberapa huruf di S yang tidak muncul dalam A , ini harus dibiarkan di akhir dan tidak bergerak relatif satu sama lain.

Kasus uji:

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

Bytes paling sedikit menang!

Pavel
sumber
Bisakah kita mencetak / mengembalikan serangkaian string tunggal? Bisakah kita mengambil satu string dan satu array string singleton sebagai input?
Dennis
@ Dennis Ya, keduanya adalah representasi string yang bagus.
Pavel
Bisakah kita mengambil salah satu atau kedua input sebagai array karakter individual?
Shaggy
@Shaggy String adalah array karakter, jadi ya.
Pavel

Jawaban:

5

05AB1E , 4 byte

Rvy†

Cobalah online!

Penjelasan

R     # Reverse the alphabet
 vy   # For each letter ...
   †  # Push S with the current letter filtered to the front
Kaldo
sumber
Lebih pintar dari Σ²sk>.
Magic Gurita Guci
Sayang sekali tentang R۠bekerja seperti yang diharapkan :). Terkadang itu bisa berfungsi sebagai vyloop yang lebih kecil . Pria jawaban yang bagus.
Magic Gurita Guci
10

Python 3 , 50 47 46 44 byte

-3 byte terima kasih kepada ngn!

-1 byte terima kasih kepada mypetlion

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

Cobalah online!

Mengambil string sebagai alfabet dan daftar karakter sebagai string dan mengurutkan daftar di tempat.

The %27memastikan bahwa jika karakter tidak dalam alfabet, indeks yang dikembalikan menempatkannya setelah alfabet.

Jo King
sumber
2
-a[::-1].find(c)->(a+c).find(c)
ngn
1
(a+c).find(c)-> a.find(c)%27untuk menyimpan 1 byte
mypetlion
7

Haskell, 42 byte

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

Cobalah 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
sumber
7

Perl 6 ,  55  43 byte

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

Cobalah

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

Cobalah

Diperluas:

-> \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
sumber
Karena hanya akan ada hingga 26 karakter berbeda dalam input, dan ∞ adalah 3 byte, Anda dapat menggantinya dengan 27 dan masih akan bekerja dan menyimpan satu byte.
Pavel
6

Haskell , 40 34 byte

-6 byte besar terima kasih kepada Laikoni .

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

Cobalah online!

Baris pertama adalah ekspresi yang membutuhkan dua argumen: S dan A .

pengguna28667
sumber
1
Bagus! Anda bahkan dapat turun f=karena fungsi anonim diizinkan.
Laikoni
1
Selanjutnya (<>)sekarang di Prelude, jadi ini bisa disingkat menjadi foldr(\c->r(==c)<>r(/=c))34 byte: Cobalah online!
Laikoni
6

Stax , 6 byte

{xrINo

Jalankan dan debug itu

Ini semacam blok yang melakukan ini.

  • Balikkan alfabet.
  • Dapatkan indeks setiap karakter dalam alfabet terbalik. Hilang hasil -1.
  • Meniadakan indeks.
rekursif
sumber
5

Python 2 , 38 byte

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

a harus berupa string, s daftar string panjang 1. f macam s di tempat.

Cobalah online!

Versi alternatif, string I / O, 48 byte

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

Cobalah online!

Bagaimana itu bekerja

s.sort(None,a[::-1],1) adalah singkatan s.sort(cmp=None,key=a[::-1],reverse=1) .

Dari dokumen :

sebaliknya adalah nilai boolean. Jika disetel ke True, maka elemen daftar diurutkan seolah-olah setiap perbandingan dibalik.

Dennis
sumber
TIL sort dapat mengambil 4 argumen.
Pavel
Hanya dengan Python 2. Python 3 tidak digunakan lagi cmpdan dibuat keyserta reverseargumen hanya kata kunci, sehingga list.sorthanya membutuhkan satu argumen posisi.
Dennis
4

J , 5 byte

]/:i.

Kata kerja Dyadic, mengambil alfabet di sebelah kiri dan string yang akan diurutkan di sebelah kanan.

i. menemukan indeces karakter string dalam alfabet, panjang alfabet jika tidak ditemukan.

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

/: macam agrument kirinya sesuai dengan urutan yang ditentukan di sebelah kanan.

] argumen rigth (string)

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

Cobalah online!

Galen Ivanov
sumber
4

Python 2 , 35 50 byte

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

Cobalah online!

Mengambil adan ssebagai string; mengembalikan daftar string singelton.

Catatan: Aduh! Memperoleh 15 byte untuk diperbaiki ...

Chas Brown
sumber
Ha! Ini sebenarnya persis sama dengan kode asli saya untuk jawaban saya . Pikiran besar berpikiran sama
Jo King
1
@ Jo King: Berhenti mengendalikan pikiranku! :)
Chas Brown
4

K (ngn / k) , 9 byte

{y@>-x?y}

Cobalah online!

{... }adalah fungsi dengan argumen xdany

x?ymenemukan untuk setiap elemen dalam yindeks kemunculan pertamanya di x; jika elemen tidak ditemukan x, indeksnya dianggap 0N(-2 63 )

-Meniadakan semua indeks kecuali bahwa itu menjaga 0N-s utuh, karena 2 63 ≡-2 63 (mod 2 64 )

> mengembalikan permutasi sort-descending

y@indeks ydengan itu

ngn
sumber
3

Arang , 13 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

 θ              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
sumber
3

Jelly , 4 byte

fⱮ;ḟ

Tautan diad menerima string di sebelah kiri dan alfabet di sebelah kanan (sebagai daftar karakter) dan mengembalikan hasilnya (juga sebagai daftar karakter).

Cobalah online!

Bagaimana?

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
sumber
3

APL (Dyalog Unicode) , 5 byte SBCS

Fungsi awalan diam-diam anonim, mengambil [string,ordering]sebagai argumen.

⍋⍨/⌷⊃

Cobalah online!

... / Kurangi dengan fungsi berikut:

  ...  yaitu versi argumen yang dibalik dari fungsi berikut:

   nilai string yang tepat sesuai dengan urutan kiri (huruf hilang pada bagian akhir)

 gunakan itu untuk mengindeks ke ...

 elemen pertama dari argumen (yaitu string)

Adm
sumber
3

JavaScript (SpiderMonkey), 50 byte

Mengambil input dalam sintaks currying (a)(s), di mana a adalah string dan s adalah array karakter. Mengembalikan array karakter.

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

Cobalah online!

Bagaimana?

Kami mendefinisikan fungsi helper g () sebagai:

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

yang mengembalikan:

  • 1 jika c bukan milik alfabet
  • nilai float dalam [-Inf, 0) berdasarkan posisi c dalam alfabet sebaliknya (-Inf, -1, -1/2, -1/3, dll.)

Kami mengurutkan s [] dengan menghitung g (b) - g (c) untuk setiap pasangan karakter (b, c) diteruskan ke callback of sort () .

Karena implementasi sort () di SpiderMonkey stabil, semua karakter s [] yang bukan milik alfabet hanya dipindahkan di akhir dalam urutan penampilan dan dibiarkan tidak berubah ketika mereka dibandingkan satu sama lain.


JavaScript (ES6), 61 byte

Mengambil input dalam sintaks currying (a)(s), di mana a dan s adalah array karakter. Mengembalikan string.

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

Cobalah online!

Arnauld
sumber
3

R , 69 62 58 byte

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

Cobalah online!

Input dan output adalah vektor karakter individu.

Penjelasan:

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
sumber
3

Brain-Flak (BrainHack) , 118 byte

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

Cobalah online!

Input adalah string pertama, diikuti oleh null, diikuti oleh string kedua. Versi yang menggunakan baris baru sebagai pemisah bukannya menambah 24 byte:

Brain-Flak , 142 byte

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

Cobalah online!

Penjelasan

# 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
sumber
2

C (gcc) , 97 byte

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

Semua spasi putih (spasi dan baris baru) dalam kode di atas hanya untuk dibaca dan harus dihapus.

Kamus dilewatkan Ddan memiliki panjang d, string dilewatkan Sdan memiliki panjang s. idan oharus dihilangkan.

Cobalah online!

pengguna202729
sumber
2

Pyth ,  9  5 byte

ox+vz

Coba di sini!

ox + vz Program lengkap. Format input: "S" \ n "A".
o Sortir karakter S dengan (variabel: N) ...
 x ... indeks N di ...
  + vz ... A + N
Tuan Xcoder
sumber
2

Java 8, 98 byte

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

Cobalah online.

Penjelasan:

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
sumber
Tidak bisa turun, bahkan dengan String.repeat(int)metode baru Java 11 . Bagus! :)
Olivier Grégoire
@ OlivierGrégoire Oh, tidak tahu akses awal ke Java 11 sudah tersedia. Tapi itu .repeat(n)terlihat menjanjikan. : D
Kevin Cruijssen
2

Perl 5 dengan -pF, 43 byte

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

Cobalah online!

Dom Hastings
sumber
Apakah tidak ada bendera yang memberi Anda $_=<>;gratis?
Pavel
@Pavel ya, maaf saya menggunakannya untuk mengisi @F, tapi saya tidak menambahkannya ke header! Saya akan melakukannya sekarang! Terima kasih!
Dom Hastings
Anda dapat memotong 10 byte ini dan masih menggunakan logika yang sama: Coba online!
Xcali
2

Prolog (SWI) , 136 byte

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

Cobalah online! Contoh penggunaan:

[i,l]*[n,m,i,u,p,l,l,i,u]*S.
S = [i, i, l, l, n, m, u, p, u]
Laikoni
sumber
1

Bersih , 61 byte

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

Cobalah online!

Menentukan fungsi $ :: [Char] [Char] -> [Char].

Tidak mengherankan, ini secara harfiah adalah jawaban Hasimi nimi tetapi lebih lama.

Suram
sumber
1

PynTree , 13 byte

§yz:ṡzCæf+yxx

Cobalah online!

Jawaban Port of Jo King's Python.

Penjelasan

§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
sumber