이진수 1의 수로 숫자 정렬


35

함수 또는 프로그램을 작성하여 2 진 표현에있는 1의 수만큼 내림차순으로 정수 배열을 정렬하십시오. 보조 정렬 조건이 필요하지 않습니다.

정렬 된 목록 예

(16 비트 정수 사용)

  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

입력

32 비트 정수의 배열입니다.

산출

설명에 따라 정렬 된 동일한 정수 배열.

채점

1 주일에 최소 바이트 수를 선택하는 코드 골프입니다.


2
명시 적으로 언급하지는 않았지만 내림차순이어야합니까?
Nick T

3
당신 말이 맞아요 다른 모든 사람들은 내림차순으로 갔으므로 우리는 그것을 고수 할 것입니다.
Hand-E-Food

최종 숫자 (21826)가 잘못 변환 된 것 같습니다. 내 Windows 계산기에 따르면 0010 1010 1100 0010이 아니라 0101 0101 0100 0010입니다.
Nzall

수정 해 주셔서 감사합니다. Excel을 사용하여 숫자를 이진으로 변환하기 때문에 21826에 대해 이상합니다. 나는 지금 나머지에 대해 궁금합니다.
Hand-E-Food

어셈블리 및 popcount 명령을 사용하는 솔루션?
eiennohito

답변:


27

J (11)

(\:+/"1@#:)

이것은 목록을 취하는 함수입니다.

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

이름을 지정하려면 추가 문자 하나가 필요합니다.

     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

설명:

  • \:: 아래쪽으로 정렬
  • +/: 의 합
  • "1: 각 행
  • #:: 이진 표현

5
@ ak82는 APL의 ASCII 버전입니다
존 드보락

3
@JanDvorak 종류; jsoftware.com/papers/j4apl.htm (언어 섹션 참조) 이 상당히 변경되었습니다 .
제임스 우드

3
\:1#.#:몇 바이트를 절약하는 것도 있습니다 .
마일

17

자바 스크립트, 39

업데이트 : 이제 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)

설명:

q는 재귀 함수입니다. x 또는 y가 0이면 반환합니다 x-y(x가 0이면 음수, y가 0이면 양수). 그렇지 않으면 x&x-1x와 y에서 가장 낮은 비트 ( )를 제거 하고 반복합니다.

이전 버전 (42)

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

이것은 정말 영리합니다! 나는 아직도 내 마음을 감싸려고 노력하고 있습니다.
mowwwalker

~y대신 작동하지 않아야 -!y합니까?
칫솔

@toothbrush 종료 조건은 x 또는 y가 0이며,이 경우 표현식 !x|-!y은 0이 아닙니다. ~이 (0을 포함) 많은 입력에 대해 0이 아닌 이후 정말에 맞지 않는
복사

보조 정렬이 필요한 경우 누구든지 도와 줄 수 있습니까 ?
Manubhargav

15

루비 41

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

테스트:

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]

2
단순한. 이해할 수 있는. 짧은. 이 솔루션의 장점.
Pierre Arlaud

8

파이썬 3 (44) :

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

8

커먼 리스프, 35

logcount숫자에서 'on'비트 수를 반환합니다. 목록의 l경우 다음이 있습니다.

(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)

독립형 함수로서 바이트 수를 기반으로하는 것은 다음과 같습니다.

(lambda(l)(sort l'> :key'logcount))

7

파이썬 3, 90 77 72 67 자

우리의 솔루션은 명령 행에서 입력을 받아 내림차순 (67 자) 또는 오름차순 (66)으로 숫자를 인쇄합니다.

내림차순

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

@daniero 덕분에 슬라이스를 사용하여 마지막에 배열을 뒤집는 대신 1의 카운트에서 빼기를 사용하여 반대로하는 것이 좋습니다! 이것은 효과적으로 5자를 저장했습니다.

그것을 게시하기 위해 오름차순 주문 버전 (우리가 만든 첫 번째 버전)은 한 문자를 덜 사용합니다.

