CCF CSP认证 历年题目自练Day25

news2024/11/25 0:32:24

题目

试题编号: 201403-3
试题名称: 命令行选项
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
  请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一 些不是选项的参数。
  选项有两类:带参数的选项和不带参数的选项。一个合法的无参数选项的形式是一个减号后面跟单个小写字母,如"-a" 或"-b"。而带参数选项则由两个由空格分隔的字符串构成,前者的格式要求与无参数选项相同,后者则是该选项的参数,是由小写字母,数字和减号组成的非空字符串。
  该命令行工具的作者提供给你一个格式字符串以指定他的命令行工具需要接受哪些选项。这个字符串由若干小写字母和冒号组成,其中的每个小写字母表示一个该程序接受的选项。如果该小写字母后面紧跟了一个冒号,它就表示一个带参数的选项,否则则为不带参数的选项。例如, “ab: m:” 表示该程序接受三种选项,即"-a"(不带参数),“-b”(带参数), 以及"-m"(带参数)。
  命令行工具的作者准备了若干条命令行用以测试你的程序。对于每个命令行,你的工具应当一直向后分析。当你的工具遇到某个字符串既不是合法的选项,又不是某个合法选项的参数时,分析就停止。命令行剩余的未分析部分不构成该命令的选项,因此你的程序应当忽略它们。
输入格式
  输入的第一行是一个格式字符串,它至少包含一个字符,且长度不超过 52。格式字符串只包含小写字母和冒号,保证每个小写字母至多出现一次,不会有两个相邻的冒号,也不会以冒号开头。
  输入的第二行是一个正整数 N(1 ≤ N ≤ 20),表示你需要处理的命令行的个数。
  接下来有 N 行,每行是一个待处理的命令行,它包括不超过 256 个字符。该命令行一定是若干个由单个空格分隔的字符串构成,每个字符串里只包含小写字母,数字和减号。
输出格式
  输出有 N 行。其中第 i 行以"Case i:" 开始,然后应当有恰好一个空格,然后应当按照字母升序输出该命令行中用到的所有选项的名称,对于带参数的选项,在输出它的名称之后还要输出它的参数。如果一个选项在命令行中出现了多次,只输出一次。如果一个带参数的选项在命令行中出 现了多次,只输出最后一次出现时所带的参数。
样例输入
albw:x
4
ls -a -l -a documents -b
ls
ls -w 10 -x -w 15
ls -a -b -c -d -e -l
样例输出
Case 1: -a -l
Case 2:
Case 3: -w 15 -x
Case 4: -a -b

题目分析(个人理解)

  1. 题目很长,大意是给出一种命令选项的描述方法,然后输入若干命令,需要按照给出的规则解析指令参数,忽略无效部分,然后按顺序输出有效部分。
  2. 此题还是先看输入,第一行输入模式串,第二行输入命令行的个数,由于模式串每个元素后面是否有冒号存在不同算法,所以,我将有冒号也就是要输出参数的元素放入multi_var = [] 然后将没有冒号,也就是不需要输出参数的元素存入multi_var = [],为什么这么做,因为后续还要判断要输出参数的元素有多个参数出现之后的取值问题。将复杂的问题分解,简单化之后逐一解决。
  3. 现在处理命令行的问题,命令行中的命令由空格分开,且如果不是带参数的命令长度不可能超过2,(由题意可知,每个符合命令格式的都是一个符号后面带一个字符,如果有参数则字符后面是参数值)也就是合法的长度只有可能是2或三个,如果超过即为不合法。
  4. 将命令行字符去空格(.split()方法)之后存入cmd[]中,注意split()方法是针对字符串的操作,去空格之后存入列表(返回值是列表)。现在只需判断每个cmd中的第一层列表的元素个数是否是2且第二层列表的第1个值是否是‘-’即可。
for m in range(n):
    cmd = input().split()
    option = dict()
    i = 1
    while i<len(cmd):
        if len(cmd[i]) == 2 and cmd[i][0] == "-":
  1. 如果是那么就是符合模式串的输出算法,进行下一步判断,到底是带参数还是不带参数,前面我将带参数和不带参数的模式串分别存放在了列表multi_var = []和single_var = []中。
  2. 那就只需要cmd中第二层列表的第二个元素,判断在哪个列表中不就完事了?好!问题又来了,输出的格式是满足输出算法的字符和参数,那有些值没参数,有些有参数,参数还要输出最后一次出现的参数,那我只能放在字典中,我使key赋值为符合输出算法的字符,value赋值为每个符合输出算法的参数,如果没有参数,那值设置为空即可。循环一次就更新写入一个item到字典option中,字典对于同一个key赋值两次的时候后一次覆盖前一次,那么就解决了符合输出算法的字符串的值如果有多次的话取最后一次的问题,关于输出还有一个要注意的,就是按照字母升序的顺序输出,那很容易,我直接把keys拿出来搞一个列表用sort()函数排序,然后再按排好的keys输出,然后遍历option中对应的keys的value有没有值,如果有就输出没有就空格和下一个分开就OK
  3. 前面第5点已经讲过如何判断带参数还是不带参数的符合输出算法的字符串。之后只需要将带参数的字符对应的参数值赋值给对应的value即可。
  4. 上代码!!!
