Cel
Napisz funkcję lub program posortuj tablicę liczb całkowitych w porządku malejącym według liczby 1 obecnych w ich reprezentacji binarnej. Nie jest wymagany żaden warunek sortowania wtórnego.
Przykład posortowanej listy
(przy użyciu 16-bitowych liczb całkowitych)
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
Wkład
Tablica 32-bitowych liczb całkowitych.
Wydajność
Tablica tych samych liczb całkowitych posortowana zgodnie z opisem.
Punktacja
Jest to kod golfowy dla najmniejszej liczby bajtów do wyboru w ciągu tygodnia.
Odpowiedzi:
J (11)
Ta funkcja pobiera listę:
Jeśli chcesz nadać mu nazwę, kosztuje to jedną dodatkową postać:
Wyjaśnienie:
\:
: sortuj w dół na+/
: suma"1
: każdy rząd#:
: reprezentacja binarnaźródło
\:1#.#:
który oszczędza kilka bajtów.JavaScript, 39
Aktualizacja: teraz krótsza niż Ruby.
40
Wyjaśnienie:
q jest funkcją rekurencyjną. Jeśli x lub y są
x-y
równe 0, zwraca (liczba ujemna, jeśli x jest równa zero, lub liczba dodatnia, jeśli y wynosi zero). W przeciwnym razie usuwa najniższy bit (x&x-1
) zxiy i powtarza się.Poprzednia wersja (42)
źródło
~y
działać zamiast-!y
?!x|-!y
staje się niezerowe.~
tak naprawdę nie pasuje, ponieważ jest niezerowy dla wielu danych wejściowych (w tym zero)Rubinowy 41
Test:
źródło
Python 3 (44):
źródło
Common Lisp, 35
logcount
zwraca liczbę bitów „on” w liczbie. Do listyl
mamy:Jako samodzielna funkcja, na której liczę bajt, liczę:
źródło
Python 3,
90777267 znaków.Nasze rozwiązanie pobiera dane z wiersza poleceń i wypisuje liczbę w porządku malejącym (67 znaków) lub rosnąco (66).
Kolejność malejąca
Dzięki @daniero za sugestię użycia minus w liczeniu 1 do odwrócenia go, zamiast używania wycinka do odwrócenia tablicy na końcu! To skutecznie uratowało 5 znaków.
Tylko w celu opublikowania go, rosnąca wersja zamówienia (która była pierwszą, którą stworzyliśmy) zabrałaby jedną postać mniej.
Porządek rosnący :
Dzięki @Bakuriu na klucz = lambda X ... sugestii. ;RE
źródło
0
zawsze będzie to częścią twojej produkcji; To nie jest poprawneraw_input()
i upuścić niektórych postaci?[]
wnętrzesorted
. Również wynikiem tego programu jest liczba 1s w liczbach na wejściu posortowanych, ale powinieneś wypisać liczbę otrzymaną na wejściu, posortowaną według liczby1
s. Coś w stylu:print(sorted(input().split(), key=lambda x:bin(int(x)).count('1')))
byłoby poprawne.JavaScript [76 bajtów]
gdzie
a
jest tablicą wprowadzania liczb.Test:
źródło
..
działa? Rozumiem, że jeślix = 5
wtedy stanieeval(x + r)
się,eval(5..toString(2).match(/1/g).length)
co, jak sądzę, jest nieważne. Dzięki.'string'.length
lub[1,2,3].pop()
. W przypadku liczb możesz zrobić to samo, ale należy pamiętać, że po pojedynczej kropce analizator będzie szukał ułamkowej części liczby oczekującej wartości zmiennoprzecinkowej (jak w123.45
). W przypadku korzystania z całkowitą należy „powiedzieć” parser że część ułamkowa jest pusty, wyznaczając dodatkowy kropkę przed zajęcie nieruchomości:123..method()
.match(/1/g).length
sięreplace(/0/g,"")
.a.sort(function(x,y){r='..toString(2).match(/1/g).length';return eval(y+r+-x+r)})
Mathematica 30
Stosowanie:
źródło
k [15 znaków]
Przykład 1
Przykład 2 (wszystkie liczby to 2 ^ n -1)
źródło
Mathematica 39
IntegerDigits[#,2]
konwertuje liczbę podstawową 10 na listę 1 i 0.Tr
sumuje cyfry.Przypadek testowy
źródło
Java 8 -
87/11381/11160/8060/74/48 znakówTo nie jest kompletny program Java, to tylko funkcja (a dokładniej metoda).
Zakłada, że
java.util.List
ijava.lang.Long.bitCount
są importowane, i ma 60 znaków:Jeśli nie są dozwolone żadne elementy wcześniej zaimportowane, tutaj są 74 znaki:
Dodaj więcej 7 znaków, jeśli byłoby to konieczne
static
.[4 lata później] Lub jeśli wolisz, może to być lambda (dzięki @KevinCruijssen za sugestię), z 48 bajtami:
źródło
Integer.bitCount(x)<Integer.bitCount(y)?-1:1;
? Czy potrzebujesz-1,0,1
zachowania?<Integer>
spacją?Long
, aby zaoszczędzić trochę miejsca :)a.sort((x,y)->Long.bitCount(x)-Long.bitCount(y));
Python 2.x - 65 znaków (bajtów)
To właściwie 66 znaków, 65 jeśli sprawimy, że będzie to funkcja (wtedy potrzebujesz czegoś, co można nazwać lamerem).
Demo w Bash / CMD:
źródło
sum(int(d)for d in bin(x)[2:])
nasum(map(int,bin(x)[2:]))
print sorted(input(),key=lambda x:-bin(x).count('1'))
Matlab, 34
Wpisz „a”
Działa dla liczb nieujemnych.
źródło
C - 85 bajtów (
108106 bajtów)Wersja przenośna na GCC / Clang / gdziekolwiek
__builtin_popcount
jest dostępna (106 bajtów):Ultra-skondensowana, nieprzenośna, ledwo funkcjonalna wersja tylko dla MSVC (85 bajtów):
Pierwsza nowa linia zawarta w liczbie bajtów z powodu
#define
innych nie jest konieczna.Funkcja wywoływania jest
s(array, length)
zgodna ze specyfikacjami.Można
sizeof
zapisać kod w wersji przenośnej, aby zapisać kolejne 7 znaków, podobnie jak kilka innych odpowiedzi w języku C. Nie jestem pewien, który z nich jest najbardziej wart pod względem stosunku długości do użyteczności, decydujesz.źródło
sizeof l
zapisuje bajt. Okropnie brzydka#define p-__builtin_popcount(
może pomóc uratować kolejną.PowerShell v3,
615853ScriptBlock dla polecenia
Sort-Object
cmdlet zwraca tablicę 1 dla każdego 1 w binarnej reprezentacji liczby.Sort-Object
sortuje listę na podstawie długości tablicy zwracanej dla każdej liczby.Wykonać:
źródło
$f={
jest zbędny,while
->for
,-band1
->%2
,-des
->-d
i inne sztuczki golfowe. To jest czyste. Czy możesz wyjaśnić, jak pracować$args|sort{@(1,1,...,1)}
? To jest praca! Jak sortowanie porównuje tablice bez wyraźnego.Count
? gdzie o tym przeczytać? Dzięki!help Sort-Object -Parameter property
Nie wiem, gdzie jest zdefiniowana domyślna właściwość sortowania dla typów, ale dla tablic jest to Count lub Length.$args|sort{while($_){if($_-band1){$_};$_=$_-shr1}}-des
daje zły wynik. Dlatego tak nie jestCount
. To bardzo interesujące. Dzięki jeszcze raz.ECMAScript 6, 61
Zakłada
z
się, że dane wejścioweDane testowe
Dzięki, szczoteczka do zębów za krótsze rozwiązanie.
źródło
z.sort((a,b)=>{c=d=e=0;while(++c<32)d+=a>>c&1,e+=b>>c&1},e-d)
(and thanks for the up-vote).R,
1329694888475735351 bytes-20 thanks to J.Doe's implementation -2 more thanks to Giuseppe
My original post:
Try it online!
I tried several different methods before I got down to this result.
Matrix Method: Created a two column matrix, one column with the input vector, one of the sum of the binary representation, then I sorted on the sum of binary.
Non-Matrix: Realized I could toss out the matrix function and instead create a vector of binary values, sum them, order them, then use the ordered values to reorder the input vector.
Minor Changes
More Minor Changes Converting entire thing to one line of code instead of two separated by a semicolon.
Sum Method Instead of adding the columns with
colSums
of the binary matrix created bysapply
, I added the elements in the column beforesapply
"finished."Decreasing to Rev I really wanted to shorten decreasing, but R squawks at me if I try to shorten
decreasing
in theorder
function, which was necessary to get the order desired asorder
defaults to increasing, then I remembered therev
function to reverse a vector. EUREKA!!! The last change in the final solution wasfunction
topryr::f
to save 2 more bytesźródło
Haskell, 123C
This is the first way I thought of solving this, but I bet there's a better way to do it. Also, if anyone knows of a way of golfing Haskell imports, I would be very interested to hear it.
Example
Ungolfed version (with explanations)
źródło
mod
,n`mod`2
? It has the same precedence as multiplication and division.CoffeeScript (94)
Readable code (212):
Optimized (213):
Obfuscating (147):
Ternary operators are excessively long (129):
Too long yet, stop casting (121):
Final (94):
źródło
Smalltalk (Smalltalk/X), 36 (or maybe 24)
input in a; destructively sorts in a:
functional version: returns a new sorted array:
there is even a shorter variant (passing the name or the function as argument) in 24 chars. But (sigh) it will sort highest last. As I understood, this was not asked for, so I don't take that as golf score:
źródło
PHP 5.4+ 131
I don't even know why I bother with PHP, in this case:
Usage:
źródło
Scala, 58
źródło
DFSORT (IBM Mainframe sorting product) 288 (each source line is 72 characters, must have space in position one)
Just for fun, and no mathematics.
Takes a file (could be executed from a program which used an "array") with the integers. Before sorting, it translates the integers to bits (in a 16-character field). Then changes the 0s in the bits to nothing. SORT Descending on the result of the changed bits. Creates the sorted file with just the integers.
źródło
C
źródło
C#,
8889Edit: descending order adds a character.
źródło
Javascript 84
Inspired by other javascript answers, but without eval and regex.
źródło
Javascript (82)
źródło
Postscript, 126
Because list of values by which we sort is known beforehand and very limited (32), this task can be easily done even if there's no built-in for sorting, by picking matching values for 1..32. (Is it O(32n)? Probably).
Procedure expects array on stack and returns 'sorted' array.
Or, ritually stripped of white space and readability:
Then, if saved to
bits.ps
it can be used like this:I think it effectively is the same as this Perl (there's yet no Perl here, too):
Though that, unlike Postscript, can be easily golfed:
źródło
C -
124111Implemented as a method and using the standard library for the sorting. A pointer to the array and the size should be passed as parameters. This will only work on systems with 32-bit pointers. On 64-bit systems, some characters have to be spent specifying pointer definitions.
Indentation for readability
Sample call:
źródło
Java 8: 144
In expanded form:
As you can see, this works by converting the
args
to aStream<String>
, then converting to aStream<Integer>
with theInteger::decode
function reference (shorter thanparseInt
orvalueOf
), and then sorting byInteger::bitCount
, then putting it in an array, and printing it out.Streams make everything easier.
źródło