오름차순 :

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

key = lambda x… 제안에 대한 @Bakuriu 에게 감사드립니다 . ;디


따라서 0항상 출력의 일부가됩니다. 맞지 않습니다.
daniero

질문에 값을 삽입하는 것을 금지하는 질문이 없습니다.
Jetlef

" 설명 된대로 정렬 된 동일한 정수 배열 ." ;) 게다가, 왜 raw_input()일부 문자를 사용 하고 삭제 하지 않습니까?
daniero

1
@daniero가 해결했습니다. Python 3으로 전환하면 (Python 2 답변이 이미 존재하고 독창적이어야합니다!) input () 을 사용 하여 두 문자를 절약 할 수 있습니다 (print ()에 필요한 대괄호로 인해 두 문자가 추가됩니다 ).
Jetlef

[]안쪽을 떨어 뜨릴 수 있습니다 sorted. 또한이 프로그램의 출력은 정렬 된 입력 숫자의 1 수이지만 입력에서받은 숫자를 1s 의 수를 사용하여 정렬하여 출력해야합니다 . 같은 것 : print(sorted(input().split(), key=lambda x:bin(int(x)).count('1')))맞을 것입니다.
Bakuriu

7

자바 스크립트 [76 바이트]

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

a숫자의 입력 배열은 어디 입니까?

테스트:

[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]

어떻게 ..작동 하는지 알려 주 시겠습니까? 나의 이해는 경우이다 x = 5후가 eval(x + r)된다 eval(5..toString(2).match(/1/g).length), 이는 내가 잘못된, 가정합니다. 감사.
Gaurang Tandon

1
@GaurangTandon 아닙니다. 아시다시피 JS에서 리터럴을 제외한 모든 것은 객체입니다. 그리고 숫자. 당신이 그래서 이론적으로 (실제적으로) 당신은 속성이나 이외의 문자를 통해 점 표기법의 호출 방법을 얻을 수 있습니다 'string'.length또는 [1,2,3].pop(). 숫자의 경우 동일한 작업을 수행 할 수 있지만 단일 점 뒤에 파서는 부동 소수점 값 ()을 기대하는 숫자의 소수 부분을 찾습니다 123.45. 정수를 사용하는 경우 분수 부분이 비어 있음을 파서에 알리고 속성을 지정하기 전에 추가 점을 설정해야합니다 123..method().
VisioN

1
0을 제거하고 나머지는 10 진수로 처리하여 2 바이트를 절약 할 수 있습니다. 교체 match(/1/g).length와 함께 replace(/0/g,"").
DocMax

@VisioN 감사합니다! 새로운 것을 배웠습니다.
Gaurang Tandon

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

6

매스 매 티카 30

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

용법:

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}


6

k [15 자리]

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

실시 예 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

예 2 (모든 숫자는 2 ^ n -1 임)

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

127 63 31 15 7 3

5

매스 매 티카 39

IntegerDigits[#,2] 밑이 10 인 숫자를 1과 0의 목록으로 변환합니다.

Tr 숫자를 합산합니다.

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

테스트 사례

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

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


골프 코드에서 Tr []의 사용을 좋아했습니다.
Michael Stern

5

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

이것은 완전한 Java 프로그램이 아니며 단지 함수 (정확한 방법)입니다.

그것은 그 가정 java.util.Listjava.lang.Long.bitCount수입, 60 개 문자가 :

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

사전 수입품이 허용되지 않는 경우 여기에는 74 자입니다.

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

필요한 경우 7자를 더 추가하십시오 static.

[4 년 후] 또는 원하는 경우 48 바이트의 람다 (@KevinCruijssen 덕분에 제안) 일 수 있습니다.

a->{a.sort((x,y)->x.bitCount(x)-x.bitCount(y));}

당신이 할 수없는 이유는 Integer.bitCount(x)<Integer.bitCount(y)?-1:1;무엇입니까? -1,0,1행동 이 필요 합니까?
Justin

또한 <Integer>공백 으로 바꿀 수 있습니까?
Justin

Long공간을 절약하는을 사용할 수도 있습니다 . :
RobAu

또한 a.sort((x,y)->Long.bitCount(x)-Long.bitCount(y));
RobAu

1
@KevinCruijssen 감사합니다. 정적 인스턴스를 호출하기 위해 변수 인스턴스를 사용하는 것은 컴파일러가 그것을 받아들이는 것을 잊어 버린 나쁜 습관입니다.
Victor Stafusa

4

Python 2.x-65 자 (바이트)

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

그것은 실제로 66 문자, 우리가 함수로 만들면 65입니다 (그런 다음 제시하기 위해 호출 할 것이 필요합니다).

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

배쉬 / 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:]))"

