Напишіть програму, яка виводить загальну кількість символів та частоту кожного символу в його джерелі та його виході. Ви повинні слідувати формату, проілюстрованому в прикладі.
Приклад
Якщо ваш код був
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.
(Вихід повинен перейти до stdout.)
Зауважте, наприклад, що висновок містить два великих літери m. Один за Myі один для 2 are "M". Це має бути справедливим для всіх символів, щоб вихід ні в якому разі не суперечив собі.
Невизначені числа ігноруються у висновку, щоб уникнути незадовільних наборів частот. Наприклад, 1 is "1"неправильно, якщо зараховуються обидва 1. Він повинен читати 2 are "1", але тоді знову є лише 1.
Роз'яснення форматування
"є" необхідно використовувати для одиночних подій символів.
"are" повинні використовуватися для кількох подій символів.
"є" ніколи не повинна відображатися у списку вихідних символів, оскільки це було б зайвим.
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''').