Как не надо писать программы ;)

Все о программировании под *nix
Аватара пользователя
kas
Маньяк
Сообщения: 184
Зарегистрирован: 10 июл 2002, 03:15
Откуда: Минск

Как не надо писать программы ;)

Сообщение kas »

Наткнулся в нете на такой исходник(!) на C:

Код: Выделить всё

/*
*   Вот программа, занявшая в свое вpемя первое  место ("Best of Show"). Она
* вызывается с необязательным числовым параметром (по умолчанию 2) и  играет
* в шахматы.  Параметр определяет глубину  просмотра  (при  глубине большей,
* чем 3,  она будет думать  очень долго). Ходы  задаются двумя восьмеричными
* числами (откуда куда  - см. доску в  начале игры, например, "e2-e4"  нужно
* будет вводить как "64 44"), в приглашении к приему указывается  количество
* просмотренных ходов  и оценка позиций  - своей и  противника, т.е.   Вас).
*
* Правила игры несколько упрощены - пешки превращаются только в ферзей,  нет
* взятия на проходе и длинной рокировки (мне и короткую сделать не удалось),
*   а   также   контроля   правил    повторения   позиций   и   50    ходов.
*/



#include <stdio.h> 
#include <stdlib.h> 

#define m(x)(x<0?-1:!!x) 
#define g tj()-J 
#define a(x)(x<0?-x:x) 
#define h(x)((x)<=K?x:N-(x)) 
#define f 9999 
#define A return 
#define H printf( 
#define R double 
#define U int 
#define V for 
#define b else 
#define u while 
#define B if 
U v,w,Y= -1,W,J,p,F,o=f,M,N,K,X,YY,_,P[f],s(); typedef U(*L)(); L q[f]; tj(){ 
U S=m(v)+(m(w)<<K); B(!S)A J; V(v=W+S; v!=J&&!q[v]; v+=S); A v; } k(){ _=K; A 
v?a(v)>1||w-Y||!q[J]:(w-Y&&(w-Y*2||q[W+Y*(N+1)]|| (J>>K)-K+(Y-1)/ 2))||q[J]; 
} z(){ _=5; A v*w||g; } e(){ _= -2; 
A(v*v*v-v||w*w*w-w)&&(J-W-2||(W&N)-4||(W>>K!=(Y-1?N:0))|| 
q[W+1]||q[W+2]||q[W+K]!=z||P[W+K]*Y<0); } R VR(){ int PZ=0x7fff; 
A(R)(rand()&PZ)/(R)PZ; } l(){ _=K+1; A(v*w&&a(v)-a(w))||g; } R UC(){ R i=0,d; 
u((i+=d=VR())<1.0); A d; } c(){ _= -11; A a(v)-a(w)||g; } I(ur,n,x){ W=ur; 
J=n; B(P[W]!=Y||P[J]==Y)A J+1; v=(J&N)-(W&N); w=(J>>K)-(W>>K); A 
q[W]()||(x&&QL(W,J,s)); } TT(W){ v=w=0; A q[W]()+K; } s(){ U j= -1,i; Y= -Y; 
V(i=0; i<M; ++i){ B(j<0&&P[i]== -Y&&TT(i)&&_== -2) { j=i; i= -1; } b 
B(j>=0&&!I(i,j,0))A Y= -Y; } A!(Y= -Y); } bb(){ _=1; A a(v*w)-2; } uv(){ 
V(v=0; v<f; ++v){ B(h(v>>K)==0){ U S=h(v&N); 
q[v]=!S?z:(S==1?bb:(S==2?c:(v&N>K?l:e))); } b B(h(v>>K)==1)q[v]=k; b q[v]=0; 
P[v]=!!q[v]*(28-v); } } y(){ U G=Y,i; J=0; V(i=0; i<M; ++i){ 
i%8||H"\n%4o ",i); B((Y=P[i]=m(P[i]))&& TT(i))H"%c ",_+93+Y*16); b H"- "); } 
H"\n "); do H"%2d",i++&N); u(i&N); Y=G; H"\n"); } O(W,J){ 
B((q[J]=q[W])==k&&h(J>>K)==0)q[J]=l; B(q[W]==e)B(J-W==2)O(J+1,J-1); b 
B(W-J==2)O(W-1,W+1); P[J]=P[W]; q[W]=0; P[W]=0; } QL(W,J,D)L D; { U 
HQ=P[J],YX; L AJ=q[J],XY=q[W]; O(W,J); YX=D(); O(J,W); q[J]=AJ; q[W]=XY; 
P[J]=HQ; A YX; } C(){ U i,j,BZ=0; V(i=0; i<M; ++i){ L Z=q[i]; B(Z){ U 
r=h(i>>K)+h(i&N),G=Y, S=Z==z?88:(Z==k?11 +r+(P[i]<0?N-(i>>K):(i>>K)): 
(Z==l?124-((YY<8&&((i&N)!=K|| (i>>K)!=(P[i]>0?0:N)))?M:0): 
(Z==c?41+r:(Z==e?f-r-r:36+r+r)))); Y=P[i]; V(j=0; j<M; 
++j)B(!I(i,j,0))S+=(P[j]?5:1); BZ+=G==Y?S:-S; Y=G; } } 
B(!(++X&M-1))write(1,".",1); A BZ; } PX(){ U i,Q=0,XP=0,JZ=M*M,E= -f,t,S=o; 
B(!F--)A++F+C(); V(i=0; i<JZ; ++i)B(!I(i>>K+K,i&M-1,1)){ Y= -Y; o= -E; t= 
-QL(i>>K+K,i&M-1,PX); Y= -Y; B(t>E){ ++XP; Q=i; E=t; B(E>=S) A++F,E; } } 
B(!XP)E=s()?-f+1:0; p=Q; A++F,E; } RZ(){ U i,j,T=0; V(; ; ){ y(); o=f; do{ 
H"\n%d %d %d %s ",X,T,C(),s()?"!":">"); fflush(stdout); } 
u(scanf("%o%o",&i,&j)!=2||I(i,j,1)); O(i,j); y(); X=0; ++YY; Y= -Y; T=PX(); 
i=p>>(K<<1); j=p&(M-1); B(I(i,j,1)){ H"Rats!\n"); A; } O(i,j); Y= -Y; 
B(T>M*M)H"\nHar har.\n"); } } main(ac,av)char**av; { long time(),j=time(&j); 
R i=0; srand((U)j); V(M=0; M<=f; ++M)i+=UC(); M=i/100; B(M&3)++M; B(M&1)--M; 
V(N=1; N*N<M; ++N); K= --N/2; F=ac>1?atoi(av[1]):2; uv(); RZ(); }
Самое прикольное, что он работает! %)
- Говорят, пингвин - это ласточка разжиревшая от лени?
- Нет. Это ласточка беременная мыслью.

