সি, 929 878 বাইট
এই এক দৈত্য, ছেলেরা। দুঃখিত।
typedef unsigned long U;typedef unsigned char C;U f(int*u,n){C c[8],a[8];*(U*)(&c)=-1;int i,b=0,l=-9,s=-2,f=0,d;for (i=0; i<n; i++) {if (!u[i]&&s<0)s=i,l=0;if(!u[i])l++;if(u[i]&&s>=0){if(!s)l=2*l-1;d=(l-1)/2;if(b<d)*(U*)(a)=0,*(U*)(c)=-1,*c=s,*a=l,f=1,b=d;else if(b==d)c[f]=s,a[f++]=l;s=-1;}}if(s>=0&&l){l=2*l-1;d=(l-1)/2;if(b<d)*(U*)(c)=-1,*c=s,*a=l,f=1,b=d;else if(b==d)c[f]=s,a[f++]=l;}d=f;for(i=0;i<d;i++){if((c[i]+1)&&c[i]){if(c[i]+a[i]==n)c[i]=n-1;else{if(!(a[i]%2))c[f++]=b+c[i]+1;c[i]+=b;}}}return*(U*)c;}void P(int*u,n,i,c,m){for(i=0;i<n;i++){if(!u[i])c++;if(u[i]>m)m=u[i];}if(!c){for(i=0;i<n;i++)printf("%d",u[i]==10?0:u[i]);printf("\n");}else{int s[8][n];for(i=0;i<8;i++)for(c=0;c<n;c++)s[i][c]=u[c];U t=f(u,n);C*H=&t;for(i=0;i<8;i++)if((C)(H[i]+1))s[i][H[i]]=m+1,P(s[i],n,0,0,0);}}void L(n){int u[n],i,j;for(i=0;i<n;i++){for(j=0;j<n;j++)u[j]=j==i?1:0;P(u,n,0,0,0);}}
সংজ্ঞায়িত 3 ফাংশন, f(int*,int)
, P(int*,int,int,int,int)
, এবং L(int)
। কল করুন L(n)
, এবং এটি STDOUT এ আউটপুট দেয়।
এর জন্য আউটপুট n=5
:
14352
15342
31452
31542
41352
51342
41532
51432
24153
25143
34152
35142
23415
23514
24513
25413
24315
25314
24351
25341
আপডেট: আমি বিভাজকগুলি সরিয়েছি এবং কোডটি ঠিক করেছি। পুরানো কোডটি কেবলমাত্র n = 7 + এর জন্য ব্যর্থ হয়েছিল, তবে এন = 10 (ওফ!) এর জন্য কিছুই আউটপুট করতে ব্যর্থ হয়েছিল। আমি আরও ভালভাবে এই গুচ্ছ পরীক্ষা করেছি। এটি এখন এন = 13 পর্যন্ত ইনপুট সমর্থন করে (যদিও এটিতে "%d"
পরিবর্তন করা উচিত "%x"
তাই এটি হেক্সাডেসিমালে মুদ্রিত হয়)। ইনপুট আকার নির্ভর করে sizeof(long)
এবং এটি 8
অনুশীলন হিসাবে অনুমান করা হয়।
এটি কীভাবে কাজ করে তার কিছু ব্যাখ্যা এবং কেন এই জাতীয় বৈষম্য বাধা রয়েছে:
এগুলি প্রচুর ব্যবহৃত হয়েছিল, তাই আমরা কয়েকটি বাইট সংরক্ষণ করতে তাদের সংজ্ঞা দিয়েছি:
typedef unsigned long U; typedef unsigned char C;
এখানে f
:
U f(int*u,n){
C c[8],a[8];
*(U*)(&c)=-1;
int i,b=0,l=-9,s=-2,f=0,d;
for (i=0; i<n; i++) {
if (!u[i]&&s<0)
s=i,l=0;
if(!u[i])
l++;
if(u[i]&&s>=0){
if(!s)
l=2*l-1;
d=(l-1)/2;
if(b<d)
*(U*)(a)=0,
*(U*)(c)=-1,
*c=s,
*a=l,
f=1,
b=d;
else if(b==d)
c[f]=s,a[f++]=l;
s=-1;
}
}
if(s>=0&&l){
l=2*l-1;
d=(l-1)/2;
if(b<d)
*(U*)(c)=-1,
*c=s,
*a=l,
f=1,
b=d;
else if(b==d)
c[f]=s,a[f++]=l;
}
d=f;
for(i=0;i<d;i++){
if((c[i]+1)&&c[i]){
if(c[i]+a[i]==n)
c[i]=n-1;
else{
if(!(a[i]%2))
c[f++]=b+c[i]+1;
c[i]+=b;
}
}
}
return*(U*)c;
}
f
আকারের একটি অ্যারে n
এবং n
নিজেই নেয়। এখানে কেবল চতুর বিটটি এটি ফেরত দেয় unsigned long
যা char[8]
কলিং ফাংশন দ্বারা একটিতে রূপান্তরিত হয় । অ্যারের প্রতিটি অক্ষর এইভাবে হয় 0xFF
বা পরবর্তী ব্যক্তির জন্য একটি বৈধ মূত্রের দিকে নির্দেশ করে একটি সূচকতে সেট করা হয় । কারণ n<10
, আমাদের পরবর্তী বৈধ মূত্রটি পরবর্তী ব্যক্তি যেভাবে ব্যবহার করতে পারে তা ধরে রাখতে আমাদের কখনই 5 বাইটের বেশি প্রয়োজন হয় না।
এখানে P
:
void P(int*u,n,i,c,m){
for(i=0;i<n;i++){
if(!u[i])c++;
if(u[i]>m)m=u[i];
}
if(!c){
for(i=0;i<n;i++)
printf("%d",u[i]==10?0:u[i]);
printf("\n");
}
else{
int s[8][n];
for(i=0;i<8;i++)
for(c=0;c<n;c++)
s[i][c]=u[c];
U t=f(u,n);
C*H=&t;
for(i=0;i<8;i++)
if((C)(H[i]+1))
s[i][H[i]]=m+1,P(s[i],n,0,0,0);
}
}
P
u
আকারের একটি অ্যারে নেয় n
যেখানে ঠিক একটি উপাদান সেট করা থাকে 1
এবং বাকিগুলি থাকে 0
। এরপরে এটি প্রতিটি আদেশের পুনরাবৃত্তির সাথে সন্ধান করে এবং মুদ্রণ করে।
এখানে L
:
void L(n){
int u[n],i,j;
for(i=0;i<n;i++){
for(j=0;j<n;j++)
u[j]=j==i?1:0;
P(u,n,0,0,0);
}
}
L
P
n
প্রতিটি সময় বিভিন্ন প্রারম্ভিক অবস্থানের সাথে কেবল সময় কল করে ।
আগ্রহীদের জন্য, এটি (কম গল্ফ করা) f
ক্রমটি A095236 এ উত্পন্ন করবে ।
U f(int*u,n) {
C c[8];
*(U*)(&c) = -1;
int i,b=0,l=-10,s=-2,f=0,d;
for (i=0; i<n; i++) {
if (!u[i]&&s<0) {
s=i,l=0;
}
if(!u[i]){
l++;
}
if (u[i]&&s>=0) {
if (!s) {
l=2*l-1;
}
if (b<l) {
*(U*)(&c)=-1;
c[0]=s;
f=1;
b=l;
}
else if (b==l)
c[f++]=s;
s=-1;
}
}
if (s>=0&&l) {
l=2*l-1;
if (b<l) {
*(U*)(&c)=-1;
c[0]=s;
f=1;
b=l;
}
else if (b==l)
c[f++]=s;
}
d=f;
for (i=0; i<d; i++) {
if ((c[i]+1)&&c[i]) {
if (c[i]+b==n) {
c[i]=n-1;
}
else{
if (!(b%2)) {
c[f++]=(b-1)/2+c[i]+1;
}
c[i]+=(b-1)/2;
}
}
}
return *(U*)c;
}