form = input()
n = int(input())

single_var = []#存储不带参数的
multi_var = []#存储带参数的

# store options
form += " "
for i in range(len(form)-1):
    if form[i+1]==':':
        multi_var.append(form[i])
    elif form[i]!=':':
        single_var.append(form[i])

for m in range(n):
    cmd = input().split()
    option = dict()
    i = 1
    while i<len(cmd):
        if len(cmd[i]) == 2 and cmd[i][0] == "-":
            # is form 
            if cmd[i][1] in single_var:
                # no value
                option[cmd[i][1]]=""
                i+=1
            elif cmd[i][1] in multi_var and i+1 < len(cmd):
                # have value
                option[cmd[i][1]]= cmd[i+1]
                i+=2
            else:
                # 当你的工具遇到某个字符串既不是合法的选项,又不是某个合法选项的参数时, 分析就停止。
                # 命令行剩余的未分析部分不构成该命令的选项,因此你的程序应当忽略它们。
                # ls -a -b -c -d -e -l ; after -b is all ignored,because -c
                break
        else:
            # ls -a -l -a documents -b
            # -a documents mistake ,so ignore -b
            break
    
    """
    其中第 i 行以"Case i:" 开始,然后应当有恰好一个空格,
    然后应当按照字母升序输出该命令行中用到的所有选项的名称,对于带参数的选项,在输出它的名称之后还要输出它的参数。如果一个选项在命令行中出现了多次,只输出一次。
    如果一个带参数的选项在命令行中出 现了多次,只输出最后一次出现时所带的参数。
    """
    keys = list(set(option.keys()))
    keys.sort()
    print("Case "+str(m+1)+":",end="")

    for key in keys:
        print(" -"+key,end="")
        if option[key]!="":
            print(" "+option[key],end="")
    print()
    
    



总结

CCF CSP认证的难度是按照题目序号升序增加的,所以今天试着挑战一下14年第三题,已经脑阔要爆炸,继续加油!
请添加图片描述
一个月没跑,感觉要废了,以后在csdn打卡跑步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1071249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决远程git服务器路径改变导致本地无法push的问题

解决远程git服务器路径改变导致本地无法push的问题 &#xff08;1&#xff09;第一步&#xff1a;查看git配置 git config -l&#xff08;2&#xff09;第二步&#xff1a;删除远程git地址 git remote remove origin&#xff08;3&#xff09;第三步&#xff1a;再次查看git配…

JUC第十九讲:Java线程池实现原理及其在美团业务中的实践

JUC第十九讲&#xff1a;Java线程池实现原理及其在美团业务中的实践 随着计算机行业的飞速发展&#xff0c;摩尔定律逐渐失效&#xff0c;多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池ThreadPoolExecutor类&#xff0c;帮…

Vue中如何进行图像识别与人脸对比(如百度AI、腾讯AI)

Vue中的图像识别与人脸对比 在现代Web应用程序中&#xff0c;图像识别和人脸对比技术越来越受欢迎。它们可以用于各种用途&#xff0c;如人脸识别门禁系统、图像分类和验证等。百度AI和腾讯AI是两个流行的人工智能平台&#xff0c;它们提供了强大的图像识别和人脸对比API。本文…

【threejs】基本编程概念及海岛模型展示逻辑

采用three封装模式完成的海岛动画&#xff08;点击这里查看&#xff09; 直接上代码吧 <template><div class"scene"><video id"videoContainer" style"position:absolute;top:0px;left:0px;z-index:100;visibility: hidden"&g…

37.普利姆(Prim)算法

从一个问题开始 “要想富&#xff0c;先修路”&#xff0c;郝乡长最近为了德胜乡修路的事情愁白了头。 得胜乡有A、B、C、D、E、F、G七个村子&#xff0c;现在需要修路把7个村庄连通&#xff0c;但是又想要耗费的公路建材最少&#xff08;修建公路的总里程最短&#xff09;&…

强烈推荐这5款功能强大的小软件

​ 今日的栽种&#xff0c;明日的果实&#xff0c;今天继续分享五个功能强大的小软件。 1.文本编辑——IDM UltraEdit ​ IDM UltraEdit是一款功能强大的文本编辑器&#xff0c;它支持多种编程语言和文件格式&#xff0c;可以处理大型文件&#xff0c;进行代码折叠&#xff0…

IDEA插件版本升级和兼容新版本idea

1.关于IDEA插件的版本设置问题 打开jetbrains插件市场&#xff0c;随意打开一个插件详情页面的Versions菜单&#xff0c;我们可以看见一个插件包不同时期发布的不同版本&#xff08;Versions&#xff09;&#xff0c;并且每个版本包含了可兼容IDEA或PyCharm的版本范围&#xf…

文件智能管理将文件统一保存在某个指定文件夹中

