Sắp xếp số đại diện trong một cơ sở không xác định


13

Đưa ra một danh sách các chuỗi, sắp xếp danh sách dưới dạng số mà không biết cơ sở nào được sử dụng. Các giá trị của các chữ số cũng không xác định (có thể là '1'> '2').

Vì các giá trị của các chữ số là không xác định, hãy sử dụng Luật của Benford (hoặc Luật của Chữ số thứ nhất) để xác định giá trị tương đối của các chữ số. Đối với các bản phân phối tuân theo Luật của Benford, các chữ số có giá trị thấp hơn xuất hiện dưới dạng chữ số hàng đầu thường xuyên hơn các chữ số có giá trị cao hơn.

Quy tắc

  • Đây là
  • Danh sách các chuỗi có thể đến từ một nguồn bạn chọn (stdin, biến, tệp, người dùng, v.v.)
  • Chuỗi được giới hạn trong các ký tự ASCII.
  • Các nhân vật không xuất hiện như một nhân vật hàng đầu có giá trị cao nhất. (giả sử không có số không và sắp xếp đúng theo tần số hàng đầu.)
  • Các ký tự xuất hiện dưới dạng chữ số hàng đầu cùng số lần với các ký tự khác có trọng số như nhau.

Thí dụ

Chưa sắp xếp

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

Sắp xếp

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

Lưu ý: Trong ví dụ này, 'cz', 'cy''cx'có thể xuất hiện như là thứ 5, thứ 6 và thứ 7 yếu tố trong bất kỳ thứ tự từ các chữ số 'x', 'y''z'được trọng không kém.


"Chuỗi được giới hạn ở các ký tự ASCII." Ví dụ của bạn chỉ hiển thị chữ và số (thực ra chỉ có các ký tự chữ cái). Bạn có nghĩa là tất cả các ký tự ASCII, hoặc chỉ [0-9a-zA-Z], và các chữ cái viết thường có cùng hoặc khác với các ký tự chữ hoa không?
Joshua Taylor

Tất cả các ký tự ASCII nên được hỗ trợ, chữ hoa và chữ thường là khác nhau.
Rynant

Câu trả lời:


7

Con trăn, 59 108 112

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

Đầu vào được cung cấp dưới dạng danh sách avà biểu thức này tạo ra danh sách được sắp xếp (+2 ký tự để gán cho một biến). Điều này sắp xếp danh sách ngược lại theo chiều dài phủ định và sau đó theo tần số.


+1 Hoàn thành tốt. Không nghĩ rằng nó có thể được thực hiện không gian hiệu quả trong một biểu thức.
xem

Đẹp! Tôi không biết về zipvới None. Mặc dù nó không hoạt động trong Python 3 sẽ sử dụng itertools.zip_longest.
Rynant

Nonekhông thể so sánh với số nguyên trong Python 3, vì vậy dù sao nó cũng sẽ thất bại.
nneonneo

@nneonneo Phải, fillvaluesẽ phải được đặt thành giá trị nhỏ hơn giá trị nhỏ nhất.
Rynant

Và tôi nghĩ tôi đã biết vài điều về trăn - không. Bạn có thể giải thích mã của bạn một chút chi tiết hơn? Tôi sẽ rất hạnh phúc - python newbie ở đây.
flawr

3

Ruby, 65

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

Sắp xếp từ vựng theo kích thước của chuỗi, sau đó tần số của mỗi ký tự không phải là chữ số hàng đầu.


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

Các phương thức lấy một mảng các chuỗi và sắp xếp các mảng tại chỗ. Không có gì lạ mắt về việc triển khai, nhưng nó sử dụng các biểu thức lambda được thêm vào 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]))

Giới hạn

Các giá trị tần số lên tới 1000000000: để sắp xếp, các giá trị tần số được hợp nhất trong một chuỗi đệm lớn

Ung dung

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
)

Sidenote X-~ tăng thêm 1 ngay cả khi số X ban đầu không được xác định hoặc NaN

Sử dụng

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

Đầu ra: ["c", "a", "cc", "ca", "cx", "cz", "cy", "ac", "ccc"]

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.