Basit bir takvim programı ne kadar küçültülebilir?

Kaynak: https://bisqwit.iki.fi/jutut/kuvat/programming_examples/obfuscated/
Bu yazımda kısa kod yazmanın sınırlarını zorlayacağım. Kısa kod yazmak her zaman daha iyi olduğu manasına gelmez. Devam ettirilebilmesi için anlaşılması gerekir. Hem yazan hem diğer programcı okuyup programı geliştirebilsin. Derleyicinin nasıl çalıştığını bildikten sonra kod optimize edilebilir.

İşte Karşınızda basit bir saat programı. Ne yapacağını tahmin etmek kolay değil mi?

Çok bilinen hali:
#include <sys/time.h>
#include <stdio.h>
int main(void)
{
    time_t t;
    struct tm* tm;

    t = time(NULL); /* Get current time in seconds */
    tm = localtime(&t); /* Transform a timestamp to broken-down time, relative to user's timezone */

    switch(tm->tm_hour) /* Choose action from the hour value */
    {
        case 4:case 5:case 6:case 7:
        case 8:case 9:case 10:case 11:
            printf("Good morning!\n");
            break;
        case 12:case 13:case 14:
            printf("Good day!\n");
            break;
        case 15:case 16:case 17:
            printf("Good afternoon!\n");
            break;
        case 18:case 19:case 20:case 21:
            printf("Good evening!\n");
            break;
        default:
            printf("Good night!\n");
            break;
    }
    return 0;
}


Hadi biraz sadeleştirelim. Yine ne yaptığını tahmin edebiliyoruz. Vakit değiştikçe mesaj değişiyor. Yaptığı şey aynı.
#include <sys/time.h>
#include <stdio.h>
int main(void) /* revision 3 */
{
    static const char* const words[] = {"morning","day","afternoon","evening","night"};
    static const int per_hour[24] = {4,4,4,4, 0,0,0,0,0,0,0,0, 1,1,1, 2,2,2, 3,3,3,3, 4,4};

    time_t t = time(NULL);
    struct tm* tm = localtime(&t);

    return printf("Good %s!\n", words[ per_hour[ tm->tm_hour ] ] );
}


Neden bir değişkene ihtiyacımız olsun ki?
#include <sys/time.h>
int main(void)/* revision 6 */{time_t t=time(0);
static const char*const w[]={"morning","day","afternoon","evening","night"};
return printf("Good %s!\n",w["444400000001112223333444"[(localtime(&t))->tm_hour]&7]);}


Karakter işaretçisi ile değişkene istiyacım kalmadı. Şimdi anlayabiliyor musunuz?
#include <time.h>
char*d="AAAA########+++///9999AA Good %s!\n\0morning\0day\0afternoon\0evening\0night";
int main()/* revision 8*/{time_t t=time(0);return printf(d+25,d+d[localtime(&t)->tm_hour]);}

Yorumlar

Popüler Yayınlar