2014-09-30 98 views
-4

任务PTICE,COCI 2008/2009, Contest #1 – October 18, 2008混淆输出并回答出错

阿德里安,布鲁诺和戈兰想加入鸟类爱好者俱乐部。但是,他们并不知道所有申请人都必须通过入学考试。 考试包含N问题,每个问题都有三个可能的答案:A, BC

不幸的是,他们不能告诉一只鲸鱼,所以他们试图猜测正确的答案是 。

这三个男孩有什么设置答案的理论将工作 最佳:

  • 阿德里安声称,最好的顺序是:A, B, C, A, B, C, A, B, C, A, B, C ...
  • 布鲁诺相信,这是更好的:B, A, B, C, B, A, B, C, B, A, B, C ...
  • 戈兰嘲笑他们,并会使用此顺序:C, C, A, A, B, B, C, C, A, A, B, B ...

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

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 = 4 Bruno = 3 Goran = 2

+1

@Chalanthron这不是完全清楚你问这里。为了在StackOverflow上得到很好的答案,重要的是你要:(1)描述你想要做什么(2)提供什么令你困惑的最小可能的例子(3)正确地陈述你期望发生的事情(4)发生了什么。粘贴多行代码不是好习惯,在这里,您已经添加了整个脚本,这使我们很难帮助您。 – Wilduck 2014-09-30 16:10:01

+1

如果有的话,编辑使事情不太清楚。请通读这个方便的清单:http://meta.stackoverflow。com/questions/260648/stack-overflow-question-checklist – jonrsharpe 2014-09-30 16:10:38

+0

究竟是什么*“可能是这行是错的”*意思?!你有错误吗(提供完整的追溯)?意想不到的产出(提供投入,预期和实际产出)?你做了什么测试 - 你是否试图“打印”任何值以查看发生了什么?请**阅读**我刚刚发布的链接,并提供适当的信息。 – jonrsharpe 2014-09-30 16:41:19

回答

0

您的问题是您正在使用elif来比较男孩的猜测与实际答案 - 如果多个男孩有相同的答案是正确的?

相反,使每检查一个单独的if:使用itertools.cyclezip

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 

注意,您可以用少得多的重复做到这一点:

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)的数量,他们的名字(a1,变量和c1)以及他们是否得到最大分数(a,bc),这就减少了重复的代码,并且可以更容易地向字典中添加额外的人员(使用他们自己的猜测策略)。