Ordina una stringa in base a un determinato ordine


23

La tua sfida è quella di ordinare una stringa, ma piuttosto che dal normale ordine alfabetico (abc..xyz), dovrai ordinare le stringhe in base a un alfabeto specificato.

È necessario scrivere un programma o una funzione che prende due ingressi: Un alfabeto A e una stringa S . Entrambi conterranno solo lettere inglesi minuscole ed entrambi conterranno almeno un carattere.

Devi spostare le lettere in S in modo che la lettera che appare per prima in A appaia per prima, quindi la lettera che appare per seconda in A , ecc. Potrebbero esserci alcune lettere in S che non compaiono in A , queste dovrebbero essere lasciate alla fine e non spostati l'uno rispetto all'altro.

Casi test:

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

Vince il minor numero di byte!


Possiamo stampare / restituire una matrice di stringhe singleton? Possiamo prendere come input una stringa e una matrice di stringhe singleton?
Dennis,

@Dennis Sì, entrambi rappresentano bene le stringhe.
Pavel,

Possiamo prendere uno o entrambi gli input come una matrice di singoli caratteri?
Shaggy,

@Shaggy Una stringa è una matrice di caratteri, quindi sì.
Pavel,

Risposte:


5

05AB1E , 4 byte

Rvy†

Provalo online!

Spiegazione

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

Più intelligente di Σ²sk>.
Magic Octopus Urn

Peccato per R€†lavorare come previsto però :). A volte può funzionare come un vyciclo più piccolo . Bella risposta amico.
Magic Octopus Urn

10

Python 3 , 50 47 46 44 byte

-3 byte grazie a ngn!

-1 byte grazie a mypetlion

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

Provalo online!

Accetta una stringa come l'alfabeto e un elenco di caratteri come stringa e ordina l'elenco in posizione.

Le %27assicura che se il personaggio non è in alfabeto, l'indice restituito lo mette dopo il resto dell'alfabeto.


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

1
(a+c).find(c)-> a.find(c)%27per salvare 1 byte
mypetlion

7

Haskell, 42 byte

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

Provalo 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 byte

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

Provalo

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

Provalo

Allargato:

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

Poiché nell'input ci saranno solo fino a 26 caratteri diversi e ∞ è di 3 byte, è possibile sostituirlo con 27 e continuerà a funzionare e salvare un byte.
Pavel

6

Haskell , 40 34 byte

-6 byte enormi grazie a Laikoni .

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

Provalo online!

La prima riga è un'espressione che prende due argomenti: S e A .


1
Bello! Puoi anche abbandonare f=perché sono consentite funzioni anonime.
Laikoni,

1
Inoltre (<>)ora è in Prelude, quindi può essere abbreviato in foldr(\c->r(==c)<>r(/=c))34 byte: provalo online!
Laikoni,

6

Stax , 6 byte

{xrINo

Esegui ed esegui il debug

Questo ordina per un blocco che fa questo.

  • Invertire l'alfabeto.
  • Ottieni l'indice di ciascun personaggio nell'alfabeto invertito. Rendimenti mancanti -1.
  • Annulla l'indice.

5

Python 2 , 38 byte

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

a deve essere una stringa, s un elenco di stringhe di lunghezza 1. f ordina s in posizione.

Provalo online!

Versione alternativa, I / O stringa, 48 byte

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

Provalo online!

Come funziona

s.sort(None,a[::-1],1)è una scorciatoia per s.sort(cmp=None,key=a[::-1],reverse=1).

Dai documenti :

reverse è un valore booleano. Se impostato su True, gli elementi dell'elenco vengono ordinati come se ogni confronto fosse invertito.


L'ordinamento TIL può accettare 4 argomenti.
Pavel,

Solo in Python 2. Python 3 deprecate cmpe fatti keye reverseargomenti chiave-only, quindi la sua list.sortrichiede solo un argomento posizionale.
Dennis,

4

J , 5 byte

]/:i.

Verbo diadico, prendendo l'alfabeto alla sua sinistra e la stringa da ordinare a destra.

i. trova gli indici dei caratteri della stringa nell'alfabeto, la lunghezza dell'alfabeto se non viene trovata.

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

/: ordina il suo oggetto sinistro in base all'ordine specificato in quello giusto.

] l'argomento rigth (la stringa)

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

Provalo online!


