不明な基数で表される番号を並べ替える


13

文字列のリストが与えられた場合、どのベースが使用されているかを知らずにリストを数字としてソートします。数字の値も不明です('1'>の可能性があります'2')。

桁の値は不明であるため、ベンフォードの法則(または最初の桁の法則)を使用して、桁の相対値を決定します。ベンフォードの法則に従う分布の場合、低い値の数字は高い値の数字よりも頻繁に先行数字として表示されます。

ルール

  • これは
  • 文字列のリストは、選択したソース(stdin、変数、ファイル、ユーザーなど)から取得できます。
  • 文字列はASCII文字に制限されています。
  • 先行文字として表示されない文字は、最高値を持ちます。(ゼロがないと仮定し、先行周波数で厳密にソートします。)
  • 他の文字と同じ回数だけ先行数字として表示される文字は、均等に重み付けされます。

未分類

['c','ca','ac','cc','a','ccc','cx','cz','cy']

ソート済み

['c','a','cc','ca','cz','cy','cx','ac','ccc']

注:例では、'cz''cy'および'cx'数字ので、任意の順序で5番目、6番目と7番目の要素として表示することができ'x''y'そして'z'均等に重み付けされます。


「文字列はASCII文字に制限されています。」この例では、英数字のみを示しています(実際にはアルファベット文字のみ)。すべてのASCII文字、または単に[0-9a-zA-Z]を意味し、小文字は大文字と同じか異なるかをカウントしますか?
ジョシュアテイラー

すべてのASCII文字をサポートする必要があり、大文字と小文字は異なります。
リナント14年

回答:


7

Python、59 108 112

sorted(a,None,lambda x:(-len(x),map(zip(*a)[0].count,x)),1)

入力はリストとして提供され、aこの式はソートされたリスト(変数に割り当てるための+2文字)を生成します。これは、長さを無効にして頻度でリストを逆順に並べ替えます。


+1よくできました。単一の表現でスペースを効率的に行うことができるとは思わなかった。
seequ 14年

いいね!私は知りませんでしたzipNone。を使用するPython 3では動作しませんがitertools.zip_longest
リナント14年

NonePython 3の整数と比較できないため、とにかく失敗します。
nneonneo 14年

@nneonneoそうですねfillvalue、最小値より小さい値に設定する必要があります。
リナント14年

そして、私はPythonについて何か知っていると思った-いいえ。コードをもう少し詳しく説明してもらえますか?とてもうれしいです-python newbie here。
flawr 14年

3

ルビー、65

f=->a{a.sort_by{|s|[s.size,s.chars.map{|c|a.count{|t|t[0]!=c}}]}}

文字列のサイズで辞書式にソートし、次に各文字の頻度を先頭の数字ではないものとしてソートします。


0

Java(261)

void s(String[]s){int[]a=new int[128];for(String t:s)a[t.charAt(0)]++;java.util.Arrays.sort(s,(o,p)->{int j=o.length()-p.length();if(j!=0)return j;for(int i=0;i<Math.min(o.length(),p.length());i++){j=a[p.charAt(i)]-a[o.charAt(i)];if(j!=0)return j;}return 0;});}

void s(String[] s) {
    int[] a = new int[128];
    for (String t : s) {
        a[t.charAt(0)]++;
    }
    java.util.Arrays.sort(s, (o, p) -> {
        int j = o.length() - p.length();
        if (j != 0) {
            return j;
        }
        for (int i = 0; i < Math.min(o.length(), p.length()); i++) {
            j = a[p.charAt(i)] - a[o.charAt(i)];
            if (j != 0) {
                return j;
            }
        }
        return 0;
    });
}

メソッドは文字列の配列を受け取り、配列を所定の位置に並べ替えます。実装については何もおかしくありませんが、Java 8に追加されたラムダ式を利用しています。


0

Javascript(E6)147

F=i=>(f={},i.map(x=>(f[x[0]]=-~f[x[0]])),i.map(x=>[x,[...x].map(y=>1e9-~f[y]+'')]).sort((a,b,d=a[0].length-b[0].length)=>d||a[1]<b[1]).map(x=>x[0]))

限定

1000000000までの頻度値:ソートのために、頻度値は大きなパディング文字列にマージされます

非ゴルフ

F=i=>(
  f={}, //init frequency map
  i.map(x => (f[x[0]]=-~f[x[0]])), // build frequency map
  i.map(x => [x, [...x].map(y=>1e9-~f[y]+'')]) // add frequency info to each element of input list
 .sort((a,b,d=a[0].length-b[0].length)=>d || a[1]<b[1]) // then sort by lenght and frequency
 .map( x => x[0]) // throw away frequency info
)

X-~元の数値Xが未定義またはNaNの場合でも、サイドノートは1ずつ増加します

使用法

F(['c','ca','ac','cc','a','ccc','cx','cz','cy'])

出力: ["c", "a", "cc", "ca", "cx", "cz", "cy", "ac", "ccc"]

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