超市收银线模拟
快速阅读
Dart 实现的超市收银线模拟。
$ dart bin/grocerysimulator.dart input1.txt
Finished at: t=7 minutes
概述
你需要编写一个程序来实现一个超市/收银线模拟。该程序应从文件读取输入,并将结果分数打印到控制台。该程序应该是纯控制台程序。该程序应接受一个命令行参数:输入文件的名称。
超市里的顾客会来到一系列收银台结账。每个收银台都由一名收银员负责,收银员按先到先得的原则为顾客服务。问题的目标是确定所有顾客何时完成结账。
成功解决方案最重要的标准之一是它正确地实现了要解决的问题。这将通过代码审查、使用下面演示的 5 个示例进行验收测试以及未在此页面上提供的其他测试用例来确定。
我们还将考虑你对问题的总体方法和你的编程风格。此作业是展示如何使用面向对象分析和设计技能来生成优雅、可读且可维护的解决方案的机会。请不要提交多线程或实时解决方案。请使用你认为最佳的实践来开发你的解决方案。
交付物(以下所有)
在你的最终解决方案 zip 文件中应提供以下内容
- 源代码
- 你选择的语言的最新版本(例如,Go 1.16.x、Javascript ES7/8、Typescript 4.2.x)
- 单元测试
- 你用来开发解决方案的任何其他支持性代码或其他二进制文件(即使它不需要运行解决方案)。如果某个资源很容易在网上获取,你只需提供一个链接,而无需包含文件。
问题详情
- 收银台的数量由问题输入文件指定。收银台编号为 1、2、3、……,n 个收银台。
- 时间(
t)以分钟为单位。 - 超市里总有一名新手收银员。这名收银员总是被分配到编号最高的收银台。
- 普通收银台每处理一个顾客的物品需要一分钟。新手收银员值守的收银台每处理一个物品需要两分钟。因此,在普通收银台有 n 个物品的顾客需要 n 分钟才能结账。但是,如果顾客最终到达最后一个收银台,结账将需要 2n 分钟。
- 模拟从
t=0开始。此时所有收银台都为空(即队列中没有顾客)。 - 有两种类型的顾客到达收银台
- A 类顾客总是选择排队最少的收银台。如果两个或多个收银台排队最少,A 类顾客将选择收银台编号最小的收银台(例如,1 号收银台优先于 3 号收银台)。
- B 类顾客会查看每个收银台队列中的最后一个顾客,并始终选择排在剩余物品最少的顾客后面,而不管队列中有多少其他顾客或他们有多少物品。B 类顾客总是优先选择空队列而不是有顾客的队列。
- 即将结账完成的顾客(对于任何一种顾客)都不计入队列。
- 如果两个或多个顾客同时到达,物品较少的顾客优先于物品较多的顾客选择收银台。如果顾客的物品数量相同,则 A 类顾客优先于 B 类顾客。
输入格式
输入文件的第一行是一个整数,指定收银台的数量。
随后的每一行都是一个由空格分隔的值列表。每个列表分别指定了顾客类型、顾客到达时间(以分钟为单位)以及顾客拥有的物品数量。
请参阅下面的示例了解样本输入和输出。
示例 #1
对于以下 input1.txt 文件
1
A 1 2
A 2 1
以下是发生的情况
- t=0 :模拟开始,有一个收银台,这是一个训练收银台。
- t=1 :顾客 #1(A 类)到达,有 2 个物品,去收银台 #1,收银台开始为其服务。
- t=2 :顾客 #2(A 类)到达,有 1 个物品,去收银台 #1,排在顾客 #1 后面。
- t=3 :(顾客 #1 还剩一个物品,因为第一个物品花了 2 分钟)。
- t=5 :顾客 #1 离开,收银台 #1 开始服务顾客 #2。
- t=7 :顾客 #2 离开。
这是预期的命令输出
$ go run main.go
Finished at: t=7 minutes
示例 #2
对于以下 input2.txt 文件
2
A 1 5
B 2 1
A 3 5
B 5 3
A 8 2
以下是发生的情况
- t=0 :模拟开始,有两个收银台;#2 是训练收银台。
- t=1 :顾客 #1(A 类)到达,有 5 个物品,去收银台 #1,收银台开始为其服务。
- t=2 :顾客 #2(B 类)到达,有 1 个物品,去收银台 #2,收银台开始为其服务。
- t=3 :顾客 #3(A 类)到达,有 5 个物品。由于他是 A 类顾客,他去了收银台 #1(在两个排队数量相同的收银台之间选择编号最小的),排在顾客 #1 后面。
- t=4 :顾客 #2 从收银台 #2 离开(花了 2 分钟)。(此时,收银台 #1 总共有 7 个物品:顾客 #1 的 2 个物品和顾客 #3 的全部 5 个物品。)
- t=5 :顾客 #4(B 类)到达,有 3 个物品。由于收银台 #1 的顾客有 6 个物品,而收银台 #2 为空,她去了收银台 #2,收银台开始为其服务。
- t=6 :顾客 #1 离开,收银台 #1 开始服务顾客 #3。
- t=8 :顾客 #5(A 类)到达,有 2 个物品。由于两个收银台都有一个顾客,她去了收银台 #1,排在顾客 #3 后面。
- t=11 :顾客 #3 离开,收银台 #1 开始服务顾客 #5。
- t=11 :顾客 #4 从收银台 #2 离开。
- t=13 :顾客 #5 从收银台 #1 离开。
这是预期的命令输出
$ go run main.go
Finished at: t=13 minutes
示例 #3
对于以下 input3.txt 文件
2
A 1 2
A 1 2
A 2 1
A 3 2
这是预期的命令输出
$ go run main.go
Finished at: t=6 minutes
此示例说明了已离开的顾客不计入队列的要求。
示例 #4
对于以下 input4.txt 文件
2
A 1 2
A 1 3
A 2 1
A 2 1
这是预期的命令输出
$ go run main.go
Finished at: t=9 minutes
此示例说明了物品较少的顾客优先选择队列的要求。
示例 #5
对于以下 input5.txt 文件
2
A 1 3
A 1 5
A 3 1
B 4 1
A 4 1
这是预期的命令输出
$ go run main.go
Finished at: t=11 minutes
此示例说明了 A 类顾客优先于 B 类顾客选择的要求。