এক পুনরাবৃত্তির সাথে নেতিবাচক, শূন্য এবং ধনাত্মক পূর্ণসংখ্যার অ্যারের ক্রম


9

Negativeণাত্মক সংখ্যা, ধনাত্মক সংখ্যা এবং শূন্য সমন্বিত পূর্ণসংখ্যার একটি অ্যারে নিন। এটিকে একটি পুনরাবৃত্তির সাথে গ্রুপ করুন এবং এমন জায়গায় theণাত্মক সংখ্যাগুলির মধ্যে সবার আগে আসুন, তারপরে সমস্ত শূন্য এবং তার পরে সমস্ত ধনাত্মক সংখ্যার পরে।

উদাহরণ:

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

মনে রাখবেন যে সংখ্যাগুলি সম্পূর্ণরূপে বাছাই করার দরকার নেই: কেবল চিহ্ন দ্বারা বাছাই করা।

সুতরাং, চূড়ান্ত অ্যারেটি দেখতে এমন হবে: -, -, ..., -, -, 0, 0, ..., 0, 0, +, +, ..., +, +

বিধি

  • আপনি কেবল ইনপুট অ্যারে এবং ধ্রুব পরিমাণ অতিরিক্ত মেমরি ব্যবহার করতে পারেন (যেমন আপনি আর কোনও অ্যারে তৈরি নাও করতে পারেন)
  • আপনি কেবলমাত্র একটি লুপ ব্যবহার করতে পারেন যা অ্যারের দৈর্ঘ্যের চেয়ে বহুগুণ কার্যকর করতে পারে। আপনি বিল্ট-ইন ফাংশনগুলি ব্যবহার করতে পারবেন না যা কোনও ধরণের লুপ আড়াল করে। এটি অন্তর্নির্মিত বাছাই ফাংশন অন্তর্ভুক্ত।
  • ফলাফলটি আমি বর্ণিত বিন্যাসে হওয়া উচিত

বিজয়ী হবেন সেই ব্যক্তিটি যে সংক্ষিপ্ততম কোডটি জমা করবেন (বাইটে গণনা করা) যা প্রাথমিক অ্যারেটিকে সঠিক বিন্যাসে পরিবর্তন করে (যেমন উপরে বর্ণিত)।



@ পিটারটেলর থেক্স, এখন বুঝতে পারছি কাজটি কী!
এলোমেলো

ঠিক এই কোডগল্ফ.স্ট্যাকেক্সেঞ্জাও.ইউকশনস / 504/… ব্যবহার 1 পুনরাবৃত্তি এবং 1 অ্যারে সীমা ছাড়াই
অপ্টিমাইজার

অন্তর্নির্মিত ক্রম ফাংশন অনুমোদিত না, তাই না?
কেএসএফটি

1
@ কেএসএফটি কলিং sort(...)ঠিক নেই কারণ এটি সম্ভবত একাধিক পুনরাবৃত্তি করে।
আয়নিক বিজাউ

উত্তর:


3

সি, 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;
}

আমি কোড ব্লকে এটি চেষ্টা করেছি এবং এটি সংকলন করে না, 3 টি ত্রুটি রয়েছে। আপনি কি সংকলিত? x * সংজ্ঞায়িত করা হয়নি এবং আপনি {এর আগে ভেরিয়েবল তৈরি করেছিলেন {
বেকসুবিলে

@ ব্যাকছুবিলে আপনি এটি ডিফল্ট (সি 89) মোডে জিসিসি দিয়ে সংকলন করতে পারেন। কোডব্লকস কোনও সংকলক নয় তাই আপনি কোন সংকলকটি ব্যবহার করছেন তা আমি বলতে পারি না তবে এটি জিসিসির সাথে কাজ করে। এটি সমস্ত সংকলকগুলির সাথে কাজ না করার কারণটি হল কে ও আর-স্টাইলের ঘোষণা, যা এএনএসআই মান মেনে চলে না।
feersum

1

স্টাটা 242

ঠিক উইকিপিডিয়া পৃষ্ঠা অনুসরণ করে। ধন্যবাদ @ পিটারটেলর

স্ট্যান্ড ইন এবং আউটপুটগুলি যেমন স্টাড আউট থেকে সংখ্যার একটি পৃথক সংখ্যার সেট হিসাবে ইনপুট নেয়।

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

সি, 90

প্রশ্নে পিটার টেলরের মন্তব্য অনুসারে উইকিপিডিয়া নিবন্ধে অ্যালগরিদমের সোজা বাস্তবায়ন।

aঅন্যান্য সি উত্তরের মতো ডাকা একটি অ্যারেতে ডেটা খুঁজে পাওয়ার প্রত্যাশা । n, pএবং znegativeণাত্মক এবং ধনাত্মক সংখ্যা এবং শূন্যের সন্নিবেশের জন্য পয়েন্টার। nএবং তথ্যের pপ্রথম এবং শেষ উপাদানগুলিকে নির্দেশ করে যুক্তি হিসাবে নেওয়া হয়।

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

ইসমাস্ক্রিপ্ট 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

পিএইচপি (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

পিএইচপি-র তুলনামূলক ভার্বোজ ভেরিয়েবল সিনট্যাক্সটি এখানে কিছুটা বেদনাদায়ক ...


0

রেবোল - 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

এটি ডাচ জাতীয় পতাকা উইকিপিডিয়া সিউডোকোডের একটি সরাসরি বন্দর। নীচে এটি নিরপেক্ষ দেখায়:

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

বিশেষ দ্রষ্টব্য। রিবোল অ্যারে (ব্লক) কমা ব্যবহার করবেন না -[5 3 0 -6 2 0 5]

এবং যদি এর ঠিক আছে এটি একটি ফাংশনে আবদ্ধ করে যা একটি অ্যারে নিয়ে যায় এবং এটি জায়গায় পরিবর্তিত করে তবে আমরা এটি 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

সি ++

অ-গল্ফযুক্ত সমাধান: অ্যারের সামনে যুক্ত করা নেতিবাচক সংখ্যা গণনা করে। প্রতিটি এলিমেন্টের জন্য যদি n এ এলিমেন্টের সাথে নেগেটিভ অদলবদল হয়, যদি n + 1 এ এলিমেন্টের সাথে জিরো অদলবদল করে অন্য উপাদানটি শেষ করে।

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

সিজেম - 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/ এ চেষ্টা করুন

ব্যাখ্যা:

এটি উইকিপিডিয়া থেকে অ্যালগরিদমের আরেকটি বাস্তবায়ন, এর Tজন্য iএবং এর Uজন্য ব্যবহার করে j(উভয়ই স্বয়ংক্রিয়ভাবে ০ থেকে শুরু হয়ে গেছে)।

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.