Viết chương trình xuất tổng số ký tự và tần số của mỗi ký tự trong nguồn và đầu ra của nó. Bạn phải theo định dạng minh họa trong ví dụ.
Thí dụ
Nếu mã của bạn là
abb1
Đầu ra của nó sẽ phải là
My source has 4 characters.
1 is "a"
2 are "b"
1 is "1"
Besides unquoted numbers, my output has 383 characters.
34 are "
"
79 are " "
63 are """
2 are "'"
2 are ","
4 are "."
2 are "1"
2 are "B"
2 are "I"
2 are "M"
39 are "a"
4 are "b"
6 are "c"
4 are "d"
38 are "e"
3 are "g"
5 are "h"
4 are "i"
4 are "m"
3 are "n"
8 are "o"
3 are "p"
2 are "q"
38 are "r"
12 are "s"
8 are "t"
7 are "u"
3 are "y"
It's good to be a program.
(Đầu ra phải đi đến thiết bị xuất chuẩn.)
Ví dụ, lưu ý rằng đầu ra chứa hai chữ viết hoa. Một cho My
và một cho 2 are "M"
. Điều này phải giữ đúng cho tất cả các ký tự để đầu ra không mâu thuẫn với bất kỳ cách nào.
Các số không được trích dẫn được bỏ qua trong đầu ra để tránh các bộ tần số không thỏa mãn. Ví dụ: 1 is "1"
không chính xác nếu cả 2 đều được tính. Nó nên đọc 2 are "1"
, nhưng sau đó chỉ có một 1 nữa.
Định dạng làm rõ
"Là" phải được sử dụng cho các lần xuất hiện ký tự đơn.
"là" phải được sử dụng cho nhiều lần xuất hiện.
"Là" không bao giờ nên xuất hiện trong danh sách các ký tự đầu ra vì nó sẽ không cần thiết.
1 is 'Z'
đề cập đến chính Z, vì vậy toàn bộ dòng có thể được gỡ bỏ.Ba cụm từ toàn câu phải xuất hiện theo thứ tự với danh sách tần số ký tự ở giữa (như ví dụ hiển thị). Vì vậy, đầu ra của bạn sẽ bắt đầu với
My source...
và kết thúc với...be a program.
. Lưu ý rằng không có dòng mới ở cuối đầu ra.Danh sách tần số ký tự có thể theo thứ tự bất kỳ.
Dòng mới được tính là một ký tự (trong trường hợp chúng là \ r \ n).
Trình kiểm tra định dạng
Kịch bản Python sau đây lấy mã của bạn và đầu ra của nó dưới dạng chuỗi và khẳng định rằng đầu ra không có mâu thuẫn. Nó cung cấp một thông báo lỗi hữu ích nếu có gì đó không đúng. Bạn có thể chạy nó trực tuyến tại http://ideone.com/6H0ldu bằng cách sử dụng nó, thay thế các chuỗi CODE và OUTPUT, sau đó chạy nó. Nó sẽ không bao giờ đưa ra dương tính giả hoặc phủ định (giả sử không có lỗi).
#Change the CODE and OUTPUT strings to test your program
CODE = r'''abb1'''
OUTPUT = r'''My source has 4 characters.
1 is "a"
2 are "b"
1 is "1"
Besides unquoted numbers, my output has 383 characters.
34 are "
"
79 are " "
63 are """
2 are "'"
2 are ","
4 are "."
2 are "1"
2 are "B"
2 are "I"
2 are "M"
39 are "a"
4 are "b"
6 are "c"
4 are "d"
38 are "e"
3 are "g"
5 are "h"
4 are "i"
4 are "m"
3 are "n"
8 are "o"
3 are "p"
2 are "q"
38 are "r"
12 are "s"
8 are "t"
7 are "u"
3 are "y"
It's good to be a program.'''
#######################################################
import re
amountPattern = r'(\d+) (is|are) "(.)"\n'
class IntrospectionException(Exception):
pass
def getClaimedAmounts(string, errorOnIs):
groups = re.findall(amountPattern, string, re.DOTALL)
for amount, verb, char in groups:
if verb == 'is':
if errorOnIs:
raise IntrospectionException('\'1 is "%s"\' is unnecessary' % char)
elif amount != '1':
raise IntrospectionException('At "%s", %s must use "are"' % (char, amount))
elif verb == 'are' and amount == '1':
raise IntrospectionException('At "%s", 1 must use "is"' % char)
amounts = {}
for amount, verb, char in groups:
if char in amounts:
raise IntrospectionException('Duplicate "%s" found' % char)
amounts[char] = int(amount)
return amounts
def getActualAmounts(string):
amounts = {}
for char in string:
if char in amounts:
amounts[char] += 1
else:
amounts[char] = 1
return amounts
def compareAmounts(claimed, actual):
for char in actual:
if char not in claimed:
raise IntrospectionException('The amounts list is missing "%s"' % char)
for char in actual: #loop separately so missing character errors are all found first
if claimed[char] != actual[char]:
raise IntrospectionException('The amount of "%s" characters is %d, not %d' % (char, actual[char], claimed[char]))
if claimed != actual:
raise IntrospectionException('The amounts are somehow incorrect')
def isCorrect(code, output):
p1 = r'^My source has (\d+) characters\.\n'
p2 = r'Besides unquoted numbers, my output has (\d+) characters\.\n'
p3 = r"It's good to be a program\.$"
p4 = '%s(%s)*%s(%s)*%s' % (p1, amountPattern, p2, amountPattern, p3)
for p in [p1, p2, p3, p4]:
if re.search(p, output, re.DOTALL) == None:
raise IntrospectionException('Did not match the regex "%s"' % p)
claimedCodeSize = int(re.search(p1, output).groups()[0])
actualCodeSize = len(code)
if claimedCodeSize != actualCodeSize:
raise IntrospectionException('The code length is %d, not %d' % (actualCodeSize, claimedCodeSize))
filteredOutput = re.sub(r'([^"])\d+([^"])', r'\1\2', output)
claimedOutputSize = int(re.search(p2, output).groups()[0])
actualOutputSize = len(filteredOutput)
if claimedOutputSize != actualOutputSize:
raise IntrospectionException('The output length (excluding unquoted numbers) is %d, not %d' % (actualOutputSize, claimedOutputSize))
splitIndex = re.search(p2, output).start()
claimedCodeAmounts = getClaimedAmounts(output[:splitIndex], False)
actualCodeAmounts = getActualAmounts(code)
compareAmounts(claimedCodeAmounts, actualCodeAmounts)
claimedOutputAmounts = getClaimedAmounts(output[splitIndex:], True)
actualOutputAmounts = getActualAmounts(filteredOutput)
compareAmounts(claimedOutputAmounts, actualOutputAmounts)
def checkCorrectness():
try:
isCorrect(CODE, OUTPUT)
print 'Everything is correct!'
except IntrospectionException as e:
print 'Failed: %s.' % e
checkCorrectness()
Chấm điểm
Đây là môn đánh gôn. Trình với ít nhân vật nhất sẽ thắng. Đệ trình phải vượt qua trình kiểm tra định dạng để có hiệu lực. Các lỗ hổng tiêu chuẩn được áp dụng, mặc dù bạn có thể đọc mã nguồn của riêng mình và / hoặc mã hóa cứng đầu ra của bạn .
r'''CODE'''
).