排序以未知基数表示的数字


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字符,并且大写和小写字母均不同。
雷纳特2014年

Answers:


7

Python,第59 108 112

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

输入作为列表提供a,此表达式产生排序后的列表(+2个字符分配给变量)。这将按负数长度然后按频率对列表进行反向排序。


+1做得好。没想到在单个表达式中可以有效地在空间上完成它。
seequ 2014年

真好!我不知道zipNone。虽然在使用的Python 3中不起作用itertools.zip_longest
雷纳特2014年

None无法与Python 3中的整数进行比较,因此无论如何都会失败。
nneonneo 2014年

@nneonneo对,fillvalue必须将其设置为小于最小值的某个值。
雷纳特2014年

我以为我对python 有所了解-不。您能详细解释一下您的代码吗?我会很高兴-python newbie在这里。
瑕疵的

3

Ruby,65岁

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

按照字典的大小对字符串的大小进行排序,然后将每个字符的频率(而不是前导数字)排序。


0

爪哇(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中添加的lambda表达式。


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"]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.