HackThisSite Programming missions Unscramble the words

Unscramble the words (整理单词)

大家好!自从昨天花了半个多小时,一口气将所有的 Javascript missions 搞定之后,我极度的膨胀!所以我开始下一个任务 Programming missions - 编程任务 。第一关难度 easy, 我也是这么认为的。我打开任务一看有倒计时,我首先干的事就是将倒计时停掉,我认为一定是这么搞的。然而,当我分析完任务内容,费脑扣好代码,编译 > 执行 > 复制 > 粘贴 > 提交 额!对不起:答案是正确的,但是你用了太多的时间。你有三十秒的时间,然而你用了几千秒。 看来时间也是任务的一部分,我想是不是我搞错了方向了,不应该这么搞。。。想了一整子可能需要先扒站,下载wordlist - 单词表,当场解压完成后立即执行代码,并将结果直接提交 全程根本不通过浏览器,这样才会在最快的速度搞定。em… 根据我当前的水平及自身条件(单身30年)研究决定拼!手!速!。预先下载好单词表(单词表用几次就会变更,具体是怎么变更的没有细究,反正一个单词列表是可以用几次的)。开始 > 准备好执行命令 > 刷新页面 > 快速定位元素 > 获取混乱单词列表 > 执行 > 复制 > 粘贴 > 提交 搞定!手速尚可。em…

任务描述

mission describe
该等级是关于整理单词的。
从单词表中随机取出一些单词,打乱拼写顺序,然后找出这些单词,保持和下面混乱单词列表中相同的顺序,并以逗号分隔。
你有三十秒的时间(这个时间也是任务的一部分,我决定拼手速了)。

单词列表中有一千两百多个单词,通过文件读写的方式取出单词,存入到数组中【wordlist】,然后将上面的混乱单词列表作为代码的执行参数也放入到数组中【argv】。遍历argv 在 wordlist 中匹配单词。
匹配单词用到了两个函数 strspn 和 struocpm,strspn 是C语言库函数 <string.h> 中的函数:检索字符串 str1 中第一个不在字符串 str2 中出现的字符下标。struocpm 是我自己写的通过求和来比较无序的两个字符串是否相等。

扣 Code

/* date time: 2021-04-24 14:13:20 */
/* 代码写的潦草没有优化,并且使用中文注释,请见谅!*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int struocpm(char *str1,int len1, char *str2, int len2);

/* @argv 执行参数数组,即混乱单词表数组*/
int main(int argc, char **argv)
{
        FILE *fp = NULL;
        char code;
        size_t size = 0; /* 单词数组大小 */
        size_t wordlen = 0; /* 单词长度 */
        size_t word_maxlen = 0; /* 最长单词长度 */
        size_t word_count = 0; /* 单词总数量 */
        char **wordlist = NULL; /* 单词表数组 */
        char *tmp_world = NULL; /* 临时存放读取的单词 */
        int tmp_len = 0;
        int i, j;
        
        fp = fopen("wordlist.txt", "r"); /* 读取已经下载好的单词表(解压后的)*/
        if(fp == NULL) {
                exit(0);
        }
        printf("\n------------ read wordlist ------------\n\n");

		/* 第一次统计一共有多少个单词,找出最长的单词长度 */
        while((code = fgetc(fp)) != EOF) {
                if (code == '\n') {
                        wordlen = 0;
                        if (wordlen > word_maxlen) {
                                word_maxlen = wordlen;
                        }
                }
                wordlen++;
                size++;
        }

        rewind(fp);
        
        wordlist = (char **)calloc(size, sizeof(char)); /* 初始化单词表数组 */
        tmp_world = (char *)calloc(word_maxlen, sizeof(char)); /* 以最大单词长度初始化字符串 */
        wordlen = 0;
        while((code = fgetc(fp)) != EOF) {
                if (code == '\n') {
                        wordlist[word_count] = (char *)calloc(wordlen, sizeof(char));
                        strncat(wordlist[word_count], tmp_world, wordlen);
                        wordlist[word_count][wordlen - 1] = '\0';
                        word_count++;
                        wordlen = 0;
                        memset(tmp_world, '\0', word_maxlen);
                        continue;
                }
                tmp_world[wordlen] = code;
                wordlen++;
        }
        printf("word count: %zu\n", word_count);

        printf("\n------------ match word ------------\n\n");
        for (j = 1; j < argc; j++) {
                tmp_len = strlen(argv[j]);
                for (i = 0; i < word_count; i++) {
                        if (strspn(argv[j], wordlist[i]) == tmp_len &&
                                struocpm(argv[j], tmp_len, wordlist[i], strlen(wordlist[i]))) {
                                printf("%s",wordlist[i]);
                                if (j < argc - 1) {
                                		/* 为了可以快速复制,不输出最后一个逗号 */
                                        printf(",");
                                }
                                break;
                        }
                }
        }
        printf("\n\ndone.\n");
        free(tmp_world);
        free(wordlist);
        fclose(fp);
        return 0;
}


int struocpm(char *str1,int len1, char *str2, int len2)
{
        int i;
        int str1_val = 0;
        int str2_val = 0;
        for(int i = 0; i < len1; i++) {
                str1_val += str1[i];
        }
        for(int i = 0; i < len2; i++) {
                str2_val += str2[i];
        }
        return str2_val == str1_val;
}

执行

  1. 获取混乱单词列表ul wordlist
  2. 执行代码 action
  3. 提交sumit
  4. 反馈result
    各位,演示中我花了67.4秒,如果你有更有效率更好的方案,请分享给我。感谢!
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值