微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

string – 创建一个随机显示符合指定正则表达式的文本的应用程序

OK,所以在Code-Golf的精神,我在这里尝试新的东西:Code-Bowling。

在高尔夫球,你试图得到最低的得分(最小的应用程序,最优雅等)。在保龄球,你试图得到最高分。所以,如果你遵循,Code-Bowling挑战的目标是使最大,最混蛋,最难维护的代码仍然满足挑战的要求。然而,没有意义,使源更长只是为了它的缘故。它需要看起来像添加的长度是从设计,而不只是填充。

这里是这个挑战:

用您选择的语言编写一个程序,创建一行文本输出并终止。创建的输出必须与此正则表达式匹配:

/^Good (Morning|Afternoon|Evening|Night)$/

输出可以是随机的(使用语言或您自己的实现)或混乱的(确定性的,但不是微不足道的)。

/*
 * Todo: write manpage
 */

#include <assert.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define ERROR_MAX   2048    /* arbitrary,must account for argv[0] */

#define MSG_SIZE    (5+9+1) /* +1 for newline,+1 for NUL */

#if defined(linux) || defined(BSD) && BSD > 199300L
extern char const *__progname;
# define progname __progname
#else
static char *progname;
#endif

typedef enum _Progerr {
    IO_ERR = 1,RND_ERR = 2
} progerr_t;

static const char GREET_START[5] = "Good";  /* XXX move to Makefile? */

static const char *TIMES_OF_DAY[5] = {
    "Morning","Afternoon","Evening","Night",NULL
};

int main()
{
    char errbuf[ERROR_MAX];
    char msgbuf[MSG_SIZE];
    char *slash;
    const char **time_of_day;
    int fd,rnd;
    size_t greet_len;

#ifndef progname
    /* we want proper error messages */
    progname = argv[0];
    if ((slash = strrchr(progname,'/')) != NULL)
        progname = slash+1;
#endif

    /* get REAL randomness; can't trust rand(3).
     * avoid stdio,it's slow. */
#ifdef DEBUG
    write(STDERR_FILENO,"getting random data\n",sizeof("getting random data\n")-1);
#endif
    if ((fd = open("/dev/urandom",O_RDONLY)) == -1) {
        if ((fd = open("/dev/random",O_RDONLY)) == -1)
            rnd = rand();   /* last resort,for MSYS etc. */
    }

    if (fd >= 0 && read(fd,&rnd,sizeof(int)) != sizeof(int)) {
        close(fd);
        goto rngerr;
    }

    /* higher bits of rand() have better entropy */
    assert(sizeof(int) >= 4);   /* should be compile-time assert */
    rnd = (rnd >> 24) & 0x03;

    for (time_of_day = TIMES_OF_DAY; *time_of_day && rnd; time_of_day++,rnd--)
        ;
    if (!time_of_day)
        goto rngerr;

    sprintf(msgbuf,"%s %s",GREET_START,*time_of_day);
    greet_len = strlen(msgbuf);
    msgbuf[greet_len] = '\n';
    if (write(STDOUT_FILENO,msgbuf,greet_len+1) == -1)
        goto write_err;

    return 0;

rngerr:
    sprintf(errbuf,"%s: cannot get random data\n",progname);
    write(STDERR_FILENO,errbuf,strlen(errbuf));
    return (int)RND_ERR;

write_err:
    sprintf(errbuf,"%s: cannot write to stdout\n",strlen(errbuf));
    return (int)IO_ERR;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