Sortieren Sie die Zahlen nach der Anzahl der binären Einsen

35

Tor

Schreiben Sie eine Funktion oder ein Programm, und sortieren Sie ein Array von Ganzzahlen in absteigender Reihenfolge nach der Anzahl der Einsen in ihrer Binärdarstellung. Es ist keine sekundäre Sortierbedingung erforderlich.

Beispiel sortierte Liste

(unter Verwendung von 16-Bit-Ganzzahlen)

  Dec                Bin        1's
16375   0011111111110111        13
15342   0011101111101110        11
32425   0111111010101001        10
11746   0010110111100010         8
28436   0000110111110100         8
19944   0100110111101000         8
28943   0000011100011111         8
 3944   0000011111101000         7
15752   0011110110001000         7
  825   0000000011111001         6
21826   0101010101000010         6

Eingang

Ein Array von 32-Bit-Ganzzahlen.

Ausgabe

Ein Array der gleichen Ganzzahlen, sortiert wie beschrieben.

Wertung

Dies ist Codegolf für die geringste Anzahl von Bytes, die in einer Woche ausgewählt werden können.

Hand-E-Food
quelle
2
Sie haben es nicht ausdrücklich erwähnt, aber muss es in absteigender Reihenfolge sein?
Nick T
3
Du hast recht, das habe ich verpasst. Alle anderen sind mit dem Abstieg gegangen, also bleiben wir dabei.
Hand-E-Food
Ich denke, die endgültige Nummer (21826) wurde falsch konvertiert. Laut meinem Windows-Rechner ist es 0101 0101 0100 0010, nicht 0010 1010 1100 0010.
Nzall
Danke für die Korrekturen. Das ist komisch an 21826, weil ich Excel verwendet habe, um die Zahlen in Binärdaten umzuwandeln. Ich frage mich jetzt über den Rest.
Hand-E-Food
Lösung mit Montage- und Popcount-Anleitung?
Eiennohito

Antworten:

27

J (11)

