Сортувати числа, представлені у невідомій базі


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 повинні підтримуватися, а великі та малі регістри - різними.
Рінант

Відповіді:


7

Пітона, 59 108 112

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

Введення надається як список a, і це вираження створює відсортований список (+2 символи для призначення змінної). Це сортує список у зворотному порядку за запереченою довжиною, а потім за частотою.


+1 Чудово виконано. Не думав, що це можна зробити простором ефективно в одному виразі.
seequ

Приємно! Я не знаю , про zipз None. Хоча це не працює в Python 3, який би використовував itertools.zip_longest.
Рінант

Noneне можна порівняти з цілими числами в Python 3, тому воно все одно вийде з ладу.
nneonneo

@nneonneo Правильно, fillvalueпотрібно було б встановити щось менше, ніж найменше значення.
Рінант

І я думав, що знаю щось про python - nope. Чи можете ви пояснити свій код дещо детальніше? Я був би дуже радий - пітон новачком тут.
flawr

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-~ приріст на 1, навіть якщо вихідне число X не визначене або NaN

Використання

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

Вихід: ["c", "a", "cc", "ca", "cx", "cz", "cy", "ac", "ccc"]

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.