당신은 변경할 수 있습니다 sum(int(d)for d in bin(x)[2:])sum(map(int,bin(x)[2:]))
엘리사

1
print sorted(input(),key=lambda x:-bin(x).count('1'))
엘리사

4

MATLAB, 34

'a'로 입력

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

음수가 아닌 숫자에 적용됩니다.


4

C-85 바이트 (108 106 바이트)

__builtin_popcount사용 가능한 모든 GCC / Clang / Portable 버전 (106 바이트) :

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

매우 압축되고 이식성이없고 간신히 작동하는 MSVC 전용 버전 (85 바이트) :

#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 */

  • 로 인해 바이트 수에 포함 된 첫 번째 줄 바꿈 #define은 필요하지 않습니다.

  • 호출하는 기능은 s(array, length)사양에 따릅니다.

  • sizeof다른 C 답변과 마찬가지로 휴대용 버전으로 하드 코드를 작성하여 다른 7자를 저장할 수 있습니다. 길이 사용률 측면에서 어느 것이 가장 가치가 있는지 잘 모르겠습니다.


2
sizeof l바이트를 저장합니다. 끔찍한 못생긴 사람 #define p-__builtin_popcount(이 다른 사람을 구하는 데 도움이 될 수 있습니다.
ugoren

@ugoren 팁 주셔서 감사합니다! 전 처리기 하나는 그런 해킹입니다. 나는 그런 일이 가능하다는 것을 몰랐습니다. 슬프게도 MSVC에서는 작동하지 않지만 모든 바이트 수는 중요합니다!
토마스

4

PowerShell v3, 61 58 53

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

Sort-Objectcmdlet 의 ScriptBlock 은 숫자의 이진 표현으로 각 1에 대해 1의 배열을 반환합니다. Sort-Object각 숫자에 대해 반환 된 배열의 길이를 기준으로 목록을 정렬합니다.

실행하다:

script.ps1 15342 28943 16375 3944 11746 825 32425 28436 21826 15752 19944

작동합니다. 어떻게 작동합니까? 어떻게 마법 '.' '어레이의 길이를 기준으로'?
mazzy

'.' 그 뒤에 오는 스크립트 블록을 실행합니다. sort 명령은 외부 스크립트 블록의 출력을 기준으로 정렬합니다. 내부 스크립트 블록이 필요하지 않다는 것을 알게되었습니다. 편집 참조
Rynant

