총 문자 개수와 각 문자 소스의 주파수를 출력하는 프로그램을 작성 하고 , 출력한다. 예제에 설명 된 형식을 따라야합니다.
예
코드가
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"
. 출력이 어떤 식 으로든 모순되지 않도록 모든 문자에 대해 true를 유지해야합니다.
따옴표없는 숫자는 만족할 수없는 주파수 세트를 피하기 위해 출력에서 무시됩니다. 예를 들어, 1 is "1"
두 1을 모두 세면 올바르지 않습니다. 읽어야 2 are "1"
하지만 다시 하나만 있습니다.
형식 설명
단일 문자 발생에는 "is"를 사용해야합니다.
"are"는 여러 문자 발생에 사용해야합니다.
"is"는 불필요하기 때문에 출력 문자 목록에 나타나지 않아야합니다.
1 is 'Z'
Z 자체를 참조하므로 전체 라인을 제거 할 수 있습니다.세 개의 전체 문장 구가 문자 빈도 목록 사이에 순서대로 나타나야합니다 (예 참조). 따라서 출력은로 시작
My source...
하고로 끝납니다...be a program.
. 출력 끝에 줄 바꿈이 없습니다.문자 빈도 목록 자체는 임의의 순서로있을 수 있습니다.
줄 바꿈은 하나의 문자로 계산됩니다 (\ r \ n 인 경우).
포맷 검사기
다음 Python 스크립트는 코드와 출력을 문자열로 가져오고 출력에 모순이 없음을 주장합니다. 문제가있는 경우 유용한 오류 메시지를 제공합니다. http://ideone.com/6H0ldu 에서 온라인으로 실행할 수 있습니다 . 그것은 오탐 (false positive) 또는 부정 (negative)을 제공하지 않습니다 (오류가 없다고 가정).
#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'''
)을 사용하십시오.