Ordina per alfabeto personalizzato


9

La sfida è quella di creare un programma che ordina un elenco di parole, solo che le parole devono essere nell'ordine di un dato alfabeto casuale.

Il tuo programma accetterà una stringa di parole separate da virgola e un nuovo alfabeto.
Il tuo programma produrrà ogni parola allo stesso modo nel nuovo ordine ordinato.

Esempio:

Ingresso:

home,oval,cat,egg,network,green bcdfghijklmnpqrstvwxzaeiouy

Produzione:

cat,green,home,network,egg,oval

Questo è un , quindi il vincitore è la persona con il programma più corto.

Questa è la mia prima sfida, quindi ogni miglioramento alla domanda / sfida è apprezzato.


1. Prendo dal tuo esempio che l'alfabeto sarà separato dalle parole da uno spazio. È corretto? 2. Le parole saranno sempre in minuscolo?
Dennis,

@Dennis sì ad entrambi
Mathetic

1
Questo è un errore Lo modificherò.
Mathetic

+1 OK domanda (per un primo tentativo ;-)). Ma non vedo la pertinenza del titolo - forse puoi rinominarlo Sort by custom alphabeto qualcosa di più creativo?
Trauma digitale

@DigitalTrauma Sì, potrebbe essere migliore. Ho provato a giocare un po 'con le parole. Ho mirato a un riferimento a ASCII e UTF-8 e simili per chiedere quale sia. Ma quello fallì. Lo cambierò a tuo suggerimento che era meglio.
Mathetic

Risposte:


2

CJam, 26 19 17 byte

rr:A;',/{Af#}$',*

Provalo online.

Caso di prova

$ cjam sort.cjam <<< 'home,oval,cat,egg,network,green bcdfghjklmnpqrstvwxzaeiouy'
cat,green,home,network,egg,oval

Come funziona

rr                    " Read two whitespace-separated tokens from STDIN. ";
  :A;                 " Save the second token (the alphabet) in A.       ";
     ',/              " Split the remaining token at commas.             ";
        {Af#}$        " Sort by the chunks' characters' indexes in A.    ";
               ',*    " Join, separating by commas.                      ";

Bene, dato che hai anche usato lo stesso approccio, il mio non ha davvero alcun senso ora.
Ottimizzatore

@Optimizer: mi hai battuto di otto secondi. Se annulli la tua risposta, farò tornare indietro la mia.
Dennis,

No, penso che sia un cambiamento banale e molto ovvio. Avrei dovuto esaminare i tuoi aggiornamenti prima di pubblicare la mia risposta in primo luogo :)
Ottimizzatore

4

Bash + coreutils, 37 byte

tr ,$2 \\na-z<<<$1|sort|tr \\na-z ,$2

Produzione:

$ ./alphasort.sh home,oval,cat,egg,network,green bcdfghijklmnpqrstvwxyzaeiouy
cat,green,home,network,egg,oval, $ 

1
Bel modo di gestire le virgole!
Dennis,

2

Pyth , 19 personaggi

j\,o_mx_zdNchczd\,

Test:

$ pyth -c "j\,o_mx_zdNchczd\," <<< 'home,oval,cat,egg,network,green bcdfghjklmnpqrstvwxzaeiouy'
cat,green,home,network,egg,oval

Spiegazione:

                            Implicit: d=" "
                            Implicit: z=input()
j\,                         ",".join(
   o                                 order_by(lambda N:
    _                                                  rev(
     m                                                     map(lambda d:
      x_zd                                                              rev(z).index(d),
      N                                                                 N),
    chczd\,                                            z.split(" "[0].split(",")

In sostanza, ordina i blocchi, con una chiave dell'elenco di indici dei caratteri nella stringa, quindi li unisce in virgole. Le attività di inversione sono più brevi della divisione della stringa di nuovo.


18 byte:j\,_omx_zdNchczd\,
Dennis,

@Dennis molto intelligente, grazie.
isaacg,

1

Rubino, 53 50 byte

a,b=$*
$><<a.split(?,).sort_by{|w|w.tr b,'a-z'}*?,

Sto usando Ruby trper sostituire l'alfabeto personalizzato con a-zprima dell'ordinamento. L'input avviene tramite argomento della riga di comando.


È possibile radere un byte se si utilizza $><<per stampare sullo schermo (è quindi possibile rimuovere lo spazio). Puoi radere altri due byte assegnando $*a variabili in questo modo: a,b=$*e usando #sort_byinvece di #sort_by!.
britishtea,

@britishtea Grazie. Pensavo di averne bisogno *$*(che all'inizio avevo e che è della stessa lunghezza).
Martin Ender,

0

Python, 131

w,a=input().split()
print(",".join(sorted(w.split(","),key=lambda s:"".join(["abcdefghijklmnopqrstuvwxyz"[a.find(c)]for c in s]))))

Dovrebbe esserci ampio margine di miglioramento.


Non è necessario utilizzare un tasto come funzione di ordinamento, basta usare a.find(c)direttamente l'elenco di .
isaacg,

0

JavaScript (E6) 102 119

Ordinamento con una funzione di mappatura "M" basata sull'alfabeto nella variabile "a"
Con IO tramite popup (prompt + avviso)

x=prompt().split(/[ ,]/),
a=x.pop(),
M=w=>[10+a.search(c)for(c of w)]+'',
alert(x.sort((a,b)=>M(a)>M(b)))

Come funzione (testabile) con 1 parametro stringa, che restituisce un array di stringhe (92)

F=x=>(
  M=w=>[10+a.search(c)for(c of w)],
  x=x.split(/[ ,]/),
  a=x.pop(),
  x.sort((a,b)=>M(a)>M(b))
)

Test nella console FireFox / FireBug

F('home,oval,cat,egg,network,green zyxwvtsrqpnmlkjhgfdcbaeiou')

Produzione

["network", "home", "green", "cat", "egg", "oval"]

1
-4 se si sostituisce la funzione di ordinamento con(M(a)>M(b))-(M(a)<M(b))
DocMax,

@DocMax molto bello. Si scopre che è ancora più semplice di quello ( stackoverflow.com/a/7232172/3640407 )
edc65

Se riutilizzi la richiesta di input, output e alias, puoi evitare la chiamata divisa prendendo gli input separatamente. Penso che dovrebbe salvare alcuni personaggi.
Ingo Bürk,

Inoltre sono solo sul mio telefono in questo momento, ma perché M è così complesso? Non funzionerebbe M=w=>[...a].indexOf(w)? Purtroppo non posso provarlo adesso.
Ingo Bürk,

@ IngoBürk w è una parola, non un personaggio. M sostituisce ogni carattere in w con la sua posizione in a.
edc65,

0

Clojure, 115 byte

#(apply str(butlast(interleave(sort-by(fn[w](apply str(map(zipmap(sort %2)%2)w)))(re-seq #"[a-z]+"%))(repeat \,))))

Wow, questo è iniziato bene, (sort-by(fn[w](mapv(zipmap(sort %2)%2)w)))ma poi ho capito vecche non sono stati ordinati allo stesso modo delle stringhe e anche l'interleaving di quelle virgole richiede una quantità significativa di codice.

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.