日常工作中经常会整理文件到指定的文件夹&#xff0c;少的时候用鼠标拖拖&#xff0c;多了就很麻烦了&#xff0c;手动操作很容易出现漏洞&#xff0c;会漏个某文件没有移动进去或出现重复移动同一个文件等&#xff0c;移动文件这种工作很枯燥可以交给文件批量改名高手软件&…

Excel宏管理库存清单

1. 开启宏: - 打开 Excel - 选择 “文件” > “选项” > “自定义功能区” > “开发工具” &#xff0c;将其添加到功能区。 - 返回Excel界面&#xff0c;点击 “开发工具” 选项卡。 2.准备你的库存清单&#xff1a; - 在一个新的工作表中创建你的库存清单。…

【QT入门1】

目录 1.创建工程时基类的选择 2.第一个QT程序 3.创建一个按钮 4.对象树简单理解 5.信号和槽 5.1自定义信号槽 5.2信号连接信号 5.3信号函数和槽函数的注意事项 5.4配合lambda表达式 1.创建工程时基类的选择 在创建工程时会被要求选择一个基类&#xff1a; 这里有三个…

【Java】语法特性篇

语法特性篇 Java对象的比较 1. 对象比较的问题 Java中引用类型的变量不能直接按照 > 或者 < 方式进行比较。那为什么可以比较&#xff1f; 因为&#xff1a;对于用户实现自定义类型&#xff0c;都默认继承自Object类&#xff0c;而Object类中提供了equal方法&#xf…

Kafka实战案例

kafka系统的生成&#xff0c;自顶向下 1. kafaka发送消息 1.1 是最初始外部调用kafaka的地方1.6 是最初调用kafaka的函数。中间是对kafaka的构建 1.1 向Kafka发送一条发布视频的message 在videoHandler的发布视频逻辑中&#xff0c;向Kafka发送一条发布视频的mq&#xff0c…

Ubuntu 22.04 安装系统 手动分区 针对只有一块硬盘 lvm 单独分出/home

自动安装的信息 参考自动安装时产生的分区信息 rootyeqiang-MS-7B23:~# fdisk /dev/sdb -l Disk /dev/sdb&#xff1a;894.25 GiB&#xff0c;960197124096 字节&#xff0c;1875385008 个扇区 Disk model: INTEL SSDSC2KB96 单元&#xff1a;扇区 / 1 * 512 512 字节 扇区大…

基于Springboot实现论坛管理系统项目演示【项目源码+论文说明】分享

基于Springboot实现论坛管理系统演示 摘要 在社会快速发展的影响下&#xff0c;论坛管理系统继续发展&#xff0c;使论坛管理系统的管理和运营比过去十年更加信息化。依照这一现实为基础&#xff0c;设计一个快捷而又方便的网上论坛管理系统是一项十分重要并且有价值的事情。对…

排序(order by)

MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 语法格式: select */列名 from 表名 order by 列名1 asc/desc, 列名2 asc/desc; 说明&#xff1a; 排序的目的&#xff1a;改变查询结果的返回顺序…

学习笔记(css穿透、vue-cookie、拦截器、vuex、导航守卫、token/Cookie、正则校验)

目录 一、记录 1、CSS穿透 2、输入框是否提示输入 3、插槽 #slot 4、v-deep深入改掉属性值 二、vue-cookie 1、官方文档 2、使用 三、拦截器 1、请求拦截器 2、响应拦截器 四、vuex对信息存取改 五、路由导航守卫 1、登录思路 2、设置白名单 六、Token与Cookie…

vue3 集成 tailwindcss

tailwindcss 介绍 Tailwind CSS 是一个流行的前端框架&#xff0c;用于构建现代、响应式的网页和 Web 应用程序。它的设计理念是提供一组可复用的简单、低级别的 CSS 类&#xff0c;这些类可以直接应用到 HTML 元素上&#xff0c;从而加速开发过程并提高样式一致性。 主要特点…

【数据结构与算法】二叉树的实现以及二叉排序数的实现

目录 通过数组实现二叉树 通过链表实现二叉树 排序二叉树的实现 通过数组实现二叉树 该实现方式只能用于完全二叉树&#xff0c;因为如果是普通二叉数的话&#xff0c;数组中会出现空隙&#xff0c;会导致空间的利用率会降低。 实现思路&#xff1a; 因为假设一个父节点的…

原码反码补码移码的介绍和计算

1.原码 原码的定义&#xff1a;十进制数据的二进制表示形式就是原码。 &#xff08;1&#xff09;原码的最左边那位是符号位&#xff0c;其他位为数据位&#xff0c;符号位是0则为正数&#xff0c;符号位是1则为负数。 &#xff08;2&#xff09;一个byte有8bit&#xff0c;最…

Node-RED系列教程-25node-red获取天气

安装节点:node-red-contrib-weather 节点图标如下: 使用说明:node-red-contrib-weather (node) - Node-RED 流程图中填写经度和纬度即可。 演示: json内容: {