カスタムアルファベットで並べ替え


9

課題は、単語のリストを並べ替えるプログラムを作成することです。単語がランダムに与えられたアルファベットの順序である必要があるだけです。

プログラムは、コンマ区切りの文字列と新しいアルファベットを受け入れます。
プログラムは、すべての単語を同じ方法で新しいソート順に出力します。

例:

入力:

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

出力:

cat,green,home,network,egg,oval

これはですので、勝者は最短のプログラムを持つ人です。

これは私の最初の課題ですので、質問/チャレンジの改善はありがたいです。


1.私はあなたの例から、アルファベットは単語とスペースで区切られると考えています。あれは正しいですか?2.単語は常に小文字になりますか?
Dennis

@Dennis yes to both
Mathetic

1
それは間違いです。それを編集します。
数学の2014年

+1 OK質問(最初の試行では;-))。しかし、タイトルの関連性がわかりません。おそらく、名前をSort by custom alphabetもっとクリエイティブなものに変更できますか?
Digital Trauma 2014年

@DigitalTraumaそうだね。ちょっと言葉で遊んでみました。asciiやutf-8などを参考にしてどちらかを尋ねました。しかし、それは失敗しました。それをあなたの提案に変更します。
数学の2014年

回答:


2

CJam、26 19 17バイト

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

オンラインでお試しください。

テストケース

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

使い方

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

さて、あなたも同じアプローチを使用したので、私のものは今は本当に意味がありません。
オプティマイザ

@オプティマイザー:あなたは私を8秒で打ちました。回答の削除を取り消す場合は、私がロールバックします。
Dennis

いいえ、私はそれは些細で非常に不変の変化だと思います。そもそも私の回答を投稿する前に、あなたのアップデートを見るべきでした:)
オプティマイザ

4

Bash + coreutils、37バイト

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

出力:

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

1
コンマを処理するための素晴らしい方法!
Dennis

2

バース、19文字

j\,o_mx_zdNchczd\,

テスト:

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

説明:

                            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(",")

基本的に、文字列内の文字のインデックスのリストのキーを使用してチャンクを並べ替え、コンマで結合します。反転ビジネスは、文字列を再度分割するよりも短いです。


18バイト:j\,_omx_zdNchczd\,
Dennis

@デニスはとても賢い、ありがとう。
isaacg 2014年

1

Ruby、53 50バイト

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

Rubyを使用trして、a-z並べ替え前にカスタムアルファベットを置き換えています。入力はコマンドライン引数を介して行われます。


$><<画面への印刷に使用する場合は、バイトを削ることができます(その後、スペースを削除できます)。次の$*ように変数に割り当ててa,b=$*、の#sort_by代わりに使用することで、さらに2バイトを削ることができます#sort_by!
britishtea 2014年

@britishteaありがとう。必要だと思っ*$*ていました(最初に持っていたものと同じ長さです)。
Martin Ender 2014年

0

Python、131

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

改善の余地は十分あるはずです。


ソート関数としてキーを使用する必要はありません- a.find(c)直接リストを使用してください。
isaacg 2014年

0

JavaScript(E6)102119

変数「a」のアルファベットに基づいて、マッピング関数「M」でソートします
ます。ポップアップを使用してIOを使用します(プロンプト+アラート)

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

1つの文字列パラメータを持つ(テスト可能な)関数として、文字列配列を返します(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))
)

テストFireFox / FireBugコンソールで

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

出力

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

1
-4ソート関数を次のように置き換えると(M(a)>M(b))-(M(a)<M(b))
DocMax

@DocMaxとてもいい。それは、それはそれよりもさらに簡単だということが判明した(stackoverflow.com/a/7232172/3640407
edc65

入力と出力およびエイリアスのプロンプトを再利用する場合、入力を個別に取得することにより、分割呼び出しを回避できます。私はそれがいくつかのキャラクターを救うべきだと思います。
IngoBürk2014年

また、私は今私の携帯電話だけにいますが、なぜMはそれほど複雑なのですか?使用してもうまくいきませんM=w=>[...a].indexOf(w)か?残念ながら今はテストできません。
IngoBürk2014年

@IngoBürkwは文字ではなく単語です。Mは、wの各文字をaの位置に置き換えます。
edc65 2014年

0

Clojure、115バイト

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

うわー、これは最初からうまくいきました(sort-by(fn[w](mapv(zipmap(sort %2)%2)w)))が、その後vec、文字列と同じ方法で並べ替えられないことに気付きました。これらのコンマをインターリーブすると、かなりの量のコードが必要になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.