超市收银线模拟

快速阅读

Dart 实现的超市收银线模拟。

$ dart bin/grocerysimulator.dart input1.txt
Finished at: t=7 minutes

概述

你需要编写一个程序来实现一个超市/收银线模拟。该程序应从文件读取输入,并将结果分数打印到控制台。该程序应该是纯控制台程序。该程序应接受一个命令行参数:输入文件的名称。

超市里的顾客会来到一系列收银台结账。每个收银台都由一名收银员负责,收银员按先到先得的原则为顾客服务。问题的目标是确定所有顾客何时完成结账。

成功解决方案最重要的标准之一是它正确地实现了要解决的问题。这将通过代码审查、使用下面演示的 5 个示例进行验收测试以及未在此页面上提供的其他测试用例来确定。

我们还将考虑你对问题的总体方法和你的编程风格。此作业是展示如何使用面向对象分析和设计技能来生成优雅、可读且可维护的解决方案的机会。请不要提交多线程或实时解决方案。请使用你认为最佳的实践来开发你的解决方案。

交付物(以下所有)

在你的最终解决方案 zip 文件中应提供以下内容

  1. 源代码
    1. 你选择的语言的最新版本(例如,Go 1.16.x、Javascript ES7/8、Typescript 4.2.x)
    2. 单元测试
  2. 你用来开发解决方案的任何其他支持性代码或其他二进制文件(即使它不需要运行解决方案)。如果某个资源很容易在网上获取,你只需提供一个链接,而无需包含文件。

问题详情

  1. 收银台的数量由问题输入文件指定。收银台编号为 1、2、3、……,n 个收银台。
  2. 时间(t)以分钟为单位。
  3. 超市里总有一名新手收银员。这名收银员总是被分配到编号最高的收银台。
  4. 普通收银台每处理一个顾客的物品需要一分钟。新手收银员值守的收银台每处理一个物品需要两分钟。因此,在普通收银台有 n 个物品的顾客需要 n 分钟才能结账。但是,如果顾客最终到达最后一个收银台,结账将需要 2n 分钟。
  5. 模拟从 t=0 开始。此时所有收银台都为空(即队列中没有顾客)。
  6. 有两种类型的顾客到达收银台
    1. A 类顾客总是选择排队最少的收银台。如果两个或多个收银台排队最少,A 类顾客将选择收银台编号最小的收银台(例如,1 号收银台优先于 3 号收银台)。
    2. B 类顾客会查看每个收银台队列中的最后一个顾客,并始终选择排在剩余物品最少的顾客后面,而不管队列中有多少其他顾客或他们有多少物品。B 类顾客总是优先选择空队列而不是有顾客的队列。
  7. 即将结账完成的顾客(对于任何一种顾客)都不计入队列。
  8. 如果两个或多个顾客同时到达,物品较少的顾客优先于物品较多的顾客选择收银台。如果顾客的物品数量相同,则 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 类顾客选择的要求。

GitHub

查看 Github