舞台报幕


故事

你是国际会议上的一名舞台报幕员。 你的工作是介绍演讲者、在他们时间到时提醒他们,并主持问答环节。 你会提前拿到一份你负责的舞台上的演讲者名单,需要把它做成主持卡。

由于这份名单遵循特定的格式,你决定写一个短小的程序,用正则表达式(regex)解析拿到的名单,并自动生成主持卡。

Note

这个练习的重点不是学习正则表达式。 而是学习如何在 $lang 中使用正则表达式。 提示里有一个现成的正则表达式,如果你不想自己写,可以直接用。

你拿到的名单中,每场演讲都包含以下信息:

  • 标题
  • 演讲者的姓名
  • 演讲者的代词(可选)
  • 演讲者的所属机构(可选)
  • 演讲的开始时间
  • 问答环节的开始时间(可选)
  • 以及演讲的结束时间

一条完整的记录格式如下:

»Speedrunning 101« – Sasha Duda Krall (they/them), from GDQU. Start: 13:00, Q&A: 13:20, End: 13:30

这里,标题是 Speedrunning 101,演讲者叫 Sasha Duda Krall,来自 GDQU,使用的代词是 they/them。 演讲在 13:00 开始,问答环节从 13:20 开始,整个环节在 13:30 结束。

Note

由于姓名中可能包含普通连字符 -,这里用短破折号 – 来分隔演讲者和演讲名称。

你的程序为这场演讲生成的主持卡如下所示:

- Our next speaker is Sasha Duda Krall, from GDQU
- Their talk is called »Speedrunning 101«
- They will answer your questions in the Q&A session at the end of the talk, starting at 13:20

13:00 - 13:20 - 13:30

完整的名单可能如下所示:

»Speedrunning 101« – Sasha Duda Krall (they/them), from GDQU. Start: 13:00, Q&A: 13:20, End: 13:30
»How I learned to say Farewell« – Madeline (she/her). Start: 13:40, Q&A: 14:00, End: 14:05
»How To Find a Good Title For Your Conference Talk« – Vítězslav Kruse (he/him). Start: 14:15, End: 14:40
»Why Emoji Matter❣« – Ash van Amelsvoort, from the University of 🧬🧪⚛. Start: 14:50, Q&A: 15:05, End: 15:10
»Can dogs look up?« – Kira "k1ralli" Sørensen. Start: 20:50, Q&A: 21:05, End: 21:10

对应的主持卡是:

- Our next speaker is Madeline
- Her talk is called »How I learned to say Farewell«
- She will answer your questions in the Q&A session at the end of the talk, starting at 14:00

13:40 - 14:00 - 14:05
- Our next speaker is Vítězslav Kruse
- His talk is called »How To Find a Good Title For Your Conference Talk«
- There will not be a Q&A session

14:15 - NO Q&A - 14:40
- Our next speaker is Ash van Amelsvoort, from the University of 🧬🧪⚛
- Ash's talk is called »Why Emoji Matter❣«
- Ash will answer your questions in the Q&A session at the end of the talk, starting at 15:05

14:50 - 15:05 - 15:10
- Our next speaker is Kira "k1ralli" Sørensen
- Kira's talk is called »Can dogs look up?«
- Kira will answer your questions in the Q&A session at the end of the talk, starting at 21:05

20:50 - 21:05 - 21:10

这里需要注意几点:

  • 如果演讲者没有提供所属机构,就在主持卡里省略这一项。
  • 如果没有给出问答环节的时间,说明演讲者选择不回答提问。
  • 如果演讲者没有说明代词,就用演讲者的名字来代替。 注意,这样缩写别人的名字并不总是合适,例如许多中文名字更适合保留姓氏来缩写。 不过,在这个舞台上演讲的人,恰好都适合用名字来缩写这条规则。

任务

1. 写一个正则表达式,捕获生成主持卡所需的信息

最简单的方法是用 regex101 或 RegExr 这样的正则表达式构建工具。

!!! warning 确保把正则表达式引擎/方言设置为 $CHANGE_ME。

如果你是正则表达式的新手,或者难以一下子写出一个能捕获所有必需信息的表达式,也可以定义几个更小的表达式,分别捕获其中的一部分信息。

2. 写一个函数,接收一行文本并返回生成的主持卡

使用第一部分的正则表达式,实现一个函数:接收一行文本作为输入,从中捕获信息,并按上面的规范返回生成的主持卡。

测试用例

未来可能的测试用例应遵循以下准则:

  • 分隔符必须明确无歧义。例如,演讲标题中不应包含 »«,姓名中不应包含逗号。
  • 测试用例应根据某些信息的可选性来排序。第一个用例应包含所有可能的信息,下一个用例应排除一项可捕获的信息,依此类推。
  • 如果解决方案用 [a-zA-Z] 之类的方式来匹配姓名、标题或机构,就不应该通过测试。

实现

  • Julia(参考实现)