পটভূমি
সি -তে আমার কোড-গল্ফ জমা দেওয়ার জন্য, আমার একটি প্রসেসিং সরঞ্জাম প্রয়োজন। অন্যান্য অনেক ভাষার মতো, সাদা উত্স বেশিরভাগ সি উত্সে অপ্রাসঙ্গিক (তবে সর্বদা নয়!) এখনও মানুষের পক্ষে কোডটিকে অনেক বেশি বোধগম্য করে তোলে। একটি সম্পূর্ণ গল্ফড সি প্রোগ্রাম যা একটিমাত্র রিন্ডান্ট হোয়াইটস্পেস ধারণ করে না খুব সহজেই পঠনযোগ্য।
সুতরাং, আমি হোয়াইটস্পেস এবং কখনও কখনও মন্তব্য সহ কোড-গল্ফ জমা দেওয়ার জন্য সি-তে আমার কোড লিখতে চাই , সুতরাং প্রোগ্রামটি লেখার সময় একটি বোধগম্য কাঠামো রাখে। সর্বশেষ পদক্ষেপটি হ'ল সমস্ত মন্তব্য এবং অপ্রয়োজনীয় সাদা স্থান সরিয়ে ফেলা। এটি একটি ক্লান্তিকর এবং নির্বোধ কাজ যা সত্যই কোনও ইন্টার্নের দ্বারা কম্পিউটার প্রোগ্রাম করা উচিত।
কার্য
একটি প্রোগ্রাম বা ফাংশন লিখুন যা নিম্নলিখিত বিধি অনুসারে কিছু "প্রাক-গল্ফড" সি উত্স থেকে মন্তব্য এবং রিডান্ট্যান্ট হোয়াইটস্পেসকে সরিয়ে দেয়:
- একটি
\
(ব্যাকস্ল্যাশ) একটি লাইনের একেবারে শেষ চরিত্র হিসাবে লাইন ধারাবাহিকতা । যদি আপনি এটি খুঁজে পান তবে আপনাকে অবশ্যই নিম্নলিখিত লাইনটিকে একই লজিকাল লাইনের অংশ হিসাবে গণ্য করতে হবে (উদাহরণস্বরূপ আপনি অন্য কিছু করার আগে\
নিম্নলিখিতটি এবং নিম্নলিখিতটি\n
(নিউলাইন) সম্পূর্ণভাবে মুছে ফেলতে পারেন ) - মন্তব্যগুলি কেবল এক-লাইন ফর্ম্যাটটি ব্যবহার করে শুরু করবে
//
। সুতরাং এগুলি সরাতে আপনি বাকী লজিকাল রেখাটিকে এড়িয়ে যান যেখানেই আপনি স্ট্রিং আক্ষরিকের//
বাইরে পড়েন (নীচে দেখুন)। - হোয়াইটস্পেসের অক্ষরগুলি হ'ল
(স্পেস),
\t
(ট্যাব) এবং\n
(নতুন লাইন, সুতরাং এখানে একটি লজিকাল লাইনের শেষ)। যখন আপনি শ্বেত স্পেসের সিকোয়েন্সটি খুঁজে পান, তখন চারপাশে থাকা অ-সাদা অংশের অক্ষরগুলি পরীক্ষা করুন। যদি
- উভয়ই আলফানিউমেরিক বা আন্ডারস্কোর (রেঞ্জ
[a-zA-Z0-9_]
) বা are - উভয় হয়
+
বা - উভয় হয়
-
বা - পূর্ববর্তীটি হ'ল
/
এবং নিম্নলিখিতটি হ'ল*
তারপরে একটি একক স্থান (
) অক্ষরের সাথে ক্রমটি প্রতিস্থাপন করুন ।
অন্যথায়, ক্রমটি পুরোপুরি বাদ দিন।
এই নিয়মের কিছু ব্যতিক্রম রয়েছে :
- প্রিপ্রসেসর নির্দেশিকা অবশ্যই আপনার আউটপুটে তাদের নিজস্ব লাইনে উপস্থিত হবে। একটি প্রিপ্রসেসর নির্দেশিকা হ'ল একটি লাইন
#
। - একটি স্ট্রিং আক্ষরিক বা চরিত্রের আক্ষরিক ভিতরে , আপনার কোনও সাদা স্থান অপসারণ করা উচিত নয়। যে কোনও
"
(ডাবল-কোট) /'
(একক উদ্ধৃতি) যা সরাসরি বিজোড় সংখ্যার ব্যাকস্ল্যাশ (\
) দ্বারা শুরু হয় না যা স্ট্রিং আক্ষরিক / অক্ষর আক্ষরিক শুরু হয় বা শেষ হয় । আপনি গ্যারান্টিযুক্ত যে স্ট্রিং এবং চরিত্রের অক্ষরগুলি একই লাইনে শুরু হয়েছিল তারা শুরু করেছিল। স্ট্রিং আক্ষরিক এবং চরিত্রের অক্ষরগুলি বাসা বাঁধতে পারে না, সুতরাং'
একটি স্ট্রিং আক্ষরিক"
অভ্যন্তরের অভ্যন্তরের পাশাপাশি একটি অক্ষরের আক্ষরিক ভিতরে কোনও বিশেষ অর্থ থাকে না।
- উভয়ই আলফানিউমেরিক বা আন্ডারস্কোর (রেঞ্জ
আই / ও স্পেসিফিকেশন
ইনপুট এবং আউটপুট অবশ্যই নিউলাইন বর্ণগুলি বা অ্যারে / স্ট্রিংগুলির তালিকাসমূহের সাথে অক্ষরের ক্রমগুলি (স্ট্রিংগুলি) হওয়া উচিত যা নিউলাইন অক্ষর ধারণ করে না। আপনি ব্যবহার অ্যারে / করণীয় তালিকা চয়ন করেন তাহলে, প্রতিটি উপাদান তাই নতুন লাইন, একটি লাইন প্রতিনিধিত্ব করে অন্তর্নিহিত প্রতিটি উপাদান পরে।
আপনি ধরে নিতে পারেন ইনপুটটি একটি বৈধ সি প্রোগ্রামের উত্স কোড is এর অর্থ এটিতে কেবল মুদ্রণযোগ্য এএসসিআইআই অক্ষর, ট্যাব এবং নিউলাইন রয়েছে। বিকৃত ইনপুটটিতে অপরিজ্ঞাত আচরণের অনুমতি রয়েছে।
সামনের এবং পিছনের হোয়াইটস্পেস / খালি লাইন হয় মঞ্জুরিপ্রাপ্ত নয় ।
পরীক্ষার মামলা
ইনপুট
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();}}}
এটি কোড-গল্ফ , তাই সংক্ষিপ্ততম (বাইটে) বৈধ উত্তর জেতে।