सी, 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 + के लिए विफल रहा, बल्कि n = 10 (oops!) के लिए कुछ भी आउटपुट करने में विफल रहा। मैंने इस गुच्छा का अधिक अच्छी तरह से परीक्षण किया है। यह अब n = 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
हर बार अलग-अलग शुरुआती स्थितियों के साथ बार कॉल करें ।
रुचि के लिए, यह (कम golfed) 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;
}