$f={중복, while-> for, -band1-> %2, -des-> -d및 기타 골프 트릭입니다. 알았습니다. 일하는 방법을 설명 할 수 있습니까 $args|sort{@(1,1,...,1)}? 일이야! 정렬이 명시 적으로 배열을 비교하는 방법은 .Count무엇입니까? 그것에 대해 읽을 곳? 감사!
mazzy

1
@ mazzy, 당신 말이 맞아요, 이제 중복 비트를 제거했습니다. Sort-Object cmdlet의 기본 정렬입니다. 참조 : help Sort-Object -Parameter property유형의 기본 정렬 속성이 어디에 정의되어 있는지 모르지만 배열의 경우 Count 또는 Length입니다.
Rynant

좋은 추측입니다. 그러나 $args|sort{while($_){if($_-band1){$_};$_=$_-shr1}}-des잘못된 결과를 제공합니다. 따라서 그렇지 않습니다 Count. 이것은 매우 흥미 롭다. 다시 감사합니다.
mazzy

3

ECMAScript 6, 61

z입력이라고 가정

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

테스트 데이터

[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]

더 짧은 솔루션을위한 칫솔.


1
방금 솔루션을 시도했지만 작동하지 않았습니다. 숫자를 정렬하지 않습니다.
칫솔

@ 칫솔 그것을 잡아 주셔서 감사합니다, 지금 작동합니다.
Danny

훌륭한 일! 나는 그것을 좋아한다.
칫솔

1
61 바이트 만 : z.sort((a,b)=>{c=d=e=0;while(++c<32)d+=a>>c&1,e+=b>>c&1},e-d)(투표 덕분에)
칫솔

1
내 솔루션은 이제 당신과 같은 크기입니다!
칫솔

3

R , 132 96 94 88 84 75 73 53 51 바이트

J.Doe의 구현 덕분에 -20 Giuseppe 덕분에 -2 더

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

내 원래 게시물 :

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

온라인으로 사용해보십시오!

이 결과에 도달하기 전에 여러 가지 다른 방법을 시도했습니다.

행렬 방법 : 입력 벡터가있는 열과 이진 표현의 합 중 하나 인 두 개의 열 행렬을 만든 다음 이진의 합을 정렬했습니다.

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),]}

비 매트릭스 : 실현 매트릭스 함수를 던져서 대신 이진 값으로 구성된 벡터를 만들어 합산하고 정렬 한 다음 정렬 된 값을 사용하여 입력 벡터를 재정렬 할 수 있습니다.

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

사소한 변화

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

사소한 변경 사항 전체 사물을 세미콜론으로 구분 된 두 줄 대신 한 줄의 코드로 변환합니다.

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

Sum Method에colSums 의해 생성 된 이진 행렬로 열을 추가하는 대신 "완료" sapply전에 열의 요소를 추가했습니다 sapply.

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

레브로 감소 정말 감소 단축 싶었지만, 나 한테 R의 울음 소리가 나는 단축하려고하면 decreasingorder순서대로 원하는 얻을 필요했다 기능, order증가 기본값은 다음 내가 기억 rev하는 벡터를 반전하는 기능. 유레카!!! 최종 솔루션의 마지막 변경은 2 바이트를 더 절약하는 것이 었 function습니다pryr::f

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


1
@ J.Doe의 우수한 골프에서 51 바이트 향상!
주세페

2

하스켈, 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)

이것이 내가 이것을 해결하려고 생각한 첫 번째 방법이지만 더 좋은 방법이 있다고 확신합니다. 또한 하스켈 수입품을 골프로 파는 방법을 알고 있다면 그 소식을 듣고 싶습니다.

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

Ungolfed 버전 (설명 포함)

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)

그것의 중위 표기법을 사용하는 것이 도움이 될 것입니다 mod, n`mod`2? 곱셈과 나눗셈과 같은 우선 순위를 갖습니다.
John Dvorak

내가 볼 수있는 한 골프 때문에 너무 도움이되지 않습니다. 나는 두 칸을 잃을 것이지만 두 개의 백틱을 얻습니다.
danmcardle

import Data.List; import Data.Ord; import Data.Bits; q = sortBy (popCount 비교)-80C-또는 접근 방식을 사용하여 import Data.List; import Data.Ord; b 0 = 0; bn = (mod n 2) + b (div n 2); q = sortBy (비교 b)
-86C

나는 수입을 완전히 피하려고 노력했다. 관리 할 수있는 최선은 골프 퀵 정렬을 통해 87C였다 .b 0 = 0; bn = 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

커피 스크립트 (94)

읽을 수있는 코드 (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]

최적화 (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

난독 화 (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

삼항 연산자가 너무 길다 (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))

너무 길어서 캐스팅을 중지하십시오 (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)

결승 (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)))

