한 번의 반복으로 음수, 0 및 양수 배열을 정렬


9

음수, 양수 및 0을 포함하는 정수 배열을 가져옵니다. 한 번의 반복으로 그룹화하고 모든 음수가 먼저오고, 모든 0이오고, 모든 양수가옵니다.

예:

Input:  5, 3, 0, -6, 2, 0, 5
Output: -6, 0, 0, 3, 2, 5, 5

숫자를 완전히 정렬 할 필요는 없으며 기호로 정렬하면됩니다.

따라서 최종 배열은 다음과 같습니다. -, -, ..., -, -, 0, 0, ..., 0, 0, +, +, ..., +, +

규칙

  • 입력 배열과 일정량의 추가 메모리 만 사용할 수 있습니다 (예 : 더 이상 배열을 만들 수 없음)
  • 하나의 루프 만 사용할 수 있으며이 길이는 배열 길이만큼 여러 번 실행될 수 있습니다. 모든 종류의 루프를 숨기는 내장 함수를 사용할 수 없습니다. 여기에는 내장 정렬 기능이 포함됩니다.
  • 결과는 내가 설명한 형식이어야합니다

우승자는 초기 배열을 올바른 형식으로 변경하는 가장 짧은 코드 (바이트 단위)를 제출하는 사람입니다 (위 설명 참조).



@PeterTaylor Thx, 이제 나는 작업이 무엇인지 이해합니다!
randomra

정확히 codegolf.stackexchange.com/questions/504/... 사용 1 1 개 반복 배열 제한 이외.
Optimizer

내장 정렬 기능은 허용되지 않습니다.
KSFT

1
@KSFT 호출 sort(...)은 아마 여러 번 반복되기 때문에 좋지 않습니다.
Ionică Bizău 2016 년

답변:


3

C, 92

이것은 아마도 10 바이트 이상 줄어들 수 있습니다. 많은 표현이 낭비 될 것입니다.

첫 번째 인수는 배열의 시작을 가리켜 야합니다. 두 번째는 배열의 끝을 가리켜 야합니다.

*x;f(b,e)int*b,*e;{for(x=b;x<e;x++)*x>0&&--e-x?*x--^=*e^=*x^=*e:*x<0?b-x?*x^=*b=*x:0,b++:0;}

랜덤 테스트 생성기로 언 골프 :

*x;
f(b,e)int*b,*e;{
    for(x=b;x<e;x++) {
        if(*x<0) {
            if(b == x)
                b++;
            else
                *b++ = *x, *x=0;
        } else if(*x>0 && x != --e) {
            *x^=*e^=*x^=*e;
            x--;
        }
    }
}

int main()
{
    int a[999];
    srand(time(0));
    int n = rand() % 50;
    int i;
    for(i = 0; i < n; i++) printf("%d ", a[i] = rand() % 9 - 4);
    f(a, a+n);
    puts("");
    for(i = 0; i < n; i++) printf("%d ", a[i]);
    return 0;
}

