输出困惑,答案出错了

时间:2014-09-30 15:57:41

标签: python python-2.7

任务PTICE,COCI 2008/2009, Contest #1 – October 18, 2008

  

Adrian,Bruno和Goran想加入鸟类爱好者的行列。俱乐部。然而,   他们不知道所有申请人都必须通过入学考试。该   考试由N个问题组成,每个问题都有三个可能的答案:A,   BC

     

不幸的是,他们无法告诉鲸鱼这样的鸟儿   试图猜出正确的答案。

     

这三个男孩中的每一个都有一套关于什么样的答案会起作用的理论   最好的:

     
      
  • Adrian声称最佳顺序为:A, B, C, A, B, C, A, B, C, A, B, C ...
  •   
  • 布鲁诺确信这更好:B, A, B, C, B, A, B, C, B, A, B, C ...
  •   
  • Goran嘲笑他们并将使用这个序列:C, C, A, A, B, B, C, C, A, A, B, B ...
  •   
     

编写一个程序,给出正确的考试答案,   确定三者中哪一个是正确的 - 其序列包含   最正确的答案。

     

INPUT

     

第一行包含整数N1 ≤ N ≤ 100),数量为   关于考试的问题。第二行包含N字符串   字母'A''B''C'。这些都是正确的   答案中的问题。

     

输出

     

在第一行输出M,即最大数量的正确答案   三个男孩中的一个得到了。之后,输出男孩的名字   (按字母顺序),其序列导致M正确   答案。

     

示例

     

输入

5 
BAACC 
     

输出

3 
Bruno 
     

输入

9 
AAAABBBBB 
     

输出

4 
Adrian 
Bruno 
Goran

我的代码:

my_i = input()
my_inp = raw_input()

my_dict = {
    'Adrian' : ('A','B','C')*my_i,
    'Bruno' : ('B','A','B','C')*my_i,
    'Goran' : ('C','C','A','A','B','B')*my_i
    }

my_list = []

for i in my_inp:
    i = str(i)
    my_list.append(i)

A = 0
B = 0
C = 0

for i in range(my_i):
    if my_list[i] == my_dict['Adrian'][i]:
        A += 1

    elif my_list[i] == my_dict['Bruno'][i]:
        B += 1

    elif my_list[i] == my_dict['Goran'][i]:
        C += 1

a = False
b = False
c = False
a1 = 'Adrian'
b1 = 'Bruno'
c1 = 'Goran'

if A > B and A > C:
    a = True

elif A < B and B > C:
    b = True

elif A < C and B < C:
    c = True

else:
    a,b,c = True,True,True

print A,B,C
print max(A,B,C)

if a == True:
    print a1
elif b == True:
    print b1
elif c == True:
    print c1

我想知道谁将通过考试。


输入

9 
AAAABBBBB 

输出

4 
Adrian 

我没有得到任何错误,但在这里它只打印Adrian。 Adrian = 4 Bruno = 3 Goran = 2

1 个答案:

答案 0 :(得分:0)

你遇到的问题是你正在使用elif来比较男孩的猜测和实际的答案 - 如果不止一个男孩的答案相同,那该怎么办?

相反,请将每项检查设为单独的if

for i in range(my_i):
    if my_list[i] == my_dict['Adrian'][i]:
        A += 1
    if my_list[i] == my_dict['Bruno'][i]:
  # ^ not elif
        B += 1    
    if my_list[i] == my_dict['Goran'][i]:
  # ^ not elif
        C += 1

请注意,您可以使用itertools.cyclezip以更少的重复次数执行此操作:

from itertools import cycle

N = 5 # or int(raw_input()) - this number isn't used
answers = "BAACC" # or raw_input()

boys = {'Adrian': cycle("ABC"),
        'Bruno': cycle("BABC"),
        'Goran': cycle("CCAABB")}

scores = {boy: sum(c1 == c2 for c1, c2 in zip(answers, guesses))
          for boy, guesses in boys.items()}

max_score = max(scores.values())

print max_score
for boy, score in sorted(scores.items()):
    if score == max_score:
        print boy

通过避免每个男孩(ABC)的正确答案数量的单独(且名称不当)变量,他们的名字(a1b1c1)以及他们是否获得最高分(abc),这减少了重复的代码和可以更容易地将其他人(使用他们自己的猜测策略)添加到字典中。