4

Python 2 , 35 50 byte

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

Provalo online!

Prende ae scome stringhe; restituisce un elenco di stringhe singelton.

Nota: Ahi! Ottenuti 15 byte per correggere ...


Ha! Questo è esattamente lo stesso del mio codice originale per la mia risposta . Le grandi menti pensano allo stesso modo
Jo King,

1
@Jo King: smetti di controllare i miei pensieri! :)
Chas Brown,

4

K (ngn / k) , 9 byte

{y@>-x?y}

Provalo online!

{... }è una funzione con argomenti xey

x?ytrova per ogni elemento ynell'indice della sua prima occorrenza in x; se un elemento non viene trovato in x, viene considerato il suo indice 0N(-2 63 )

-annulla tutti gli indici tranne per il fatto che mantiene 0Nintatta -s, perché 2 63 ≡-2 63 (mod 2 64 )

> restituisce una permutazione decrescente

y@indicizza ycon quello


3

Carbone , 13 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

 θ              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

Gelatina , 4 byte

fⱮ;ḟ

Un collegamento diadico che accetta la stringa a sinistra e l'alfabeto a destra (come elenchi di caratteri) e restituisce il risultato (anche come elenco di caratteri).

Provalo online!

Come?

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 byte SBCS

Funzione di prefisso tacito anonimo, prendendo [string,ordering]come argomento.

⍋⍨/⌷⊃

Provalo online!

... / Ridurre con la seguente funzione:

  ...  vale a dire la versione con argomenti invertiti della seguente funzione:

   classificare la stringa destra in base all'ordine sinistro (le lettere mancanti vanno alla fine)

 usalo per indicizzare in ...

 il primo elemento dell'argomento (cioè la stringa)


3

JavaScript (SpiderMonkey), 50 byte

Accetta input nella sintassi del curry (a)(s), dove a è una stringa e s è una matrice di caratteri. Restituisce una matrice di caratteri.

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

Provalo online!

Come?

Definiamo la funzione helper g () come:

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

che ritorna:

  • 1 se c non appartiene all'alfabeto
  • un valore float in [-Inf, 0) basato sulla posizione di c dell'alfabeto altrimenti (-Inf, -1, -1/2, -1/3, ecc.)

Ordiniamo s [] calcolando g (b) - g (c) per ogni coppia di caratteri (b, c) passati al callback di sort () .

Poiché l'implementazione di sort () in SpiderMonkey è stabile, tutti i caratteri di s [] che non appartengono all'alfabeto vengono semplicemente spostati alla fine in ordine di apparizione e lasciati invariati quando vengono confrontati tra loro.


JavaScript (ES6), 61 byte

Accetta input nella sintassi del curry (a)(s), in cui sia a che s sono matrici di caratteri. Restituisce una stringa.

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

Provalo online!


3

R , 69 62 58 byte

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

Provalo online!

Input e output sono vettori di singoli caratteri.

Spiegazione:

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 byte

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

Provalo online!

L'input è la prima stringa, seguita da un null, seguita dalla seconda stringa. Una versione che utilizza una nuova riga come separatore aggiunge invece 24 byte:

Brain-Flak , 142 byte

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

Provalo online!

Spiegazione

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

Tutti gli spazi bianchi (spazi e righe) nel codice sopra sono solo a fini di leggibilità e devono essere rimossi.

Il dizionario è passato De ha lunghezza d, la stringa è passata Se ha lunghezza s. ie odovrebbe essere omesso.

Provalo online!


2

Pyth ,  9  5 byte

ox+vz

Provalo qui!

ox + vz Programma completo. Formato di input: "S" \ n "A".
o Ordina i caratteri di S per (variabile: N) ...
 x ... indice di N in ...
  + vz ... A + N

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

Provalo online.

Spiegazione:

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`

Non potrebbe andare più in basso, anche con il nuovo String.repeat(int)metodo di Java 11 . Bello! :)
Olivier Grégoire

@ OlivierGrégoire Oh, non sapevo che l'accesso anticipato a Java 11 fosse già disponibile. Questo .repeat(n)sembra essere molto promettente, però. : D
Kevin Cruijssen,


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

Provalo online! Esempio di utilizzo:

[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 byte

§yz:ṡzCæf+yxx

Provalo online!

Python di Port of Jo King.

Spiegazione

§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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.