google jam 比赛题(设计有问题)
题目:
Problem
Do you know how to read the phone numbers in English? Now let me tell you.
For example, In China, the phone numbers are 11 digits, like: 15012233444. Someone divides the numbers into 3-4-4 format, i.e. 150 1223 3444. While someone divides the numbers into 3-3-5 format, i.e. 150 122 33444. Different formats lead to different ways to read these numbers:
150 1223 3444 reads one five zero one double two three three triple four.
150 122 33444 reads one five zero one double two double three triple four.
Here comes the problem:
Given a list of phone numbers and the dividing formats, output the right ways to read these numbers.
Rules:
Single numbers just read them separately.
2 successive numbers use double.
3 successive numbers use triple.
4 successive numbers use quadruple.
5 successive numbers use quintuple.
6 successive numbers use sextuple.
7 successive numbers use septuple.
8 successive numbers use octuple.
9 successive numbers use nonuple.
10 successive numbers use decuple.
More than 10 successive numbers read them all separately.
Input
The first line of the input gives the number of test cases, T. T lines|test cases follow. Each line contains a phone number N and the dividing format F, one or more positive integers separated by dashes (-), without leading zeros and whose sum always equals the number of digits in the phone number.
Output
For each test case, output one line containing "Case #x: y", where x is the case number (starting from 1) and y is the reading sentence in English whose words are separated by a space.
Limits
1 ≤ T ≤ 100.
Small dataset
1 ≤ length of N ≤ 10.
Large dataset
1 ≤ length of N ≤ 100.
翻译:
问题
你知道如何阅读英语中的电话号码吗?现在让我告诉你。
例如,在中国,电话号码是11位数字,如: 15012233444 。有人将号码为3-4-4格式,即150 1223 3444 。虽然有人将号码为3-3-5格式,即150 122 3344 4 。不同的格式,导致不同的方式来读取这些数字:
150 1223 3444读一五零壹双三三四个。
150 122 3344 4读取一五零壹双双三三四个。
可是问题来了:
鉴于电话号码和除以格式的列表,输出正确的方式来阅读这些数字。
规则:
单数刚读它们分开。
2连续使用双。
连续3使用三倍。
4连续使用翻两番。
5连续使用五倍。
6连续使用六倍。
7连续使用七元。
连续使用8八倍。
连续使用9 nonuple 。
连续十数十倍。
超过10个连续的数字阅读他们都分开。
输入
输入的第一行给出了测试用例的数量, T. T线|测试用例遵循。每行包含一个电话号码N和除以格式F,破折号( - )分隔的一个或多个正整数,不带前导零的总和总是等于数字位数的电话号码。
产量
对于每个测试用例,输出一行包含“案例# X:Y ”,其中x是案件编号(从1开始)和y是阅读英语句子中的字是由空格分隔。
范围
1≤T≤ 100。
小数据集
1长度≤ N ≤ 10 。
大数据集
1长度≤ N ≤ 100 。
google_number_reader.py
#!/usr/bin/env python NUMBER=("ZERO","ONE","TWO","THERR","FOUR","FIVE","SIX","SEVEN","EIGHT","NINE","TEN") REPT_COUNT=("","double","triple","quadruple","quintuple", "sextuple","septuple","octuple","nonuple","decuple") class PhoneNumberReader: def set_piece_list(self,list): i = 0 sum = 0 flag_list = [0] while i < len(list): sum += int(list[i]) flag_list.append(sum) i += 1 return flag_list def cut(self,phone,flag_list): i = 0 piece_list = [] while i < len(flag_list) - 1: piece_list.append(phone[flag_list[i]:flag_list[i+1]]) i += 1 return piece_list def read_piece(self,a_piece): word_list = [] s_index = 0 repetitions = 0 cur_char = "" while True: if s_index == len(a_piece): break cur_char = int(a_piece[s_index]) if s_index + 1 < len(a_piece) and a_piece[s_index] == a_piece[s_index + 1]: repetitions += 1 s_index += 1 continue if len(REPT_COUNT[repetitions]) > 0: word_list.append(REPT_COUNT[repetitions]) word_list.append(NUMBER[cur_char]) repetitions = 0 s_index += 1 return word_list def read_piece_list(self,piece_list): word_list = [] for i in piece_list: word_list += self.read_piece(i) s = "" for i in word_list: s += i + " " return s[:-1] def read(self,line): try: phone,format = line.split(" ") format_list = format.split("-") flag_list = self.set_piece_list(format_list) piece_list = self.cut(phone,flag_list) return self.read_piece_list(piece_list) except ValueError: print line if __name__ == '__main__': try: datafile = open("A-large-practice.in","r") phone_reader = PhoneNumberReader() while True: line = datafile.readline() if not line: break phone_reader.read(line) except IOError, e: print e.strerror
test_google_number_reader.py
#!/usr/bin/env python from phone_number_reader import PhoneNumberReader import unittest class TestPhoneNumberReader(unittest.TestCase): def setUp(self): self.phone_number_reader = PhoneNumberReader() def test_344(self): s = self.phone_number_reader.read("15810665042 3-4-4") print s assert(s == "ONE FIVE EIGHT ONE ZERO double SIX FIVE ZERO FOUR TWO") #def test_443(self): # self.phone_number_reader.read("15810665042 4-4-3") #def test_353(self): # self.phone_number_reader.read("15810665042 3-5-3") #def test_353(self): # self.phone_number_reader.read("15810665042 3-5-3") if __name__ == '__main__': unittest.main()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述