나는 이것을 Code Blocks에서 시도했지만 컴파일하지 않았는데 3 가지 오류가 있습니다. 무엇으로 컴파일 했습니까? x *가 정의되지 않았으며 {전에 변수를 작성했습니다.
bacchusbeale 2018

@bacchusbeale 기본 (C89) 모드에서 gcc로 컴파일 할 수 있습니다. CodeBlocks는 컴파일러가 아니므로 어떤 컴파일러를 사용하고 있는지 알 수 없지만 gcc와 함께 작동합니다. 모든 컴파일러에서 작동하지 않는 이유는 K & R 스타일 선언으로, ANSI 표준을 준수하지 않습니다.
feersum

1

스타 타 242

wikipedia 페이지를 정확하게 따릅니다. 감사합니다 @PeterTaylor

공백으로 구분 된 숫자 세트를 표준 입력에서 가져오고 표준 출력과 같이 출력합니다.

di _r(a)
token $a//converts to array (kind of)
loc i=0
loc j=0
loc q=wordcount($a)
loc n=`q'-1
while `j'<=`n' {
loc t=``j''
if `t'<0{
loc `j'=``i''
loc `i'=`t'
loc ++i
loc ++j
}
else if `t'>0{
loc `j'=``n''
loc `n'=`t'
loc --n
}
else
loc ++j
}
//used only to output
forv x=1/`q'{
di ``x'' _c
}

1

파이썬 2 : 116 바이트

a=input();i=j=0;n=len(a)
while j<n:b=a[j];r,s=b<0,b>0;c=i*r+n*s-s+j*(b==0);a[c],a[j]=b,a[c];i+=r;n-=s;j+=b<1
print a

이것은 네덜란드 국기 의사 코드의 골프 파이썬 번역입니다.

가능한 112 바이트

이것이 허용되는지 확실하지 않습니다. 크기가 3 인 두 번째 배열이 생성됩니다 (일정한 추가 메모리!).

a=input();i=j=0;n=len(a)-1
while j<=n:b=a[j];k=(i,j,n)[cmp(b,0)+1];a[k],a[j]=b,a[k];i+=b<0;n-=b>0;j+=b<1
print a

1

C, 90

질문에 대한 Peter Taylor의 의견에 따라 Wikipedia 기사에서 알고리즘을 간단하게 구현합니다.

a다른 C 답변과 같은 배열에서 데이터를 찾을 것으로 예상됩니다 . n, pz음성 및 양성 숫자 1과 0의 삽입에 대한 포인터이다. np데이터의 처음과 마지막 요소를 가리키는 인수로 가져옵니다.

f(n,p){int t,z;for(z=n;p-z;z++)(t=a[z])?a[z]>0?a[z]=a[p],a[p--]=t:(a[z]=a[n],a[n++]=t):0;}

1

ECMAScript 157 바이트

프롬프트 대화 상자에서 숫자를 공백으로 구분하거나 쉼표로 구분하여 경고 대화 상자와 함께 결과를 반환합니다.

for(v=prompt().split(/,?\s+/),s=function(j,n){t=v[j],v[j]=v[n],v[n]=t},i=j=0,n=v.length-1;j<=n;)
!(~~v[j]<0&&!s(i++,j++)||~~v[j]>0&&!s(j,n--))&&j++;alert(v);

0

PHP (146)

function f($s){for($i=0,$n=count($s)-1;$j++<=$n;)if($k=$s[$j]){$l=$k>0?n:i;$x=$s[$$l];$s[$$l]=$k;$s[$j]=$x;$k>0?$n--|$j--:$i++;}echo print_r($s);}

http://3v4l.org/ivRX5

PHP의 비교적 장황한 변수 구문은 여기서 약간 고통 스럽습니다 ...


0

REBOL - 149 142 140

a: to-block input i: j: 1 n: length? a while[j <= n][case[a/:j < 0[swap at a ++ i at a ++ j]a/:j > 0[swap at a j at a -- n]on[++ j]]]print a

이것은 네덜란드 국기 wikipedia 의사 코드의 직접 포트입니다. 아래는 풀리지 않은 모습입니다.

a: to-block input
i: j: 1
n: length? a

while [j <= n] [
    case [
        a/:j < 0 [swap at a ++ i at a ++ j]
        a/:j > 0 [swap at a j at a -- n]
        on       [++ j]
    ]
]

print a

사용 예 :

rebol dutch-flag.reb <<< "5 3 0 -6 2 0 5"
-6 0 0 2 3 5 5

NB. Rebol 배열 (블록)은 쉼표를 사용하지 않습니다-[5 3 0 -6 2 0 5]

그리고 OK가 이것을 배열을 가져 와서 제자리에 수정하는 함수로 묶으면 128 자로 줄일 수 있습니다.

>> f: func[a][i: j: 1 n: length? a while[j <= n][case[a/:j < 0[swap at a ++ i at a ++ j]a/:j > 0[swap at a j at a -- n]on[++ j]]]n]

>> array: [5 3 0 -6 2 0 5]
== [5 3 0 -6 2 0 5]

>> print f array
-6 0 0 2 3 5 5

>> ;; and just to show that it as modified array

>> array
== [-6 0 0 2 3 5 5]

실제로 배열을 반환 할 필요가 없다면 (즉, 수정 만하면) 1 문자를 더 깎을 수 있습니다.


0

C ++

비 골프 솔루션 : n은 배열 앞에 추가 된 음수를 계산합니다. 각 요소에 대해 n에서 요소와 음수 스왑 인 경우 n + 1의 요소와 0 스왑이면 마지막 요소와 스왑됩니다.

void p(int* k,int n)
{
for(int i=0;i<n;i++)
{
cout<<*(k+i)<<' ';
}
cout<<endl;
}

void s(int *x,int i,int j)
{
int t=*(x+j);
*(x+j)=*(x+i);
*(x+i)=t;
}
void f(int *x,int L)
{
int n=0;
int k;
for(int i=1;i<L;i++)
{
k=*(x+i);
if(k<0)
{
s(x,i,n);
n++;
}
else if(k==0)
{
s(x,i,n+1);
}
else if(k>0)
{
s(x,i,L-1);
}
}
}

int main()
{
int x[]={5,2,-1,0,-2,4,0,3};
f(x,8);
p(x,8);
return 0;
}

0

CJam- 72 67

q~_,(:N;{_U=:B0>{U1$N=tNBtN(:N;}{B{U1$T=tTBtT):T;}{}?U):U;}?UN>!}gp

입력 : [5 3 4 0 -6 2 0 5]
출력 :[-6 0 0 4 2 3 5 5]

http://cjam.aditsu.net/ 에서 시도 하십시오

설명:

이것은 Tfor iUfor j(자동으로 0으로 초기화 됨)를 사용하여 wikipedia에서 알고리즘을 구현 한 또 다른 방법입니다 .

q~                    read and evaluate the array (let's call it "A")
_,(:N;                keep A on the stack and set N ← size of A - 1  
{                     do...  
    _U=:B             keep A on the stack and set B ← A[U] (also leaving B on the stack)  
    0>{               if B > 0
        U1$N=t        A[U] ← A[N]
        NBt           A[N] ← B
        N(:N;         N ← N - 1
    }{                else
        B{            if B ≠ 0
            U1$T=t    A[U] ← A[T]
            TBt       A[T] ← B
            T):T;     T ← T + 1
        }{            else (do nothing)
        }?            end if
        U):U;         U ← U + 1
    }?                end if
UN>!}g                ...while not (U > N)
p                     print representation of A
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.