หมายเลขเรียงลำดับแสดงในฐานที่ไม่รู้จัก


13

รับรายการสตริงจัดเรียงรายการเป็นตัวเลขโดยไม่ทราบว่าใช้ฐานใด ค่าของตัวเลขนั้นไม่เป็นที่รู้จักเช่นกัน (เป็นไปได้ว่า'1'> '2')

เนื่องจากไม่ทราบค่าตัวเลขให้ใช้กฎของ Benford (หรือกฎของเลขหลักแรก) เพื่อกำหนดค่าสัมพัทธ์ของตัวเลข สำหรับการแจกแจงที่เป็นไปตามกฎหมายของ Benford ตัวเลขที่มีค่าต่ำกว่าจะปรากฏเป็นเลขนำหน้าบ่อยกว่าตัวเลขที่มีมูลค่าสูงกว่า

กฎระเบียบ

  • นี่คือ
  • รายการของสตริงสามารถมาจากแหล่งที่คุณเลือก (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] และตัวอักษรตัวพิมพ์เล็กมีจำนวนเท่ากันหรือแตกต่างจากอักขระตัวพิมพ์ใหญ่หรือไม่
Joshua Taylor

ควรสนับสนุนอักขระ ASCII ทั้งหมดและตัวพิมพ์ใหญ่และตัวพิมพ์เล็กแตกต่างกัน
Rynant

คำตอบ:


7

Python 59 108 112

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

อินพุตถูกจัดเตรียมเป็นรายการaและนิพจน์นี้สร้างรายการที่เรียงลำดับ (+2 อักขระเพื่อกำหนดให้กับตัวแปร) สิ่งนี้จะเรียงลำดับรายการโดยย้อนกลับด้วยความยาวเชิงลบแล้วตามความถี่


+1 เรียบร้อยดี ไม่คิดว่ามันสามารถทำได้อย่างมีประสิทธิภาพในพื้นที่แสดงออกเพียงครั้งเดียว
Seequ

ดี! ผมไม่ทราบเกี่ยวกับzip Noneแม้ว่ามันจะไม่ทำงานในหลาม 3 itertools.zip_longestซึ่งจะใช้
Rynant

Noneไม่สามารถเปรียบเทียบกับจำนวนเต็มใน Python 3 ดังนั้นมันจะล้มเหลว
nneonneo

@nneonneo Right fillvalueต้องตั้งค่าให้น้อยกว่าค่าที่น้อยที่สุด
Rynant

และฉันคิดว่าฉันรู้บางอย่างเกี่ยวกับหลาม - ไม่ คุณช่วยอธิบายรหัสของคุณให้ละเอียดมากขึ้นได้ไหม? ฉันจะมีความสุขมาก - มือใหม่หลามที่นี่
ข้อบกพร่อง

3

ทับทิม, 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


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: สำหรับการเรียงลำดับค่าความถี่จะถูกรวมในสตริงที่มีเบาะขนาดใหญ่

Ungolfed

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-~เพิ่มขึ้น 1 แม้ว่าจำนวนเดิม X จะไม่ได้กำหนดหรือ NaN

การใช้

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.