2

스몰 토크 (Smalltalk / X), 36 (또는 24)

에 입력; 파괴적으로 정렬 :

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

기능 버전 : 새로운 정렬 된 배열을 반환합니다.

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

24 문자 에는 더 짧은 변형 ( 이름 이나 함수를 인수로 전달)이 있습니다. 그러나 (한숨) 마지막으로 정렬됩니다. 내가 이해했듯이 이것은 요청되지 않았으므로 골프 점수로 사용하지 않습니다.

a sortBySelector:#bitCount

2

PHP 5.4+ 131

나는 왜 내가 PHP를 귀찮게하는지 모르겠다.

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

용법:

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

물론, 누군가 PHP 귀찮게
Einacio


2

DFSORT (IBM 메인 프레임 정렬 제품) 288 (각 소스 행은 72 자이며 위치 1에 공백이 있어야 함)

 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)

재미 있고 수학은 없습니다.

정수를 가진 파일 ( "배열"을 사용한 프로그램에서 실행될 수 있음)을 가져옵니다. 정렬하기 전에 정수를 비트 (16 자 필드)로 변환합니다. 그런 다음 비트의 0을 아무것도 변경하지 않습니다. SORT 변경된 비트의 결과에 따라 내림차순. 정수만으로 정렬 된 파일을 만듭니다.


2

기음

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

4
이것은 코드 골프 경쟁이기 때문에 코드를 줄이려고 노력해야합니다.
Timtech 2014

2

C #, 88 89

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

편집 : 내림차순으로 문자를 추가합니다.


2

자바 스크립트 84

다른 자바 스크립트 답변에서 영감을 얻었지만 eval과 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));

문제는 코드 골프입니다. 코드를 '골프'하려고 시도하십시오. 불필요한 공백을 제거하고 코드를 가능한 작게 만드십시오. 또한 답에 문자 수를 포함 시키십시오.
ProgramFOX

2

자바 스크립트 (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})

2

추신, 126

우리가 정렬하는 값의 목록은 미리 알려져 있고 매우 제한적이므로 (32),이 작업은 정렬을위한 내장 값이없는 경우에도 1..32에 일치하는 값을 선택하여 쉽게 수행 할 수 있습니다. (O (32n)입니까?)

프로시 저는 스택의 배열을 예상하고 '정렬 된'배열을 반환합니다.

/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

또는 공백과 가독성을 완전히 제거했습니다.

/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

그런 다음 저장된 경우 다음 bits.ps과 같이 사용할 수 있습니다.

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]

나는 그것이 효과적으로이 Perl과 같다고 생각한다 (여전히 Perl도 없다) :

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

하지만 , 포스트 스크립트와는 달리, 쉽게 golfed 할 수 있습니다 :

sub f{sort{j($b)-j($a)}@_}sub j{$_=sprintf'%b',@_;()=/1/g}

추신! 나의 첫사랑, 내가 가장 좋아하는 언어! 하나의 진정한 프로그래밍 언어에서 다른 신자를 보는 것이 좋습니다.
AJMansfield

2

C - 124 111

정렬 방법으로 표준 라이브러리를 사용하여 구현되었습니다. 배열에 대한 포인터와 크기는 매개 변수로 전달되어야합니다. 이것은 32 비트 포인터가있는 시스템에서만 작동합니다. 64 비트 시스템에서 일부 문자는 포인터 정의를 지정하는 데 사용해야합니다.

가독성을위한 들여 쓰기

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

샘플 통화 :

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

2

자바 8 : 144

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

확장 된 형태로 :

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

보시다시피, 이것은 argsa Stream<String>로 변환 한 다음 함수 참조 ( 또는 보다 짧은)를 Stream<Integer>사용하여 a 로 변환 한 다음 정렬 하여 배열에 넣고 인쇄하여 작동합니다.Integer::decodeparseIntvalueOfInteger::bitCount

스트림은 모든 것을 더 쉽게 만듭니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.