Programming missions
Unscramble the words (整理单词)
大家好!自从昨天花了半个多小时,一口气将所有的 Javascript missions 搞定之后,我极度的膨胀!所以我开始下一个任务 Programming missions - 编程任务 。第一关难度 easy, 我也是这么认为的。我打开任务一看有倒计时,我首先干的事就是将倒计时停掉,我认为一定是这么搞的。然而,当我分析完任务内容,费脑扣好代码,编译 > 执行 > 复制 > 粘贴 > 提交 额!对不起:答案是正确的,但是你用了太多的时间。你有三十秒的时间,然而你用了几千秒。 看来时间也是任务的一部分,我想是不是我搞错了方向了,不应该这么搞。。。想了一整子可能需要先扒站,下载wordlist - 单词表,当场解压完成后立即执行代码,并将结果直接提交 全程根本不通过浏览器,这样才会在最快的速度搞定。em… 根据我当前的水平及自身条件(单身30年)研究决定拼!手!速!。预先下载好单词表(单词表用几次就会变更,具体是怎么变更的没有细究,反正一个单词列表是可以用几次的)。开始 > 准备好执行命令 > 刷新页面 > 快速定位元素 > 获取混乱单词列表 > 执行 > 复制 > 粘贴 > 提交 搞定!手速尚可。em…
任务描述
该等级是关于整理单词的。
从单词表中随机取出一些单词,打乱拼写顺序,然后找出这些单词,保持和下面混乱单词列表中相同的顺序,并以逗号分隔。
你有三十秒的时间(这个时间也是任务的一部分,我决定拼手速了)。
单词列表中有一千两百多个单词,通过文件读写的方式取出单词,存入到数组中【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;
}
执行
- 获取混乱单词列表
- 执行代码
- 提交
- 反馈
各位,演示中我花了67.4秒,如果你有更有效率更好的方案,请分享给我。感谢!