(\:+/"1@#:)

Dies ist eine Funktion, die eine Liste annimmt:

     (\:+/"1@#:) 15342 28943 16375 3944 11746 825 32425 28436 21826 15752 19944
16375 15342 32425 28943 11746 28436 19944 3944 15752 825 21826

Wenn Sie ihm einen Namen geben möchten, kostet dies ein zusätzliches Zeichen:

     f=:\:+/"1@#:
     f 15342 28943 16375 3944 11746 825 32425 28436 21826 15752 19944
16375 15342 32425 28943 11746 28436 19944 3944 15752 825 21826

Erläuterung:

  • \:: nach unten sortieren
  • +/: die Summe von
  • "1: jede Reihe von
  • #:: binäre Darstellung
Marinus
quelle
5
@ Ak82 Es ist die ASCII-Version von APL
John Dvorak
3
@ JanDvorak von Art; Es gab einige Änderungen: jsoftware.com/papers/j4apl.htm (siehe Abschnitt Sprache).
James Wood
3
Es gibt auch \:1#.#:was ein paar Bytes spart.
Meilen
17

JavaScript, 39

Update: Jetzt kürzer als Ruby.

x.sort(q=(x,y)=>!x|-!y||q(x&x-1,y&y-1))

40

x.sort(q=(x,y)=>x&&y?q(x&x-1,y&y-1):x-y)

Erläuterung:

q ist eine rekursive Funktion. Wenn x oder y 0 sind, wird zurückgegeben x-y(eine negative Zahl, wenn x Null ist, oder eine positive Zahl, wenn y Null ist). Andernfalls wird das niedrigste Bit entfernt (x&x-1 ) aus x und y entfernt und wiederholt.

Vorherige Version (42)

x.sort(q=(x,y)=>x^y&&!x-!y+q(x&x-1,y&y-1))
Kopieren
quelle
Das ist wirklich schlau! Ich versuche immer noch, mich darum zu kümmern.
Mowwwalker
Sollte nicht ~yfunktionieren statt -!y?
Zahnbürste
@toothbrush Die Endbedingung ist, dass x oder y 0 sind. In diesem Fall wird der Ausdruck !x|-!yungleich Null. ~passt nicht wirklich hinein, da es für viele Eingaben ungleich Null ist (einschließlich Null)
kopiere den
Kann mir jemand helfen, falls eine Nachsortierung erforderlich ist?
Manubhargav
15

Rubin 41

f=->a{a.sort_by{|n|-n.to_s(2).count(?1)}}

Prüfung:

a = [28943, 825, 11746, 16375, 32425, 19944, 21826, 15752, 15342, 3944, 28436];
f[a]
=> [16375, 15342, 32425, 11746, 28436, 28943, 19944, 15752, 3944, 21826, 825]
daniero
quelle
2
Einfach. Verständlich. Kurz. Ein großes Lob für diese Lösung.
Pierre Arlaud
8

Python 3 (44):

def f(l):l.sort(lambda n:-bin(n).count('1'))
Mixer
quelle
8

Gemeiner Lisp, 35

logcountGibt die Anzahl der Ein-Bits in einer Zahl zurück. Für eine Liste lhaben wir:

(sort l '> :key 'logcount)
CL-USER> (sort (list 16375 15342 32425 11746 28436 19944 28943 3944 15752 825 21826) '> :key 'logcount)
;=> (16375 15342 32425 11746 28436 19944 28943 3944 15752 825 21826)

Als eigenständige Funktion und worauf ich die Byteanzahl stützen werde:

(lambda(l)(sort l'> :key'logcount))
Joshua Taylor
quelle
7

Python 3, 90 77 72 67 Zeichen.

Unsere Lösung verwendet eine Eingabe von der Befehlszeile und gibt die Nummer in absteigender Reihenfolge (67 Zeichen) oder aufsteigender Reihenfolge (66 Zeichen) aus.

Absteigende Reihenfolge

print(sorted(input().split(),key=lambda x:-bin(int(x)).count("1"))) # 67

Vielen Dank an @daniero für den Vorschlag, ein Minus in der 1 zu verwenden, um es umzukehren, anstatt ein Slice zu verwenden, um das Array am Ende umzukehren! Dies sparte effektiv 5 Zeichen.

Nur um es zu veröffentlichen, würde die Version in aufsteigender Reihenfolge (die die erste war, die wir gemacht haben) ein Zeichen weniger haben.

Aufsteigende Reihenfolge :

print(sorted(input().split(),key=lambda x:bin(int(x)).count("1"))) # 66

Vielen Dank an @ Bakuriu für den Vorschlag key = lambda x… . ; D

Jetlef
quelle
So 0wird immer ein Teil Ihrer Ausgabe dann sein; Das stimmt nicht.
Daniero
Ich sehe in der Frage nichts, was mich daran hindert, einen Wert einzufügen.
Jetlef
Ich mache: "Ein Array der gleichen ganzen Zahlen sortiert wie beschrieben." ;) Warum nicht einfach ein raw_input()paar Zeichen verwenden und ablegen?
Daniero
1
@daniero hat es behoben. Wenn ich zu Python 3 wechsle (eine Antwort auf Python 2 war bereits vorhanden, muss kreativ sein!), Kann ich input () verwenden und zwei Zeichen speichern (zwei müssen hinzugefügt werden, da print () eckige Klammern benötigt ).
Jetlef
Sie können das []Innere fallen lassen sorted. Die Ausgabe dieses Programms ist auch die Anzahl der Einsen in den eingegebenen Zahlen sortiert, aber Sie sollten die Anzahl, die Sie in der Eingabe erhalten haben, sortiert nach der Anzahl von 1s ausgeben . So etwas wie: print(sorted(input().split(), key=lambda x:bin(int(x)).count('1')))wäre richtig.
Bakuriu
7

JavaScript [76 Bytes]

a.sort(function(x,y){r='..toString(2).split(1).length';return eval(y+r+-x+r)})

wo aist ein Eingabearray von Zahlen.

Prüfung:

[28943,825,11746,16375,32425,19944,21826,15752,15342,3944,28436].sort(function(x, y) {
    r = '..toString(2).split(1).length';
    return eval(y + r + -x + r);
});

[16375, 15342, 32425, 19944, 11746, 28943, 28436, 15752, 3944, 21826, 825]
Vision
quelle
Könnten Sie bitte sagen, wie das ..funktioniert? Mein Verständnis ist , dass , wenn x = 5dann eval(x + r)wird eval(5..toString(2).match(/1/g).length)das ist, glaube ich, ungültig. Vielen Dank.
Gaurang Tandon
1
@ GaurangTandon Ist es nicht. Wie Sie wissen, ist in JS alles außer Literalen ein Objekt. Und Zahlen. Theoretisch (und praktisch) können Sie also Eigenschaften abrufen oder Methoden eines beliebigen Nicht-Literalen über die Punktnotation aufrufen, wie Sie dies tun 'string'.lengthoder tun [1,2,3].pop(). Bei Zahlen können Sie dasselbe tun, aber Sie sollten berücksichtigen, dass der Parser nach einem einzelnen Punkt nach einem Bruchteil der Zahl sucht, der einen Gleitkommawert erwartet (wie in 123.45). Wenn Sie eine ganze Zahl verwenden , sollten Sie „sagen“ den Parser , dass ein Bruchteil leer ist, einen zusätzlichen Punkt Einstellung bereits vor dem Adressieren: 123..method().
VisioN
1
Sie können zwei Bytes sparen, indem Sie die Nullen entfernen und den Rest als Dezimalzahl behandeln. Ersetzen match(/1/g).lengthdurch replace(/0/g,"").
DocMax
@VisioN Danke! Eine neue Sache gelernt.
Gaurang Tandon
1
a.sort(function(x,y){r='..toString(2).match(/1/g).length';return eval(y+r+-x+r)})
14 m²,
6

Mathematica 30

SortBy[#,-DigitCount[#,2,1]&]&

Verwendung:

SortBy[#,-DigitCount[#,2,1]&]&@
                           {19944,11746,15342,21826,825,28943,32425,16375,28436,3944,15752}

{16375, 15342, 32425, 11746, 19944, 28436, 28943, 3944, 15752, 825, 21826}

Dr. belisarius
quelle
6

k [15 Zeichen]

{x@|<+/'0b\:'x}

Beispiel 1

{x@|<+/'0b\:'x}19944, 11746, 15342, 21826, 825, 28943, 32425, 16375, 28436, 3944, 15752

16375 15342 32425 28436 28943 11746 19944 15752 3944 825 21826

Beispiel 2 (alle Zahlen sind 2 ^ n -1)

{x@|<{+/0b\:x}'x}3 7 15 31 63 127

127 63 31 15 7 3
Nyi
quelle
5

Mathematica 39

IntegerDigits[#,2] wandelt eine Zahl zur Basis 10 in eine Liste mit Einsen und Nullen um.

Tr summiert die Ziffern.

f@n_:=SortBy[n,-Tr@IntegerDigits[#,2]&]

Testfall

f[{19944, 11746, 15342, 21826, 825, 28943, 32425, 16375, 28436, 3944, 15752}]

{16375, 15342, 32425, 11746, 19944, 28436, 28943, 3944, 15752, 825, 21826}

DavidC
quelle
Ich habe die (ab?) Verwendung von Tr [] im Golfcode geliebt.
Michael Stern
5

Java 8 - 87/113 81/111 60/80 60/74/48 Zeichen

Dies ist kein vollständiges Java-Programm, sondern nur eine Funktion (um genau zu sein eine Methode).

Es wird davon ausgegangen, dass java.util.Listund java.lang.Long.bitCountimportiert werden, und hat 60 Zeichen:

void s(List<Long>a){a.sort((x,y)->bitCount(x)-bitCount(y));}

Wenn keine vorimportierten Sachen erlaubt sind, ist dies hier mit 74 Zeichen:

void s(java.util.List<Long>a){a.sort((x,y)->x.bitCount(x)-x.bitCount(y));}

Fügen Sie weitere 7 Zeichen hinzu, falls dies erforderlich sein sollte static.

[4 Jahre später] Oder wenn Sie es vorziehen, könnte es ein Lambda sein (danke @KevinCruijssen für den Vorschlag), mit 48 Bytes:

a->{a.sort((x,y)->x.bitCount(x)-x.bitCount(y));}
Victor Stafusa
quelle
Gibt es einen Grund, warum du das nicht kannst Integer.bitCount(x)<Integer.bitCount(y)?-1:1;? Benötigen Sie das -1,0,1Verhalten?
Justin
Ist es auch möglich, das <Integer>durch Leerzeichen zu ersetzen ?
Justin
Sie können auch verwenden Long, die etwas Platz sparen :)
RobAu
Also a.sort((x,y)->Long.bitCount(x)-Long.bitCount(y));
RobAu
1
@ KevinCruijssen Danke. Ich bin es so gewohnt, dass das Aufrufen einer statischen Methode mit einer variablen Instanz eine schlechte Praxis ist, die ich je vergessen habe, dass der Compiler das akzeptiert.
Victor Stafusa
4

Python 2.x - 65 Zeichen (Bytes)

print sorted(input(),key=lambda x:-sum(int(d)for d in bin(x)[2:]))

Das sind tatsächlich 66 Zeichen, 65, wenn wir es zu einer Funktion machen (dann brauchen Sie etwas, um es zu nennen, das lamer ist, um es zu präsentieren).

f=lambda a:sorted(a,key=lambda x:-sum(int(d)for d in bin(x)[2:]))

Demo in Bash / CMD:

echo [16, 10, 7, 255, 65536, 5] | python -c "print sorted(input(),key=lambda x:-sum(int(d)for d in bin(x)[2:]))"
Nick T
quelle
Sie können sum(int(d)for d in bin(x)[2:])zusum(map(int,bin(x)[2:]))
Elisha
1
oder sogar:print sorted(input(),key=lambda x:-bin(x).count('1'))
Elisha
4

Matlab, 34

Eingabe in 'a'

[~,i]=sort(-sum(dec2bin(a)'));a(i)

Funktioniert für nicht negative Zahlen.

fraktal
quelle
4

C - 85 Bytes (108 106 Bytes)

Portable Version auf GCC / Clang / wo __builtin_popcountimmer verfügbar (106 Bytes):

#define p-__builtin_popcount(
c(int*a,int*b){return p*b)-p*a);}
void s(int*n,int l){qsort(n,l,sizeof l,c);}

Ultrakondensierte, nicht tragbare, kaum funktionierende MSVC-Version (85 Byte):

#define p __popcnt
c(int*a,int*b){return p(*b)-p(*a);}
s(int*n,int l){qsort(n,l,4,c);}         /* or 8 as needed */

  • Die erste Zeile ist in der Byteanzahl enthalten #define, die anderen Zeilen sind nicht erforderlich.

  • Die aufzurufende Funktion entspricht s(array, length)den Spezifikationen.

  • Kann die sizeofin der portablen Version fest codieren , um weitere 7 Zeichen zu speichern, wie es einige andere C-Antworten taten. Ich bin mir nicht sicher, welches Modell in Bezug auf das Verhältnis von Länge und Nutzbarkeit am besten geeignet ist, entscheiden Sie.

Thomas
quelle
2
sizeof lSpeichert ein Byte. Das schrecklich Hässliche #define p-__builtin_popcount(kann helfen, ein anderes zu retten.
Ugoren
@ugoren Danke für die Tipps! Der Präprozessor ist so ein Hack, ich hatte keine Ahnung, dass so etwas möglich ist. Leider funktioniert es nicht mit MSVC, aber jedes Byte zählt!
Thomas
4

PowerShell v3, 61 58 53

$args|sort{while($_){if($_-band1){1};$_=$_-shr1}}-des

Der ScriptBlock für das Sort-ObjectCmdlet gibt für jede 1 in der binären Darstellung der Zahl ein Array mit Einsen zurück. Sort-Objectsortiert die Liste basierend auf der Länge des Arrays, das für jede Nummer zurückgegeben wird.

Ausführen:

script.ps1 15342 28943 16375 3944 11746 825 32425 28436 21826 15752 19944
Rynant
quelle
es ist Arbeit. Wie es funktioniert? Wie die Magie '.' kommt zu "basierend auf der Länge des Arrays"?
mazzy
Das '.' Führt den nachfolgenden Scriptblock aus. Der Befehl sort sortiert basierend auf der Ausgabe des äußeren Skriptblocks. Mir ist jetzt klar, dass der innere Scriptblock nicht benötigt wird. siehe bearbeiten
Rynant
$f={ist überflüssig, while-> for, -band1-> %2, -des-> -dund andere Golf-Tricks. Es ist klar. Können Sie erklären, wie man arbeitet $args|sort{@(1,1,...,1)}? Es ist Arbeit! Wie vergleicht die Sortierung Arrays ohne explizite .Count? Wo kann man darüber lesen? Vielen Dank!
mazzy
1
@mazzy, du hast recht, ich habe jetzt die redundanten Bits entfernt. Dies ist die Standardsortierung des Cmdlets "Sort-Object". Siehe: help Sort-Object -Parameter propertyIch weiß nicht, wo die Standardsortiereigenschaft für Typen definiert ist, aber für Arrays ist sie Count oder Length.
Rynant
Gut geraten. Aber $args|sort{while($_){if($_-band1){$_};$_=$_-shr1}}-desgibt ein falsches Ergebnis. Deshalb ist es nicht Count. Es ist sehr interessant. Danke noch einmal.
mazzy
3

ECMAScript 6, 61

Angenommen, zist die Eingabe

z.sort((a,b)=>{c=d=e=0;while(++c<32)d+=a>>c&1,e+=b>>c&1},e-d)

Testdaten

[28943,825,11746,16375,32425,19944,21826,15752,15342,3944,28436].sort(
    (a,b)=>{
        c=d=e=0;
        while(++c<32)
            d+=a>>c&1,e+=b>>c&1
    },e-d
)

[16375, 15342, 32425, 11746, 19944, 28436, 28943, 15752, 3944, 21826, 825]

Danke, Zahnbürste für die kürzere Lösung.

Danny
quelle
1
Ich habe gerade Ihre Lösung ausprobiert, aber es hat nicht funktioniert. Die Zahlen werden nicht sortiert.
Zahnbürste
@ Zahnbürste woops. Vielen Dank für den Fang, sollte jetzt funktionieren.
Danny
Gute Arbeit! Ich mag das.
Zahnbürste
1
Nur 61 Bytes: z.sort((a,b)=>{c=d=e=0;while(++c<32)d+=a>>c&1,e+=b>>c&1},e-d)(und danke für die Gegenstimme).
Zahnbürste
1
Meine Lösung hat jetzt die gleiche Größe wie Ihre!
Zahnbürste
3

R , 132 96 94 88 84 75 73 53 51 Bytes

-20 dank J.Does Implementierung -2 mehr dank Giuseppe

function(x)x[order(colSums(sapply(x,intToBits)<1))]

Mein ursprünglicher Beitrag:

pryr::f(rev(x[order(sapply(x,function(y)sum(as.double(intToBits(y)))))]))

Probieren Sie es online!

Ich habe verschiedene Methoden ausprobiert, bevor ich zu diesem Ergebnis kam.

Matrix-Methode: Erstellt eine zweispaltige Matrix, eine Spalte mit dem Eingabevektor, eine aus der Summe der Binärdarstellung, und sortiert dann nach der Summe der Binärdarstellungen.

function(x){m=matrix(c(x,colSums(sapply(x,function(y){as.integer(intToBits(y))}))),nc=2,nr=length(x));m[order(m[,2],decreasing=T),]}

Nicht-Matrix: Es wurde erkannt, dass ich die Matrixfunktion wegwerfen und stattdessen einen Vektor von Binärwerten erstellen, diese summieren, ordnen und dann die geordneten Werte verwenden könnte, um den Eingabevektor neu zu ordnen.

function(x){m=colSums(sapply(x,function(y){as.integer(intToBits(y))}));x[order(m,decreasing=T)]}

Kleinere Änderungen

function(x){m=colSums(sapply(x,function(y)as.double(intToBits(y))));x[order(m,decreasing=T)]}

Kleinere Änderungen Konvertieren des gesamten Objekts in eine Codezeile anstelle von zwei durch ein Semikolon getrennten.

function(x)x[order(colSums(sapply(x,function(y)as.double(intToBits(y)))),decreasing=T)]

Summenmethode Anstatt die Spalten mit der colSumsvon erstellten binären Matrix hinzuzufügen sapply, habe ich die Elemente in der Spalte vor sapply"Fertig" hinzugefügt .

function(x)x[order(sapply(x,function(y)sum(as.double(intToBits(y)))),decreasing=T)]

Abnahme auf Umkehr Ich wollte eigentlich die Abnahme verkürzen, aber R quäkelt mich an, wenn ich versuche, decreasingdie orderFunktion zu verkürzen , was notwendig war, um die gewünschte Reihenfolge als orderStandard zu erreichen. Dann erinnerte ich mich an die revFunktion zum Umkehren eines Vektors. EUREKA !!! Die letzte Änderung in der endgültigen Lösung bestand functiondarin pryr::f, 2 weitere Bytes einzusparen

function(x)rev(x[order(sapply(x,function(y)sum(as.double(intToBits(y)))))])
Sumner18
quelle
1
53 Bytes
J.Doe
1
51 Bytes mehr als bei J.Does exzellentem Golf!
Giuseppe
2

Haskell, 123C

import Data.List
import Data.Ord
b 0=[]
b n=mod n 2:b(div n 2)
c n=(n,(sum.b)n)
q x=map fst$sortBy(comparing snd)(map c x)

Dies ist der erste Weg, den ich mir überlegt habe, aber ich wette, es gibt einen besseren Weg, dies zu tun. Wenn jemand eine Möglichkeit zum Golfen von Haskell-Importen kennt, wäre ich sehr interessiert, das zu hören.

Beispiel

*Main> q [4,2,15,5,3]
[4,2,5,3,15]
*Main> q [7,0,2]
[0,2,7]

Ungolfed version (mit erklärungen)

import Data.List
import Data.Ord

-- Converts an integer into a list of its bits
binary 0 = []
binary n = mod n 2 : binary (div n 2)

-- Creates a tuple where the first element is the number and the second element
-- is the sum of its bits.
createTuple n = (n, (sum.binary) n)

-- 1) Turns the list x into tuples
-- 2) Sorts the list of tuples by its second element (bit sum)
-- 3) Pulls the original number out of each tuple
question x = map fst $ sortBy (comparing snd) (map createTuple x)
danmcardle
quelle
Wäre es hilfreich, die Infixnotation für mod, zu verwenden n`mod`2? Es hat die gleiche Priorität wie Multiplikation und Division.
John Dvorak
Das wäre aus Golfgründen nicht allzu hilfreich, soweit ich das beurteilen kann. Ich würde zwei Felder verlieren, aber zwei Backticks gewinnen, oder?
Danmcardle
importieren Sie Data.List; importieren Sie Data.Ord; importieren Sie Data.Bits; q = sortBy (Vergleichen von popCount) - 80C - oder importieren Sie Data.List; importieren Sie Data.Ord; b 0 = 0; bn = (mod n 2) + b (div n 2); q = sortBy (vergleiche b) - 86C
bazzargh
Ich habe versucht, Importe gänzlich zu vermeiden. Das Beste, was ich erreichen konnte, war 87 ° C durch Golf-Quicksort: b 0 = 0; b n = mod n 2 + b (div n 2); q [] = []; q (a: c) = f ( (ba>). b) c ++ a: f ((ba <=). b) c; f = (q). filter
bazzargh
2

Kaffeeskript (94)

Lesbarer Code (212):

sort_by_ones_count = (numbers) ->
  numbers.sort (a, b) ->
    a1 = a.toString(2).match(/1/g).length
    b1 = b.toString(2).match(/1/g).length
    if a1 == b1
      0
    else if a1 > b1
      1
    else
      -1

console.log sort_by_ones_count [825, 3944, 11746, 15342, 15752, 16375, 19944, 21826, 28436, 28943, 32425]

Optimiert (213):

count_ones = (number) -> number.toString(2).match(/1/g).length
sort_by_ones_count = (numbers) -> numbers.sort (a, b) ->
  a1 = count_ones(a)
  b1 = count_ones(b)
  if a1 == b1 then 0 else if a1 > b1 then 1 else -1

Verschleierung (147):

c = (n) -> n.toString(2).match(/1/g).length
s = (n) -> n.sort (a, b) ->
  a1 = c(a)
  b1 = c(b)
  if a1 == b1 then 0 else if a1 > b1 then 1 else -1

Ternäre Operatoren sind zu lang (129):

c = (n) -> n.toString(2).match(/1/g).length
s = (n) -> n.sort (a, b) ->
  a1 = c(a)
  b1 = c(b)
  (0+(a1!=b1))*(-1)**(0+(a1>=b1))

Noch zu lange, hör auf zu wirken (121):

c = (n) -> n.toString(2).match(/1/g).length
s = (n) -> n.sort (a, b) ->
  a1 = c(a)
  b1 = c(b)
  (-1)**(a1>=b1)*(a1!=b1)

Finale (94):

c=(n)->n.toString(2).match(/1/g).length
s=(n)->n.sort((a, b)->(-1)**(c(a)>=c(b))*(c(a)!=c(b)))
Aaron J
quelle
2

Smalltalk (Smalltalk / X), 36 (oder vielleicht 24)

Eingabe in a; destruktiv sortiert in einem:

a sort:[:a :b|a bitCount>b bitCount]

funktionale Version: gibt ein neues sortiertes Array zurück:

a sorted:[:a :b|a bitCount>b bitCount]

Es gibt sogar eine kürzere Variante (Übergabe des Namens oder der Funktion als Argument) in 24 Zeichen. Aber (seufz) es wird zuletzt am höchsten sortiert. Soweit ich verstanden habe, wurde dies nicht verlangt, daher nehme ich das nicht als Golf-Score:

a sortBySelector:#bitCount
blabla999
quelle
2

PHP 5.4+ 131

Ich weiß nicht einmal, warum ich mich mit PHP beschäftige, in diesem Fall:

<?unset($argv[0]);usort($argv,function($a,$b){return strcmp(strtr(decbin($b),[0=>'']),strtr(decbin($a),[0=>'']));});print_r($argv);

Verwendung:

> php -f sortbybinaryones.php 15342 28943 16375 3944 11746 825 32425 28436 21826 15752 19944
Array
(
    [0] => 16375
    [1] => 15342
    [2] => 32425
    [3] => 28436
    [4] => 19944
    [5] => 11746
    [6] => 28943
    [7] => 3944
    [8] => 15752
    [9] => 825
    [10] => 21826
)
Anständiger Dabbler
quelle
Nun
2

Scala, 58

def c(l:List[Int])=l.sortBy(-_.toBinaryString.count(_>48))
ValarDohaeris
quelle
2

DFSORT (IBM Mainframe-Sortierprodukt) 288 (jede Quellzeile besteht aus 72 Zeichen und muss an Position 1 ein Leerzeichen enthalten.)

 INREC IFTHEN=(WHEN=INIT,BUILD=(1,2,1,2,TRAN=BIT)), 
       IFTHEN=(WHEN=INIT,FINDREP=(STARTPOS=3,INOUT=(C'0',C'')))
 SORT FIELDS=(3,16,CH,D) 
 OUTREC BUILD=(1,2)

Nur zum Spaß und ohne Mathematik.

Nimmt eine Datei (kann von einem Programm ausgeführt werden, das ein "Array" verwendet) mit den ganzen Zahlen. Vor dem Sortieren werden die Ganzzahlen in Bits (in einem 16-stelligen Feld) übersetzt. Dann ändert sich die 0 in den Bits zu nichts. SORT Absteigend vom Ergebnis der geänderten Bits. Erstellt die sortierte Datei nur mit den ganzen Zahlen.

Bill Woodger
quelle
2

C

void main()
{
 int a[]={7,6,15,16};
 int b,i,n=0;
 for(i=0;i<4;i++)
 {  for(b=0,n=0;b<=sizeof(int);b++)
      (a[i]&(1<<b))?n++:n;   
    a[i]=n;
 }
 for (i = 1; i < 4; i++) 
  {   int tmp = a[i];
      for (n = i; n >= 1 && tmp < a[n-1]; n--)
         a[n] = a[n-1];
      a[n] = tmp;
  }    
}
Venkatesh K
quelle
4
Da dies ein Code-Golf-Wettbewerb ist, sollten Sie versuchen, Ihren Code zu verkürzen.
Timtech
2

C #, 88 89

int[] b(int[] a){return a.OrderBy(i=>-Convert.ToString(i,2).Count(c=>c=='1')).ToArray();}

Bearbeiten: absteigende Reihenfolge fügt ein Zeichen hinzu.

Rik
quelle
2

Javascript 84

Inspiriert von anderen Javascript-Antworten, aber ohne eval und Regex.

var r=(x)=>(+x).toString(2).split('').reduce((p,c)=>p+ +c)
[28943,825,11746,16375,32425,19944,21826,15752,15342,3944,28436].sort((x,y)=>r(x)-r(y));
vittore
quelle
Die Frage ist Code Golf. Bitte versuchen Sie, Ihren Code zu "golfen": Entfernen Sie unnötige Leerzeichen und versuchen Sie, Ihren Code so klein wie möglich zu halten. Fügen Sie Ihrer Antwort auch eine Zeichenanzahl hinzu.
ProgramFOX
2

Javascript (82)

a.sort(function(b,c){q=0;while(b|c){b%2?c%2?0:q++:c%2?q--:0;b>>=1;c>>=1}return q})
mowwwalker
quelle
2

Nachschrift, 126

Da die Liste der Werte, nach denen wir sortieren, im Voraus bekannt und sehr begrenzt ist (32), kann diese Aufgabe auch dann problemlos durchgeführt werden, wenn keine Sortierfunktion integriert ist, indem übereinstimmende Werte für 1..32 ausgewählt werden. (Ist es O (32n)? Wahrscheinlich).

Die Prozedur erwartet das Array auf dem Stack und gibt das sortierte Array zurück.

/sort_by_bit_count {
    [ exch
    32 -1 1 {
        1 index
        {
            dup 2 32 string cvrs
            0 exch
            {48 sub add} forall
            2 index eq 
            {3 1 roll} {pop} ifelse
        } forall
        pop
    } for
    pop ]
} def

Oder rituell von Leerzeichen und Lesbarkeit befreit:

/s{[exch 32 -1 1{1 index{dup 2 32 string cvrs 0 exch{48 sub add}forall 2 index eq{3 1 roll}{pop}ifelse}forall pop}for pop]}def

Wenn es gespeichert ist, bits.pskann es folgendermaßen verwendet werden:

gs -q -dBATCH bits.ps -c '[(%stdin)(r)file 1000 string readline pop cvx exec] s =='
825 3944 11746 15342 15752 16375 19944 21826 28436 28943 32425
[16375 15342 32425 11746 19944 28436 28943 3944 15752 825 21826]

Ich denke, es ist effektiv dasselbe wie dieses Perl (es gibt hier auch noch kein Perl):

sub f{map{$i=$_;grep{$i==(()=(sprintf'%b',$_)=~/1/g)}@_}reverse 1..32}

Obwohl , dass , im Gegensatz zu Postscript, kann leicht golfed werden:

sub f{sort{j($b)-j($a)}@_}sub j{$_=sprintf'%b',@_;()=/1/g}
user2846289
quelle
Nachsatz! Meine erste Liebe, meine Lieblingssprache aller Zeiten! Es ist schön zu sehen, dass ein anderer an die Eine Wahre Programmiersprache glaubt.
AJMansfield
2

C - 124 111

Implementiert als Methode und unter Verwendung der Standardbibliothek für die Sortierung. Ein Zeiger auf das Array und die Größe sollten als Parameter übergeben werden. Dies funktioniert nur auf Systemen mit 32-Bit-Zeigern. Auf 64-Bit-Systemen müssen einige Zeichen für die Angabe von Zeigerdefinitionen verwendet werden.

Einzug für die Lesbarkeit

c(int*a,int*b){
    int d,e,i;
    for(d=e=i=0;i-32;){
        d+=*a>>i&1;e+=*b>>i++&1;
    }
    return d>e?-1:d<e;
}
o(r,s){qsort(r,s,4,c);}

Beispielanruf:

main() {
    static int a[] ={1, 2, 3, 4, 5, 6, 7, 8, 9};
    o(a, 9);
}
Allbeert
quelle
2

Java 8: 144

static void main(String[]a){System.out.print(Stream.of(a).mapToInt(Integer::decode).sorted(Comparable.comparing(Integer::bitCount)).toArray());}

In erweiterter Form:

static void main(String[] args){
    System.out.print(
        Stream.of(args).mapToInt(Integer::decode)
              .sorted(Comparable.comparing(Integer::bitCount))
              .toArray()
        );
}

Wie Sie sehen können, funktioniert dies, indem Sie das argsin ein Stream<String>konvertieren und dann Stream<Integer>mit der Integer::decodeFunktionsreferenz in ein konvertieren (kürzer alsparseInt oder)valueOf ) und anschließend nach sortierenInteger::bitCount , dann in ein Array einfügen und es ausdrucken.

Streams machen alles einfacher.

AJMansfield
quelle