CCF CSP认证 历年题目自练Day25

题目

试题编号: 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 = 1while 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 = 1while i<len(cmd):if len(cmd[i]) == 2 and cmd[i][0] == "-":# is form if cmd[i][1] in single_var:# no valueoption[cmd[i][1]]=""i+=1elif cmd[i][1] in multi_var and i+1 < len(cmd):# have valueoption[cmd[i][1]]= cmd[i+1]i+=2else:# 当你的工具遇到某个字符串既不是合法的选项,又不是某个合法选项的参数时, 分析就停止。# 命令行剩余的未分析部分不构成该命令的选项,因此你的程序应当忽略它们。# ls -a -b -c -d -e -l ; after -b is all ignored,because -cbreakelse:# ls -a -l -a documents -b# -a documents mistake ,so ignore -bbreak"""其中第 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.hqwc.cn/news/128115.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity基于种子与地块概率的开放世界2D地图生成

public class BuildingGen : MonoBehaviour {public int[] Building;//存储要生成的地块代码public int[] Probability;//存储概率public double seed;public int width 100;public int height 100;public float noiseScale 0.1f; //噪声缩放倍数private int[,] frequencyM…

axios的get请求时数组参数没有下标

开发新项目过程中 发现get请求时 数组参数没有下标 这样肯定是不行的 后端接口需要数组[0]: 7 数组[1]:4这样的数据 原因是因为在请求拦截器没有处理需要的参数 解决方法 在请求拦截器 处理一下参数 import axios, { AxiosError, AxiosInstance, AxiosRequestHeaders } fro…

制作长图海报的详细指南,制作长图海报的5个步骤

制作长图海报是宣传活动、产品或服务的重要方式之一。乔拓云后台提供了丰富的海报模板&#xff0c;让你轻松制作出专业级的长图海报。下面将介绍如何使用乔拓云后台制作长图海报的技巧。 一、选择模板 首先&#xff0c;注册并登录乔拓云后台&#xff0c;进入云设计页面。在选择…

第三次作业

自己实现扫描全盘的函数 def scan_disk(dir): global count,dir_count if os.path.isdir(dir): files os.listdir(dir) for file in files: print(file) dir_count 1 if os.path.isdir(dir os.sep file): …

Git从本地库撤销已经添加的文件或目录

场景 在提交时, 误将一个目录添加到了暂存区, 而且commit 了本地库,同批次commit 的还有其他需要提交的文件。 commit 之后发现这个目录下所有的文件都不需要提交, 现在需要撤销这个提交, 使这个目录不被push到远端库。 这里以远端服务器github 为例,在Git GUI下看到的…

腾讯云轻量和CVM有啥区别?怎么选择服务器配置?

腾讯云轻量服务器和云服务器有什么区别&#xff1f;为什么轻量应用服务器价格便宜&#xff1f;是因为轻量服务器CPU内存性能比云服务器CVM性能差吗&#xff1f;轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程序或开发测试环境&#xff0c;云服务器CV…

全网最详细的本地搭建GitLab代码仓库教学

大体的步骤 本地安装VMware虚拟机。然后再虚拟机上安装CentOs7镜像系统。在Linux中安装GitLab-Ce。在Linux中安装GitLab-Runner在自己搭建的GitLab上面创建一个项目&#xff0c;然后拉取到本地然后提交之后实现自动化部署。 步骤一 这一步骤我在之前我的安装Redis文章中有讲解…

Redis到底是什么?都有哪些特性?看完这一篇就都会了

目录 Redis是什么 Redis的应用场景有哪些&#xff1f; Redis的数据类型及主要特性 Redis的数据结构 简单动态字符串SDS (Simple Dynamic String) SDS的特点 Redis特性1&#xff1a;事务 Redis特性2&#xff1a;发布订阅(Pub/Sub) Redis特性3&#xff1a;Stream Redis…

算法通过村第十二关-字符串|黄金笔记|冲刺难题

文章目录 前言最长公共前缀纵向比较横向比较 字符串压缩问题表示数值的字符串总结 前言 提示&#xff1a;我有时候在想&#xff0c;我是真的不太需要其他人&#xff0c;还是因为跟他们在一起时没法自己&#xff0c;所以才保持距离。我们的交谈就像是平行而毫无交集的自言自语。…

多线程锁-synchronized字节码分析

从字节码角度分析synchronized实现 javap -c(v附加信息) ***.class 文件反编译 synchronized同步代码块 >>>实现使用的是monitorenter和monitorexit指令 synchronized普通同步方法 >>>调用指令将会检查方法的ACC_SYNCHRONIZED访问标志是否被设置&#xf…

新基建智慧铁路:高铁沿线综合视频监控及风险智能预警管理方案

一 、方案背景 铁路沿线安全环境直接关系铁路运输安全畅通。随着我国铁路特别是高速铁路运营里程不断增加&#xff0c;改善铁路沿线安全环境对保障铁路高质量发展和人民群众生命财产安全的作用更加突出。为了保障高铁的安全运营&#xff0c;高铁对安防尤其是视频监控的需求不断…

QT:SQLITE数据库编程

pro文件&#xff1a;QT core gui sql widget.ui main.cpp #include "widget.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w("./student.db"); //传入文件名w.show();return a.exec…