Аватара пользователя
kostaLom
Маньяк
Сообщения: 170
Зарегистрирован: 24 авг 2002, 14:14
Откуда: 9-й Отдел
Контактная информация:

Сообщение kostaLom »

Может у него пролилось пиво на клавиатуру и Enter перестал работать :) А вообще-то с помощью indent можно исправить.

Гость

Сообщение Гость »

Ага, особенно #define очень порадовали. Изобретательно :)

AgentSmith
Заглянувший
Сообщения: 18
Зарегистрирован: 01 сен 2002, 14:15
Откуда: Новосибирск, Россия

Сообщение AgentSmith »

Последнее сообщение - мое, просто глюк при входе был :(

Аватара пользователя
kostaLom
Маньяк
Сообщения: 170
Зарегистрирован: 24 авг 2002, 14:14
Откуда: 9-й Отдел
Контактная информация:

Сообщение kostaLom »

Конкурс на самую маленькую программу? :)

Anonymous

Сообщение Anonymous »

> Конкурс на самую маленькую программу?

Может устроим?
Только чтоб читаемые были. А не как эта :)

Предлагаю придумать задание для такого конкурса(предложений нет...
пока).

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

Gnome писал(а):> Конкурс на самую маленькую программу?

Может устроим?
Только чтоб читаемые были. А не как эта :)

Предлагаю придумать задание для такого конкурса(предложений нет...
пока).
есть предложение: прочесывание stdin по поводу обнаружения там e-mail. Две категории: с регэкспами и без них...
Опыт растет прямо пропорционально выведенному из строя оборудованию

Anonymous

Сообщение Anonymous »

Предлагаю придумать ряд требований которые должны будут учитываться при написании кода программы.

Можно также устроить конкурс из нескольких заданий,
т.е. будет несколько уровней сложности и каждому из них будет соответствовать одно задание.


Так же есть мысль или организовать "жюри" :)
или воспользоваться голосованием для определения
победителя.

Аватара пользователя
mend0za
Неотъемлемая часть форума
Сообщения: 2332
Зарегистрирован: 30 авг 2002, 12:33
Откуда: Minsk

Сообщение mend0za »

можно обойтись и без жюри. Просто по размеру :). Хороший классический критерий для подобного рода состязаний.
И увидел я зверя, выходящего из тундры. И число его было 3.14159265358979324...

Anonymous

Сообщение Anonymous »

Хотелось бы чтобы программы оценивались, не только по компактности но и по простоте понимания и еще каким-либо параметрам.

Аватара пользователя
mend0za
Неотъемлемая часть форума
Сообщения: 2332
Зарегистрирован: 30 авг 2002, 12:33
Откуда: Minsk

Сообщение mend0za »

а кто извините оценивать будет? Здесь программистов, тем более квалифицированных (то есть квалификация не дипломом определяется) по пальцам. Пожалуй всего 2-3 назову, из появляющихся время от времени. И далеко не факт что они согласятся это дело судить
И увидел я зверя, выходящего из тундры. И число его было 3.14159265358979324...

Anonymous

Сообщение Anonymous »

ну раз так дело обстоит, я ведь совсем не давно на форуме,
незнал, что программеров здесь так мало.

Предлагаю вообще устроить голосование, нужен такой конкурс или нет.
Чтобы уже точно знать будет хотя бы кто-нибудь участвовать.

Аватара пользователя
satanic_mechanic
Интересующийся
Сообщения: 56
Зарегистрирован: 18 июл 2003, 01:36
Контактная информация:

Сообщение satanic_mechanic »

Зачем спорить на счет того будет ли кто-то оценивать. Можно просто оценить друг-друга. Может поспорить. Проста разминка для мозгов. Я думаю комментариев и мнений будет достаточно...

Чтобы не быть голословным, сразу начну. Итак, первая попытка (думаю не последняя) (без регекспов):

Код: Выделить всё

#include <stdio.h> 
#include <stdlib.h> 

// = тип для представления списка символов ===================================== 
typedef struct char_list_tag { 
   char c; 
   struct char_list_tag *next; 
} char_list_t, *p_char_list_t; 

// = функции для работы со списком символов===================================== 
void add (p_char_list_t *, p_char_list_t *, char); 
void destroy (p_char_list_t *, p_char_list_t *); 

// = проверка того, подходит ли символ ========================================= 
int is_ok_0 (char); 
int is_ok_1 (char); 
int is_ok_2 (char); 

// ============================================================================= 
int (*is_ok[]) (char) = {is_ok_0, is_ok_1, is_ok_2}; 
int border[] = {'@', '.', -1}; 

p_char_list_t 
   head[] = {NULL, NULL, NULL}, 
   tail[] = {NULL, NULL, NULL}; 

int 
   state = 0, 
   len = 0, 
   c; 

// ============================================================================= 
int main (void) 
{ 
   do { 
      c = getc (stdin); 

      if        ((*is_ok[state]) (c)) { 
         add (&head[state], &tail[state], c); 
         len++; 
      } else if (c == border[state] && len) { 
         state++; 
         len = 0; 
      } else { 
         if (state == 2 && len) { 
            state++; 
            len = 0; 
         } else { 
            for (; state >= 0; --state) 
               destroy (&head[state], &tail[state]); 
            state = 0; 
            len = 0; 
         } 
      } 

      if (state == 3) { 
         char out_border[] = {'@', '.', '\n'}; 
         p_char_list_t p; 

         for (state = 0; state < 3; ++state) { 
            p = head[state]; 
            while (p) { 
               putc (p->c, stdout); 
               p = p->next; 
            } 
            putc (out_border[state], stdout); 
            destroy (&head[state], &head[state]); 
         } 
         state = 0; 
      } 

   } while (c != -1); 
    
   return (0); 
} 

// ============================================================================= 
void add (p_char_list_t *p_begin, p_char_list_t *p_end, char c) 
{ 
   p_char_list_t t = (p_char_list_t) malloc (sizeof (char_list_t)); 
   t->c = c; 
   t->next = NULL; 

   if (!(*p_begin)) 
      *p_begin = t; 
   else 
      (*p_end)->next = t; 
   *p_end = t; 
} 

void destroy (p_char_list_t *p_begin, p_char_list_t *p_end) 
{ 
   p_char_list_t t; 

   while (*p_begin) { 
      t = *p_begin; 
      *p_begin = (*p_begin)->next; 
      free ((void *) t); 
   } 

   *p_end = NULL; 
} 

// ============================================================================= 
#include <ctype.h> 

int is_ok_0 (char c) 
{ 
   return (isalpha (c) || c == '_'); 
} 

int is_ok_1 (char c) 
{ 
   return (isalpha (c)); 
} 

int is_ok_2 (char c) 
{ 
   return (isalpha (c)); 
} 

Для сохранения элементов e-mail адреса используются связные списки символов. По-моему, универсальнее чем массивы символов.

Так же, не знаю того, какие символы могут входить в элементы адреса, поэтому ввел три функции, каждая из которых и говорит, может ли быть такой символ. Чтобы было понятно: пусть есть адрес aaaa@bbb.cc. Тогда is_ok_0 относится к aaaa, is_ok_1 - к bbb, is_ok_2 к cc. Может кто знает как их изменить? А пока написал такие.

P. S. Программу короткой не назовешь ...
а по ночам, девушка, я программы пишу ...

Аватара пользователя
mend0za
Неотъемлемая часть форума
Сообщения: 2332
Зарегистрирован: 30 авг 2002, 12:33
Откуда: Minsk

Сообщение mend0za »

предлагаю исключить категорию "без регекспов" как бессмысленную. Анализ текста без специальных инструментов - это бег на костылях по пересеченной местности. Даже для языков, не включающий RE как тип данных, есть библиотеки.
И увидел я зверя, выходящего из тундры. И число его было 3.14159265358979324...

Гость

Сообщение Гость »

satanic_mechanic писал(а):Зачем спорить на счет того будет ли кто-то оценивать. Можно просто оценить друг-друга. Может поспорить. Проста разминка для мозгов. Я думаю комментариев и мнений будет достаточно...
Согласно быстрому просмотру кода:

Ну-ну, а вот тебе мой мейл для тестика: da@vba.com.by. :twisted:
Зачем ты его порезал?
Ага, не было никаких условий на формат ввода адресов? Ну так без точных требований (спецификации) построить приемлимый дизайн программы не всегда возможно правильно.
А зачем разные списки для хранения частей адреса? Даже если кого-то будут интересовать составляющие части адреса (ничего не сказано в условиях и уж никак для более удобного последующего вывода на консоль), то скорее имя + доменный адрес, а уж не его части. И уж если так хочется оптимизировать по скорости (хотя даже с этой точки зрения разобрать адрес на части можно и потом за один доп. проход), то можно сохранить просто дополнительный указатель на начало доменной части в том же списки.

Ответить