Напишите программу, которая выводит общее количество символов и частоту каждого символа в его источнике и выводе. Вы должны следовать формату, показанному в примере.
пример
Если ваш код был
abb1
Его выход должен быть
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.
(Вывод должен идти в стандартный вывод.)
Обратите внимание, например, что вывод содержит два заглавных m. Один за My
и один за 2 are "M"
. Это должно выполняться для всех символов, чтобы вывод не противоречил самому себе.
Номера без кавычек игнорируются на выходе, чтобы избежать неудовлетворительных наборов частот. Например,1 is "1"
неверно, если подсчитаны обе единицы. Это должно прочитать 2 are "1"
, но тогда есть только один 1 снова.
Формат разъяснений
«is» должен использоваться для вхождений одного символа.
«are» должен использоваться для нескольких вхождений символов.
«is» никогда не должно появляться в списке выходных символов, потому что это было бы излишним.
1 is 'Z'
относится к самому Z, поэтому вся строка может быть удалена.Три фразы в полном предложении должны появляться в том порядке, в котором между ними расположены списки частот символов (как показано в примере). Таким образом, ваш вывод будет начинаться с
My source...
и заканчивается...be a program.
. Обратите внимание, что в конце вывода нет новой строки.Сами списки частот символов могут быть в любом порядке.
Новые строки считаются одним символом (если они \ r \ n).
Проверка формата
Следующий скрипт Python принимает ваш код и его вывод в виде строк и утверждает, что вывод не имеет противоречий. Он предоставляет полезное сообщение об ошибке, если что-то не так. Вы можете запустить его в Интернете по адресу http://ideone.com/6H0ldu , разветвив его, заменив строки CODE и OUTPUT, а затем запустив его. Он никогда не даст ложных срабатываний или негативов (при условии отсутствия ошибок).
#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()
счет
Это код-гольф. Представление с наименьшим количеством персонажей выигрывает. Материалы должны пройти проверку формата, чтобы быть действительными. Применяются стандартные лазейки, хотя вы можете прочитать свой собственный исходный код и / или жестко закодировать свой вывод .
r'''CODE'''
).