「OI 出题」星语 (star)
星语 (star)
时间限制:1000 ms
空间限制:512 MB
题目背景
「从杭二窗边望出去,这晚霞真的好美啊!」
「晚霞送别夕阳迎来星空」
「仰望星空,寻梦开始的地方」
「你看见星星在向你眨眼了吗?」
语言描述
别看我“星语”短小精悍,我超可爱的哦!
这是一款名为“星语”的语言,名字有深意,但你只需要关心语法和执行流程:
语法
“星语”仅由两种语句构成:普通语句和终止语句。
pattern:replacement
:普通语句。将读入串中最早出现的pattern
替换为replacement
。pattern::replacement
:终止语句。将读入串中最早出现的pattern
替换为replacement
,同时终止程序。
其中 pattern
和 replacement
均为字符串(可以为空,字符集为所有可见 ASCII 码),自动过滤其前导和末尾空格。
执行流程
当程序输入进一个字符串 \(S\) 时,“星语”会执行如下流程:
- 按照行依次执行语句,判断 \(S\) 中是否存在
pattern
。 - 如果存在,找到 \(S\) 中最左侧的匹配上
pattern
的子段,将其替换为replacement
。若该语句是终止语句,程序结束。否则回到步骤 1。 - 如果执行到程序末尾,程序结束。
你的输出即为程序结束时的 \(S\)。
例题示范 1
输入串 \(S\) 为 Hello,
,用“星语”将其修改成 World!
。
我们可以写:
Hello,:World!
当然也可以写:
Hello,::World!
例题示范 2
输入串 \(S\),将其中所有的 s
删除。
我们可以写:
s:
例题示范 3
输入串 \(S\),在 \(S\) 的开头添一个 s
。
我们可以写:
::s
题目描述
本题是一道提交答案题。
现在你已经学会了 1+1,让我们来试试吧!
注意“星语”想必大家都会写,但就像「明明 polylog 的题你非得写个树分块还调不出来」一样,咱追求的是效率。“星语”也一样,你的得分将与行数有关。
当然,如果你的程序 CE 了,或者输出错误,那自然不得分捏。
任务一:石头剪刀布
转宝现在很爱玩石头剪刀布,但是又很怕玩。原因是他每次惯性思维出剪刀,大伙们看破不说破,于是每次输的都是他。
现在输入一个长度为 \(1\) 的字符串 \(S\),其为 R
(石头,Rock)、S
(剪刀,Scissors)、P
(布,Paper)三种字符中的一种,表示转宝出的是 \(s_0\)。你的任务是赢他,即:
R -> P
S -> R
P -> S
将 \(S\) 替换为它。
样例
\(S\) 为 R
,程序执行结束后的 \(S\) 为 P
。
评分规则
得分 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|---|---|---|
行数 | 3 | 3 | 3 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
任务二:啵啵啵
回到班后,转转掌握了一个新技能:啵啵啵。简单来说就是把嘴唇抿起来,然后猛地向外弹,就会发出“啵”的一声。究其源头,还得是化竞那帮“杭二牛子”研究出来的花样。
现在给定一个全是 b
的串 \(S\ (2\le |S|\le 5)\),你的任务是在每个 b
后插入一个 o
。
样例
\(S\) 为 bbb
,程序执行结束后的 \(S\) 为 bobobo
。
评分规则
得分 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|---|---|---|
行数 | 3 | 3 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
任务三:四缺一
经典四缺一,这次是 \(1\sim 5\) 这 5 个整数中缺了一个。
给定一个长为 \(4\) 的串 \(S\),保证 \(\forall 0\le i<j<4\) 有 \(S_i\neq S_j\) 且 \(S_i\in [1,5]\),将其替换为缺失的那一个数。
样例
\(S\) 为 5241
,程序执行结束后的 \(S\) 为 3
。
评分规则
得分 | 20 | 18 | 16 | 14 | 12 | 10 | 8 | 6 | 4 | 2 |
---|---|---|---|---|---|---|---|---|---|---|
行数 | 7 | 7 | 8 | 8 | 9 | 10 | 11 | 12 | 13 | 15 |
任务四:11 的倍数
给定一个串 \(S\ (1\le |S|\le 5)\),保证不为 \(0\)(即 \(|S|=1\) 且 \(S_0\) 为 0
),判断 \(S\) 在整数下是否为 \(11\) 的倍数,若是替换为 yes
,否则替换为 no
。
样例
\(S\) 为 231
,程序执行结束后的 \(S\) 为 yes
。
评分规则
得分 | 20 | 18 | 16 | 14 | 12 | 10 | 8 | 6 | 4 | 2 |
---|---|---|---|---|---|---|---|---|---|---|
行数 | 14 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 25 | 30 |
任务五:计数
给定一个仅由 z
构成的字符串 \(S\ (1\le |S|\le 132)\),将 \(S\) 替换成 z
的个数,即 \(|S|\)。
样例
\(S\) 为 zzzzzzzzzzzzzzzz
,程序执行结束后的 \(S\) 为 16
。
评分规则
得分 | 20 | 18 | 16 | 14 | 12 | 10 | 8 | 6 | 4 | 2 |
---|---|---|---|---|---|---|---|---|---|---|
行数 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
任务六:最长上升子序列(LIS)
给定一个仅由 \(1\sim 9\) 构成的字符串 \(S\ (1\le |S|\le 27)\),将 \(S\) 替换为最长上升子序列长度。
样例
\(S\) 为 41259687899993
,程序执行结束后的 \(S\) 为 7
。
评分规则
限制应该给的比较松,欢迎踩标。
得分 | 20 | 18 | 16 | 14 | 12 | 10 | 8 | 6 | 4 | 2 |
---|---|---|---|---|---|---|---|---|---|---|
行数 | 120 | 130 | 140 | 150 | 160 | 170 | 200 | 250 | 300 | 500 |
提交方式
你只需要在选手目录下的 star/
文件夹中依次创建 star1.out
至 star6.out
,并写入相应的“星语”代码即可。
检验方式
下发文件中有一份 sample_checker.cpp
,其中函数 execute(code, S)
表示传入“星语”代码 code
以及读入 S
,函数返回“星语”程序结束后的 S
。
注意,本 checker
不会检验您输出的正确性,只能提供“星语”的评测,且与最终实际评测的 checker
大有不同,您不需要关心最终具体的评测检验方式。
花絮
考虑到“星语”可以实现的题目实在太多了,所以把剩余的题放在这里,可供 AK 的选手娱乐。
比大小
比较串 \(X,Y\) 的字典序大小,其中 \(X,Y\) 仅由 a
、b
构成。
给定串 \(S\) 为 \(X\) + ?
+ \(Y\),将 \(S\) 替换为 <
/ >
。
样例
\(S\) 为 abab?abb
,程序执行结束后的 \(S\) 为 <
。
评分
目前能做到 19 步,不知能否更优?