Arka fon
Benim için kod golf C gönderimleri, bir işleme aracı gerekir. Diğer birçok dilde olduğu gibi, beyaz alan çoğunlukla C kaynağında önemsizdir (ancak her zaman değil!) - yine de kodu insanlar için çok daha anlaşılır hale getirir. Tek bir yedek boşluk içermeyen, tamamen golf edilmiş bir C programı genellikle zar zor okunabilir.
Bu nedenle, beyaz alanı ve bazen yorumları içeren bir kod golf başvurusu için C kodumu yazmak istiyorum , böylece program yazarken anlaşılır bir yapı tutar. Son adım, tüm yorumları ve gereksiz boşlukları kaldırmaktır. Bu, bir stajyer bilgisayar programı tarafından gerçekten yapılması gereken sıkıcı ve akılsız bir görevdir .
Görev
Aşağıdaki kurallara göre bazı "golf öncesi" C kaynaklarından yorumları ve gereksiz boşlukları ortadan kaldıran bir program veya işlev yazın:
- Bir
\
satırdaki en son karakter olan A (ters eğik çizgi) bir satır devamıdır . Bunu bulursanız, aşağıdaki satırı aynı mantıksal satırın bir parçası olarak ele almanız gerekir (örneğin, başka bir şey yapmadan önce\
ve aşağıdaki satırları\n
(yeni satır) tamamen kaldırabilirsiniz ) - Yorumlar ile başlayarak yalnızca tek satırlı biçim kullanılır
//
. Bu nedenle, bunları kaldırmak için,//
bir dizgi değişmezinin dışında karşılaştığınız her yerde mantıksal çizginin geri kalanını yoksayarsınız (aşağıya bakın). - Boşluk karakterleri
(boşluk),
\t
(sekme) ve\n
(satırsonu, yani burada mantıksal bir satırın sonu). Bir dizi boşluk bulduğunuzda, onu çevreleyen boşluk olmayan karakterleri inceleyin. Eğer
- her ikisi de alfasayısal veya alt çizgi (aralık
[a-zA-Z0-9_]
) veya - ikisi de
+
ya - ikisi de
-
ya - bir önceki
/
ve bir sonraki*
ardından diziyi tek bir boşluk (
) karakteriyle değiştirin.
Aksi takdirde, diziyi tamamen ortadan kaldırın.
Bu kuralın bazı istisnaları vardır :
- Önişlemci yönergeleri çıktınızda kendi satırlarında görünmelidir. Bir önişlemci yönergesi ile başlayan bir satırdır
#
. - Bir dizgi değişmezinin veya karakter değişmezinin içinde boşluk bırakmamalısınız. Herhangi
"
(çift tırnak) /'
doğrudan ters eğik bir tek sayı ile preceeded değildir (tek tırnak) (\
) Bir başlatır veya uçları düz dize / karakter değişmezi . Dize ve karakter değişmezlerinin başladıkları satırla biteceğinden emin olabilirsiniz. dize hazır ve karakter değişmezleri bir nedenle, iç içe olamaz'
bir iç dize yanı sıra bir"
bir içeriye karakterin yazı herhangi bir özel anlamı yoktur.
- her ikisi de alfasayısal veya alt çizgi (aralık
I / O özellikleri
Giriş ve çıkış, satırsonu karakterleri içeren karakter dizileri (dizeler) veya satırsonu karakterleri içermeyen diziler / dizeler listesi olmalıdır. Dizileri / listeleri kullanmayı seçerseniz, her öğe bir satırı temsil eder, bu nedenle yeni satırlar her öğeden sonra örtük olur .
Girişin geçerli bir C programı kaynak kodu olduğunu varsayabilirsiniz. Bu aynı zamanda yalnızca yazdırılabilir ASCII karakterlerini, sekmelerini ve yeni satırları içerdiği anlamına gelir. Hatalı biçimlendirilmiş girdide tanımlanmamış davranışa izin verilir.
Ön ve arka boşluk / boş satır edilir izin .
Test senaryoları
giriş
main() { printf("Hello, World!"); // hi }
çıktı
main(){printf("Hello, World!");}
giriş
#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)); }
çıktı
#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));}
giriş
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)); }
çıktı
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));}
giriş
x; #include <stdio.h> int main() { puts("hello // there"); }
çıktı
x; #include<stdio.h> int main(){puts("hello // there");}
girdi (gerçek dünya örneği)
// 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(); } } }
çıktı
#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();}}}
Bu kod golf , çok kısa (bayt cinsinden) geçerli cevap kazanır.