पृष्ठभूमि
सी में मेरे कोड-गोल्फ सबमिशन के लिए, मुझे एक प्रोसेसिंग टूल की आवश्यकता है। कई अन्य भाषाओं की तरह, व्हॉट्सएप C स्रोत में ज्यादातर अप्रासंगिक है (लेकिन हमेशा नहीं!) - फिर भी यह कोड मनुष्यों के लिए अधिक व्यापक बनाता है। एक पूरी तरह से तैयार सी कार्यक्रम जिसमें एक भी निरर्थक व्हाट्सएप शामिल नहीं है, अक्सर मुश्किल से पढ़ा जा सकता है।
इसलिए, मुझे सीटी -गोल्फ जमा करने के लिए सी में अपना कोड लिखना पसंद है जिसमें व्हॉट्सएप और कभी-कभी टिप्पणियां भी शामिल हैं, इसलिए कार्यक्रम लिखते समय एक समझदार संरचना रखता है। अंतिम चरण सभी टिप्पणियों और अनावश्यक व्हाट्सएप को हटाना है। यह एक थकाऊ और नासमझ कार्य है जो वास्तव में एक इंटर्न कंप्यूटर प्रोग्राम द्वारा किया जाना चाहिए ।
कार्य
एक प्रोग्राम या फ़ंक्शन लिखें जो टिप्पणियों और निरर्थक व्हाट्सएप को कुछ "पूर्व-गढ़वाले" सी स्रोत से निम्नलिखित के अनुसार समाप्त करता है:
- A
\
(बैकस्लैश) एक पंक्ति में अंतिम वर्ण के रूप में एक पंक्ति निरंतरता है । यदि आपको यह पता चलता है, तो आपको निम्न पंक्ति को उसी तार्किक रेखा के भाग के रूप में समझना चाहिए (उदाहरण के लिए आप\
और\n
कुछ भी करने से पहले और ( निम्नलिखित ) पूरी तरह से हटा सकते हैं) - टिप्पणियां केवल एक-पंक्ति प्रारूप का उपयोग करेंगी, जिसके साथ शुरुआत होगी
//
। इसलिए उन्हें हटाने के लिए, आप जहाँ भी आप//
एक स्ट्रिंग शाब्दिक (नीचे देखें) के बाहर मुठभेड़ करते हैं, बाकी तार्किक रेखा को अनदेखा करते हैं। - व्हॉट्सएप के पात्र
(स्थान),
\t
(टैब) और\n
(नई रेखा, इसलिए यहां तार्किक रेखा का अंत है)। जब आप व्हॉट्सएप का एक क्रम पाते हैं, तो उसके आसपास के गैर-व्हाट्सएप पात्रों की जांच करें। अगर
- वे दोनों अल्फ़ान्यूमेरिक या अंडरस्कोर (रेंज
[a-zA-Z0-9_]
) या हैं - दोनों हैं
+
या - दोनों हैं
-
या - पूर्ववर्ती एक है
/
और निम्नलिखित एक है*
फिर अनुक्रम को एकल स्थान (
) वर्ण से बदलें ।
अन्यथा, अनुक्रम को पूरी तरह से समाप्त करें।
इस नियम के कुछ अपवाद हैं :
- प्रीप्रोसेसर निर्देश आपके आउटपुट में अपनी खुद की लाइनों पर दिखाई देने चाहिए। एक प्रीप्रोसेसर निर्देश के साथ शुरू होने वाली एक रेखा है
#
। - एक स्ट्रिंग शाब्दिक या वर्ण शाब्दिक के अंदर , आपको कोई व्हाट्सएप नहीं निकालना चाहिए। कोई भी
"
(डबल-उद्धरण) /'
(एकल-उद्धरण) जो किसी विषम संख्या के बैकस्लैश से पहले से आगे नहीं बढ़ा है (\
) एक स्ट्रिंग शाब्दिक / वर्ण शाब्दिक शुरू या समाप्त होता है । आपको गारंटी है कि स्ट्रिंग और चरित्र शाब्दिक उसी पंक्ति पर समाप्त होते हैं जो उन्होंने शुरू किया था। स्ट्रिंग शाब्दिक और चरित्र शाब्दिक रूप से नेस्टेड नहीं हो सकते हैं, इसलिए एक स्ट्रिंग शाब्दिक के'
अंदर , साथ ही एक चरित्र शाब्दिक के अंदर कोई विशेष अर्थ नहीं है।"
- वे दोनों अल्फ़ान्यूमेरिक या अंडरस्कोर (रेंज
मैं / हे विनिर्देशन
इनपुट और आउटपुट या तो चरित्र अनुक्रम (स्ट्रिंग्स) होना चाहिए जिसमें न्यूलाइन वर्ण या एरे / स्ट्रिंग्स की सूची शामिल है जिसमें न्यूलाइन वर्ण नहीं हैं। यदि आप सरणियों / सूचियों का उपयोग करना चुनते हैं, तो प्रत्येक तत्व एक रेखा का प्रतिनिधित्व करता है, इसलिए नए तत्व प्रत्येक तत्व के बाद निहित होते हैं ।
आप मान सकते हैं कि इनपुट एक वैध सी प्रोग्राम सोर्स कोड है। इसका अर्थ यह भी है कि इसमें केवल मुद्रण योग्य ASCII वर्ण, टैब और नए अंक शामिल हैं। विकृत इनपुट पर अपरिभाषित व्यवहार की अनुमति है।
व्हाट्सएप / खाली लाइनों के लिए अग्रणी और अनुगामी अनुमति नहीं है ।
परीक्षण के मामलों
इनपुट
main() { printf("Hello, World!"); // hi }
उत्पादन
main(){printf("Hello, World!");}
इनपुट
#define max(x, y) \ x > y ? x : y #define I(x) scanf("%d", &x) a; b; // just a needless comment, \ because we can! main() { I(a); I(b); printf("\" max \": %d\n", max(a, b)); }
उत्पादन
#define max(x,y)x>y?x:y #define I(x)scanf("%d",&x) a;b;main(){I(a);I(b);printf("\" max \": %d\n",max(a,b));}
इनपुट
x[10];*c;i; main() { int _e; for(; scanf("%d", &x) > 0 && ++_e;); for(c = x + _e; c --> x; i = 100 / *x, printf("%d ", i - --_e)); }
उत्पादन
x[10];*c;i;main(){int _e;for(;scanf("%d",&x)>0&&++_e;);for(c=x+_e;c-->x;i=100/ *x,printf("%d ",i- --_e));}
इनपुट
x; #include <stdio.h> int main() { puts("hello // there"); }
उत्पादन
x; #include<stdio.h> int main(){puts("hello // there");}
इनपुट (एक वास्तविक दुनिया उदाहरण)
// often used functions/keywords: #define P printf( #define A case #define B break // loops for copying rows upwards/downwards are similar -> macro #define L(i, e, t, f, s) \ for (o=i; o e;){ strcpy(l[o t], l[o f]); c[o t]=c[s o]; } // range check for rows/columns is similar -> macro #define R(m,o) { return b<1|b>m ? m o : b; } // checking for numerical input is needed twice (move and print command): #define N(f) sscanf(f, "%d,%d", &i, &j) || sscanf(f, ",%d", &j) // room for 999 rows with each 999 cols (not specified, should be enough) // also declare "current line pointers" (*L for data, *C for line length), // an input buffer (a) and scratch variables r, i, j, o, z, c[999], *C, x=1, y=1; char a[999], l[999][999], (*L)[999]; // move rows down from current cursor position D() { L(r, >y, , -1, --) r++ ? strcpy(l[o], l[o-1]+--x), c[o-1]=x, l[o-1][x]=0 : 0; c[y++] = strlen(l[o]); x=1; } // move rows up, appending uppermost to current line U() { strcat(*L, l[y]); *C = strlen(*L); L(y+1, <r, -1, , ++) --r; *l[r] = c[r] = 0; } // normalize positions, treat 0 as max X(b) R(c[y-1], +1) Y(b) R(r, ) main() { for(;;) // forever { // initialize z as current line index, the current line pointers, // i and j for default values of positioning z = i = y; L = l + --z; C = c + z; j = x; // prompt: !r || y/r && x > *C ? P "end> ") : P "%d,%d> ", y, x); // read a line of input (using scanf so we don't need an include) scanf("%[^\n]%*c", a) // no command arguments -> make check easier: ? a[2] *= !!a[1], // numerical input -> have move command: // calculate new coordinates, checking for "relative" N(a) ? y = Y(i + (i<0 | *a=='+') * y) , x = X(j + (j<0 || strchr(a+1, '+')) * x) :0 // check for empty input, read single newline // and perform <return> command: : ( *a = D(), scanf("%*c") ); switch(*a) { A 'e': y = r; x = c[r-1] + 1; B; A 'b': y = 1; x = 1; B; A 'L': for(o = y-4; ++o < y+2;) o<0 ^ o<r && P "%c%s\n", o^z ? ' ' : '>', l[o]); for(o = x+1; --o;) P " "); P "^\n"); B; A 'l': puts(*L); B; A 'p': i = 1; j = 0; N(a+2); for(o = Y(i)-1; o<Y(j); ++o) puts(l[o]); B; A 'A': y = r++; strcpy(l[y], a+2); x = c[y] = strlen(a+2); ++x; ++y; B; A 'i': D(); --y; x=X(0); // Commands i and r are very similar -> fall through // from i to r after moving rows down and setting // position at end of line: A 'r': strcpy(*L+x-1, a+2); *C = strlen(*L); x = 1; ++y > r && ++r; B; A 'I': o = strlen(a+2); memmove(*L+x+o-1, *L+x-1, *C-x+1); *C += o; memcpy(*L+x-1, a+2, o); x += o; B; A 'd': **L ? **L = *C = 0, x = 1 : U(); y = y>r ? r : y; B; A 'j': y<r && U(); } } }
उत्पादन
#define P printf( #define A case #define B break #define L(i,e,t,f,s)for(o=i;o e;){strcpy(l[o t],l[o f]);c[o t]=c[s o];} #define R(m,o){return b<1|b>m?m o:b;} #define N(f)sscanf(f,"%d,%d",&i,&j)||sscanf(f,",%d",&j) r,i,j,o,z,c[999],*C,x=1,y=1;char a[999],l[999][999],(*L)[999];D(){L(r,>y,,-1,--)r++?strcpy(l[o],l[o-1]+--x),c[o-1]=x,l[o-1][x]=0:0;c[y++]=strlen(l[o]);x=1;}U(){strcat(*L,l[y]);*C=strlen(*L);L(y+1,<r,-1,,++)--r;*l[r]=c[r]=0;}X(b)R(c[y-1],+1)Y(b)R(r,)main(){for(;;){z=i=y;L=l+--z;C=c+z;j=x;!r||y/r&&x>*C?P"end> "):P"%d,%d> ",y,x);scanf("%[^\n]%*c",a)?a[2]*=!!a[1],N(a)?y=Y(i+(i<0|*a=='+')*y),x=X(j+(j<0||strchr(a+1,'+'))*x):0:(*a=D(),scanf("%*c"));switch(*a){A'e':y=r;x=c[r-1]+1;B;A'b':y=1;x=1;B;A'L':for(o=y-4;++o<y+2;)o<0^o<r&&P"%c%s\n",o^z?' ':'>',l[o]);for(o=x+1;--o;)P" ");P"^\n");B;A'l':puts(*L);B;A'p':i=1;j=0;N(a+2);for(o=Y(i)-1;o<Y(j);++o)puts(l[o]);B;A'A':y=r++;strcpy(l[y],a+2);x=c[y]=strlen(a+2);++x;++y;B;A'i':D();--y;x=X(0);A'r':strcpy(*L+x-1,a+2);*C=strlen(*L);x=1;++y>r&&++r;B;A'I':o=strlen(a+2);memmove(*L+x+o-1,*L+x-1,*C-x+1);*C+=o;memcpy(*L+x-1,a+2,o);x+=o;B;A'd':**L?**L=*C=0,x=1:U();y=y>r?r:y;B;A'j':y<r&&U();}}}
यह कोड-गोल्फ है , इसलिए सबसे छोटा (बाइट्स में) वैध उत्तर जीतता है।