Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #-*- coding: utf-8 -*-
- #-*- coding: cp950 -*-
- # (subtask1)Check whether a input is valid
- # ans_ok(x)
- from itertools import combinations
- def valid(s):
- if len(s)!=4:
- return False
- if any(x not in '0123456789' for x in s):
- return False
- if any(x==y for x, y in combinations(s,2)):
- return False
- return True
- #(subtask2)int變成長度為4的字串
- def int2ans(n):
- stk = str(n);
- four = stk.rjust(4, "0")
- '''
- 這個 function 將數字 n 轉成長度為 4 的字串
- 目前的版本在 n == 123 時會輸出 123,但我們要的是 0123
- 你可以假設 n『都是介於 0~9999 的整數』
- 唯之後使用這個 function 時記得留意是否傳進來的 n 都符合該假設
- '''
- return four
- #(subtask 3) 產生所有合法的可能的答案
- possible_ans = []
- for i in range(10000):
- a = int2ans(i)
- if valid(a):
- possible_ans.append(a)
- #(subtask4) 從可能的答案中選一個輸出
- import random
- def pick_ans(possible_ans):
- picka = random.choice(possible_ans)
- '''
- possible_ans 是目前所有可能的答案
- 隨便選一個輸出吧,不過要小心不要選到超過 list 範圍的答案喔!!!
- 不然一分都拿不到
- 你可以假設『possible_ans 裡面至少有一個答案』
- 唯之後使用這個 function 時記得留意是否傳進來的 possible_ans 都符合該假設
- 等等,如果這個假設不成立是不是哪裡怪怪的??
- '''
- return picka
- print 'pick_ans:',pick_ans(possible_ans)
- #(subtask5) 對於A猜的數字,根據Q自己的答案,回答幾A幾B
- from random import sample
- a_guess = pick_ans(possible_ans)
- q_ans =''.join(sample('0123456789',4))
- def response(guess, ans):
- if guess != ans:
- A = 0
- B = 0
- for x,y in zip(guess, ans):
- if x == y: A += 1
- for x in guess:
- if x in ans: B += 1
- B -= A
- print guess,'is {}A{}B.'.format(A,B)
- else:
- print 'Congrats! The answer is', guess
- return [A,'A',B,'B']
- response(a_guess, q_ans)
- '''
- while possible_ans != my_guess
- sum(1 for x,y in zip(my_guess,possible_ans) if x==y) = nA
- sum(1 for x in my_guess if x in possible_ans)- nA = nB
- my_guess 是我這次猜的答案
- nAnB 是 Q 君針對我這次的猜測進行的回答
- possible_ans 是目前可能的答案,但是經過這次的猜測與回答後,有一些變得不可能了
- 提示:借用一下 subtask 5 的 function 這題就很簡單咯
- '''
- #(subtask6) 根據自己猜的答案與 Q.py 的回覆刪掉不可能的答案
- def refine(my_guess, possible_ans):
- nAnB = response(a_guess, q_ans)
- nA = nAnB[0]
- nB = nAnB[2]
- still_possible_ans = possible_ans
- for ans in still_possible_ans:
- if sum(1 for x,y in zip(my_guess, ans)if x == y) != nA and sum(1 for x in my_guess if x in ans) - nA != nB:
- still_possible_ans.remove(ans)
- return still_possible_ans
- while a_guess != q_ans:
- possible_ans = refine(a_guess, possible_ans)
- for index in possible_ans:
- print index,
- print ' '
- a_guess = pick_ans(possible_ans)
- print 'My new guess is', a_guess
- print 'Ans is', q_ans
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement