태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

Search results for '코드창고/변태코드'

for문 없이 별찍기

2009/09/18 14:51

// for 문 없이 다이아 몬드 만들기
#include <stdio.h>
#include <setjmp.h>
int main( void )
{
    int i = 0, j = 0;
    jmp_buf buf;
    setjmp(buf);
    printf( "%s", i>=8  ? j<i-8?" ":"* "
                        : j<8-i?" ":"* " );
    i = ( ++j == 8 )?( j = 0, printf( "\n" ), ++i):i;
    if( i != 16 ) longjmp(buf,0);    

return 0; }

굉장히 변태적인 방법.

codepad에서는 잘 안돌아가는듯. 직접 컴파일해야됨.
크리에이티브 커먼즈 라이선스
Creative Commons License

유리한 코드창고/변태코드

  1. Blog Icon
    chobabo

    정말 변태같은 코드네요^^

  2. 예, 그렇습니다.
    만들게 된 이유도 꼬꼬마들 숙제용으로 이대로 제출하고 F맞아라 라는 의미였으니 변태적일 수 밖에요.

  3. 한 function내에서 setjmp를 쓰다니요.. 불결합니다.

    goto짱도 할 수 있다구여!

    함수를 넘나들게 작성해주세요.! -_-

  4. 그렇게 짜면 꼬꼬마들이 레포트 제출용으로 부적합하다고 생각할거임 ㄲ
    setjmp 는 위대한듯. C의 exception 처리라니 ㅋ

C로 짜본 짝퉁 싱글턴

2009/09/18 11:51

말이 싱글턴이지.. 만들어놓고 보니 그냥 캡슐화임.


헤더파일은 이런식으로.
//Header File. 'cfg.h'
typedef struct { int (*getA)(void); void (*setA)(int _a); char (*getB)(void); void (*setB)(char _b); double (*getC)(void); void (*setC)(double _c); }config;
config* getConfig(void);


소스코드는 이런식.

//Source File. 'cfg.c'
#include "cfg.c"

config* self=NULL;
static int a; static char b; static double c;

static int getA(void){return a;} static void setA(int _a){a=_a;} static char getB(void){return b;} static void setB(char _b){b=_b;} static double getC(void){return c;} static void setC(double _c){c=_c;}
config* getConfig() { if(self==NULL) { self = (config*)malloc(sizeof(config)); self->getA = getA; self->setA = setA; self->getB = getB; self->setB = setB; self->getC = getC; self->setC = setC; } return self; }

외부에서 include해서 쓰면 됨.

#include <stdio.h>
#include "cfg.h"

int main(void) { config* cfg=getConfig(); cfg->setA(10); cfg->setB('a'); cfg->setC(123.456); printf("%d/%c/%f\n\n", cfg->getA(),cfg->getB(),cfg->getC());
getConfig()->setA(20); getConfig()->setB('b'); getConfig()->setC(456.789); printf("%d/%c/%f\n", getConfig()->getA(),getConfig()->getB(),getConfig()->getC());
return 0;
}


이거 심각한 문제점이 있는데..

config 을 하나만 생성하게 할 방법이 없다.
(물론 config을 만든다고 해서 접근가능한 건 아니다. 함수포인터가 매칭이 안됐으니 런타임에러가 나겠지.)

그냥 아무생각없이 getConfig() 만 땡겨다 쓰면 되겠지 뭐.

뭐 편한대로
config* cfg = getConfig(); cfg->뭐시기  형태로 쓰던지
그것도 귀찮으면 getConfig->뭐시기 형태로 쓰던지.

크리에이티브 커먼즈 라이선스
Creative Commons License

유리한 코드창고/변태코드

CodeGolf - 7세그먼트 출력

2009/07/17 10:01


코드골프에 올라와있던 문제.

http://codegolf.com/seven-segment-displays


#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#define l(x) (int)(pow(10,x)+0.5)
#define a(x) ((n[m%l(j+1)/l(j)]>>d+x)&0x01)
#define p(x) printf(x)
#define c(x) case x:
int main(void){
    char n[]={119,36,93,109,46,107,123,37,127,111};int i,j,d,m;char s[11];
    p("->");scanf("%s",s);m=atoi(s);
    for(i=0;i<9;i++,p("\n")){
        for(j=strlen(s)-1;j>=0;j--){d=0;
            switch(i){
                c(0)c(4)c(8)d=i==0?0:i==4?3:i==8?6:0;a(0)?p(" ***  "):p("      ");break;
                c(5)c(6)c(7)d=3;
                default:a(1)?p("*   "):p("    ");a(2)?p("* "):p("  ");
    }}}return 0;
}

이 코드가 프갤에 올려놓았던 것이었고..



디- 가 ANSI-C표준을 이용해 200byte대로 확 줄여버리면서 내가 버로우 탔음.

역시 변태코드를 양산하기엔 C99보단 ANSI C 인가..




디 -의 246byte 코드
char s[99],*p,k;int g[]={78,82,0,-35,422,92,-50};T(x,M,m,z){
printf("%s %c",g[x]-97&1<<*p-48?M:m,p[1]?32:z);}V(x)
{while(++k%5)for(p=s;*p;++p)k%5-1?x<6?T(x+1,"* ","  ",32),
T(x+2,"*"," ",10):0:T(x," *** ","     ",10);}
main(){gets(s);V(0);V(3);V(6);}
크리에이티브 커먼즈 라이선스
Creative Commons License

유리한 코드창고/변태코드

프갤러들의 자작 strrev 퍼포먼스 측정

2009/07/17 09:57

링크 -
http://gall.dcinside.com/list.php?id=programming&no=125177

본인의 경우에는 한줄짜리 / duff's device 를 이용해 두가지 버전의 코드를 생산.

void strrev1(const char* sz1, char* sz2) 
{              for(sz2+=strlen(sz1),*sz2--='\0';*sz1;*sz2--=*sz1++);     }
void strrev2(const char* sz1, char* sz2) {     int nCnt=strlen(sz1);     sz2+=nCnt;     *sz2--='\0';     switch(nCnt%8){     do{     case 0 : *sz2--=*sz1++;     case 7 : *sz2--=*sz1++;     case 6 : *sz2--=*sz1++;     case 5 : *sz2--=*sz1++;     case 4 : *sz2--=*sz1++;     case 3 : *sz2--=*sz1++;     case 2 : *sz2--=*sz1++;     case 1 : *sz2--=*sz1++;     }while((nCnt-=8)>0);} }

생각보다 duff's device 의 성능이 좋더라.

하지만 어설픈 최적화는 안하니만 못하다.

duff's device도 CPU 아키텍쳐에 따라 좆ㅋ망ㅋ 할 수도 있으니.

크리에이티브 커먼즈 라이선스
Creative Commons License

유리한 코드창고/변태코드

달팽이 알고리즘

2009/07/17 09:51



원래는 변태코드로 만들려고 했는데 생각보다 정상적인 코드가 나와버렸다.


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

enum direction{right,down,left,up};
int main(void)
{
    int row,col,input,snailsize,isturned,dir=right;    
    printf("Input : ");    scanf("%d",&input);
    snailsize=input; row=col=0;isturned=true;
    int* snail=(int*)malloc(sizeof(int)*input*input);
    for(int i=0;i<input*input;i++)
    {
        static int end=snailsize;
        *(snail+col+(row*input))=i+1;
        --end;
        if(!end)
        {
            isturned ? isturned=false,--snailsize : isturned=true;
            end=snailsize;
            dir==up ? dir=right : dir++;
        }
        dir==left   ? col-- :
        dir==right  ? col++ :
        dir==up     ? row-- :
        dir==down   ? row++ : 0;
    }
    for(int i=0;i<input*input;i++)
    {
        printf("%4d ",*(snail+i));
        !((i+1)%input) ? putchar('\n') : 0;
    }
    free(snail);

    system("pause");
    return 0;
}
크리에이티브 커먼즈 라이선스
Creative Commons License

유리한 코드창고/변태코드