鱼C论坛

 找回密码
 立即注册
楼主: 冬雪雪冬

[技术交流] Python:每日一题 175

[复制链接]
发表于 2018-4-8 20:03:42 From FishC Mobile | 显示全部楼层
import random as rd

def main():
    mdigit="0123456789"
    mresult=rd.sample(mdigit,4)#取样
    #print(mresult)
    minput="" #输入的数字
    mrecord="HISTORY:\n"#记录
    while 1:
        minput=str(input("请输入不重複的四个数字, Q - 退出遊戲"))
        if minput.lower()=="q":
            print("结束")
            return 0
        if len((minput))!=4 or len(set(minput))!=4 or sum(map(lambda x:x not in mdigit,minput))!=0:#长度为4,去掉重复也长度也要为4,而且全部为数字
            print("输入有误")
        else:
            mposcor=sum(map(lambda x:x[0]==x[1],zip(minput,mresult)))#位置正确的个数
            mdigitcor=sum(map(lambda x:x in mresult,minput))-mposcor#数字正确的个数,需要减去位置正确的数字
            mrecord+="{0}.{1}→{2}A{3}B".format(mrecord.count(".")+1,minput,mposcor,mdigitcor)+"\n"#格式化记录,统计小数点的个数就知道记录了多少次
            print(mrecord)
            if mposcor==4:
                print("答案正确")
                return 1
               
while main():
    pass

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-8 21:43:36 | 显示全部楼层
import random
a=[0,1,2,3,4,5,6,7,8,9]
b=random.sample(a,4)
c=[int(i) for i in input('请输入四个不重复的数字,数字之间用逗号隔开').split(',')]
d=[d for d in c if d in b]
B=len(d)
A=0
for j in range(4):
    if b[j]==c[j]:
        A+=1
        B-=1
print('%dA%dB'%(A,B))
   

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1 输入重复数字无提示,只有一次机会

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-8 21:47:55 | 显示全部楼层
#!/usr/bin/python3
#-*-coding:UTF-8-*-
def cut(number):
        a = int(number)%10
        b = int(((int(number)-a)%100)/10)
        c = int(((int(number)-a-b*10)/1000)%10)
        d = int(int(number)//1000)
   
        list_input = [d,c,b,a]
        li_0 = list_input[0]
        li_1 = list_input[1]
        li_2 = list_input[2]
        li_3 = list_input[3]
       
        list_output = [1,1,1,1]
            
        if li_0 in list_guess and li_0 == list_guess[0]:
               
                list_output[0] = 'A'
        elif li_0 in list_guess:
                list_output[0] = 'B'
                               
        else:
               
                if li_1 in list_guess and li_1 == list_guess[1]:
                        list_output[1] = 'A'
                elif li_1 in list_guess:
                        list_output[1] = 'B'
                                       
                else:
                        if li_2 in list_guess and li_2 == list_guess[2]:
                                list_output[2] = 'A'
                        elif li_2 in list_guess:
                                list_output[2] = 'B'
                                               
                        else:
                                if li_3 in list_guess and li_3 == list_guess[3]:
                                        list_output[3] = 'A'
                                else:
                                        if li_3 in list_guess:
                                                list_output[3] = 'B'
                                       
        print(list_output)
   
import random

number1 = random.randint(1,9)
number2 = random.randint(1,9)
number3 = random.randint(1,9)
number4 = random.randint(1,9)

num=int(number4)*1000+int(number3)*100+int(number2)*10+int(number1)
list_guess=[number4,number3,number2,number1]


guess = 0
while True:
        num_input = input('请输入一个四位数字:')
        guess += 1
        if  int(num_input) == int('0905'):
                break
        else:
                if not num_input.isdigit():
                        print('请输入数字!')
                elif int(num_input)<1111 or int(num_input)>9999:
                        print('请输入四位数!')
                else:
                        if int(num_input) == num:
                                print('恭喜你,猜对了!共猜了%d次!'%guess)
                                break
                        else:
                                cut(int(num_input))

点评

出题可能有重复数字,没有?A?B的提示  发表于 2018-4-9 20:26
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-8 22:33:13 | 显示全部楼层
  1. import random
  2. ans = random.sample([1,2,3,4,5,6,7,8,9],4)
  3. #print(ans)
  4. i = 1
  5. scan_i = []
  6. guess_i = []
  7. while True :
  8.     guess_0 = input("Please input a Four bit non repeating number,Q - quit the game:")
  9.     if guess_0 == 'Q' :
  10.         print('The answer is '+str(ans))
  11.         print('Quiting...')
  12.         break
  13.     guess_0 = int(guess_0)
  14.     k1 = guess_0//1000
  15.     k2 = guess_0%1000//100
  16.     k3 = guess_0%1000%100//10
  17.     k4 = guess_0%10
  18.     guess = [k1,k2,k3,k4]
  19.     if guess == ans :
  20.         guess_00 = str(ans[0])+str(ans[1])+str(ans[2])+str(ans[3])
  21.         print('You are right!The answer is '+str(guess_0))
  22.         break
  23.     A = 0
  24.     B = 0
  25.     for k in range(4):
  26.         if guess[k] == ans[k]:
  27.             A += 1
  28.         if ((guess[k] in ans) == True) and (guess[k] != ans[k]):
  29.             B += 1

  30.     scan = str(A)+'A'+str(B)+'B'
  31.     guess_i.append(guess_0)
  32.     scan_i.append(scan)
  33.     print('HISTORY:')
  34.     for j in range(i):
  35.         print(str(j+1)+". "+str(guess_i[j])+" --> "+str(scan_i[j]))
  36.     i += 1
复制代码


结果展示。。
  1. ================= RESTART: /Users/nizen/Documents/每日一题175.py =================
  2. Please input a Four bit non repeating number,Q - quit the game:1234
  3. HISTORY:
  4. 1. 1234 --> 0A2B
  5. Please input a Four bit non repeating number,Q - quit the game:4321
  6. HISTORY:
  7. 1. 1234 --> 0A2B
  8. 2. 4321 --> 1A1B
  9. Please input a Four bit non repeating number,Q - quit the game:4325
  10. HISTORY:
  11. 1. 1234 --> 0A2B
  12. 2. 4321 --> 1A1B
  13. 3. 4325 --> 1A1B
  14. Please input a Four bit non repeating number,Q - quit the game:4367
  15. HISTORY:
  16. 1. 1234 --> 0A2B
  17. 2. 4321 --> 1A1B
  18. 3. 4325 --> 1A1B
  19. 4. 4367 --> 0A2B
  20. Please input a Four bit non repeating number,Q - quit the game:4389
  21. HISTORY:
  22. 1. 1234 --> 0A2B
  23. 2. 4321 --> 1A1B
  24. 3. 4325 --> 1A1B
  25. 4. 4367 --> 0A2B
  26. 5. 4389 --> 0A2B
  27. Please input a Four bit non repeating number,Q - quit the game:3498
  28. HISTORY:
  29. 1. 1234 --> 0A2B
  30. 2. 4321 --> 1A1B
  31. 3. 4325 --> 1A1B
  32. 4. 4367 --> 0A2B
  33. 5. 4389 --> 0A2B
  34. 6. 3498 --> 0A2B
  35. Please input a Four bit non repeating number,Q - quit the game:Q
  36. The answer is [8, 7, 2, 3]
  37. Quiting...
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-8 23:54:17 | 显示全部楼层
本帖最后由 恋物语 于 2018-4-9 06:28 编辑

import random as r

def creat():
    s=[]
    while(len(s)<4):
        x=r.randint(0,9)
        if x not in s:
            s.append(x)
    return s

def numq(s):
    a = [0 ,0 ,0 ,0]
    s = int(s)
    temp = s
    count = 0
    while temp:
        a[count] = temp%10
        temp = temp//10
        count += 1
    a.reverse()
    return a

def judge(s):
    if s == 'Q' or s == 'q':
        return 0
    elif s.isdigit() == 0 or len(s) != 4:
        return 1
    else :
        numlist = []
        numlist = numq(s)
        if len(set(numlist)) == 4:
            return 0
        else:
            return 1

def getnum():
    i = 1
    while i:
        s = input('请输入不重复的四个数字,Q - 退出游戏:')
        i = judge(s)
        
    if s == 'Q' or s == 'q':
        return 0;
    else:
        num = []
        num = numq(s)
        return num

def getab(answer,usernum):
    a = 0
    b = 0
    c = 0
    ab = []
    for i in range(4):
        if answer == usernum:
            a += 1
        if usernum in answer:
            c += 1
            
    b = c - a
    ab = [a , b]
    return ab

def printhistory(history):
    print('HISTORY')
    for i in range(len(history)):
        print(history)
   
def main():
    answer = creat()
    print(answer)
    usernum = getnum()
    i = 1
    count = 1
    history = []
    if usernum == 0:
        i = 0      

    while i:
        ab = getab(answer,usernum)
        unum = usernum[0]*1000+usernum[1]*100+usernum[2]*10+usernum[3]
        if usernum[0] != 0:
            s = str(count)+'. '+str(unum)+'--> '+str(ab[0])+'A'+str(ab[1])+'B'
        else:
            s = str(count)+'. 0'+str(unum)+'--> '+str(ab[0])+'A'+str(ab[1])+'B'
        count += 1
        history.append(s)
        printhistory(history)
        if ab[0] == 4:
            print('恭喜你猜对了')
            i = 0
        else:
            usernum = getnum()
            if usernum == 0:
                i = 0
               
main()

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-9 00:48:22 | 显示全部楼层
本帖最后由 lan358088 于 2018-4-9 00:51 编辑

import random
num=random.randint(1000,9999)
def foo(num,gauss_num2):
    A=0
    B=0
    new=[]
    new2=[]
    for i in range(4):
        new.append(num%10)
        num=num//10
    for i in range(4):
        new2.append(gauss_num2%10)
        gauss_num2=gauss_num2//10
    # print(new,new2)
    for i in range(4):
        if new2==new[1]:
            A+=1
        elif new2in new:
            B+=1
    return (A,B)
k=1
last_print=''
while 1:
    gauss_num = input('请输入不重複的四个数字, Q - 退出遊戲:')
    if gauss_num=='q':
        exit()
    elif int(gauss_num)==num:
        exit()
    else:
        gauss_num2=int(gauss_num)
        x=foo(num,gauss_num2)
        last_print += '{}.{} -->{}A{}B\n'.format(k,gauss_num,x[0],x[1])
        if gauss_num!=num:
            print(last_print)
            k+=1

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2 出题可能包含重复数

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-9 10:25:01 | 显示全部楼层
本帖最后由 Luke李 于 2018-4-9 23:11 编辑

import random

def random_number():
    while 1:
        number = random.randint(1000, 9999)
        judgeSet = set()
        for each in str(number):
            judgeSet.add(each)
        if len(judgeSet) == 4:
            return (judgeSet, number)
        else:
            continue


secret, num = random_number()
num = str(num)
guess = input('请输入不重复的四个数字,Q - 退出游戏:%s' % num )
often = 0
equA_flag = 0
resultList = []
while guess != 'Q':
    my_guess = set()
    equA_flag = 0
    for each in guess:
        my_guess.add(each)
    if len(my_guess) != 4:
        print('输入的数字有重复!请重新输入!')
        guess = input('请输入不重复的四个数字,Q - 退出游戏:%s' % num )
    else:
        result = my_guess.intersection(secret)
        equB_flag = len(result)
        for i in range(0,4):
            if guess == num:
                equA_flag += 1
        often += 1
        resultList.append('%d:%s - ->%dA%dB' % (often, guess, equA_flag, equB_flag))
        print('History:')
        for each in resultList:
            print(each)
        if equA_flag == 4:
            break
        else:
            my_guess.clear()
            guess = input('请输入不重复的四个数字,Q - 退出游戏:%s' % num )
if equA_flag == 4:
    print('Good Game!Have Fun!')
else:
    print('Welcome next time!')

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2 输入重复数字无提示,猜对未退出

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-9 10:34:17 | 显示全部楼层
  1. import random

  2. # 创建一个各位数字不重复的4位数
  3. def NumInit():
  4.     NumList = [0,1,2,3,4,5,6,7,8,9]
  5.     target = random.sample(NumList, 4)
  6.     target = [str(i) for i in target]
  7.     Numstr = ''.join(target)
  8.     return Numstr

  9. # 返回AB
  10. ##A代表猜测的数字中,数字相同且位置也正确的个数。
  11. ##B代表猜测的数字中,数字相同但位置不一样的个数。
  12. def FunAB(guessstr, Numstr):
  13.     flag_a = 0
  14.     flag_ab = 0
  15.     # A
  16.     for i in range(len(guessstr)):
  17.         if guessstr[i] == Numstr[i]:
  18.             flag_a += 1
  19.     # A+B
  20.     for each in guessstr:
  21.         if each in Numstr:
  22.             flag_ab += 1
  23.   
  24.     return '%sA%sB' % (flag_a, flag_ab-flag_a)

  25. # 判断数字不重复
  26. def isUnique(guessstr):
  27.     list1 = list(guessstr)
  28.     for each in guessstr:
  29.         if guessstr.count(each) != 1:
  30.             return False
  31.     return True
  32.    
  33. def main():
  34.     guessList = []
  35.     Numstr = NumInit()
  36.     print(Numstr)
  37.     while True:
  38.         guess = input('请输入不重複的四个数字, Q - 退出遊戲:')
  39.         
  40.         if not isUnique(guess):
  41.             continue

  42.         if guess == 'Q' or guess == Numstr:
  43.             return
  44.         else:
  45.             guessList.append(guess)
  46.             print('HISTORY:')
  47.             for i in range(len(guessList)):
  48.                 print(str(i+1) + '.' + str(guessList[i]) + '-->' + FunAB(guessList[i], Numstr))

  49. if __name__ == '__main__':
  50.     main()
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-9 10:37:23 | 显示全部楼层
import random

num_list = []
select_list = []
for i in range(10):
    num_list.append(i)

for i in range(4):
    a = random.sample(num_list, 1)
    select_list.append(a[0])
    num_list.remove(a[0])

print(select_list)
input_num = input("请输入不重复的四个数字, Q - 退出游戏:")
times = 0
his_str = 'HISTORY:\n'
while input_num.upper() != 'Q':
    input_list = list(input_num)
    a_num = 0
    b_num = 0
    for i in range(4):
        if str(select_list[i]) == str(input_list[i]):
            a_num += 1
        elif int(input_list[i]) in select_list:
            b_num += 1
    result = str(a_num) + 'A' + str(b_num) + 'B'
    times += 1
    his_str += str(times) + '. ' + str(input_num) + ' --> ' + result + '\n'
    print(his_str)
    input_num = input("请输入不重复的四个数字, Q - 退出游戏:")

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2 输入重复数字无提示,输入正确未退出

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-9 11:34:10 | 显示全部楼层
对22楼我自己的一个补充,22楼没考虑千位为零的情况,修改后如下:
import random
a=[0,1,2,3,4,5,6,7,8,9]
b=random.sample(a,4)
c=[int(i) for i in input('请输入四个不重复的数字,数字之间用逗号隔开').split(',')]
while b[0]==0:
    print('系统所选四位数千位为零,系统重新选取四位数')
    b=random.sample(a,4)
d=[d for d in c if d in b]
B=len(d)
A=0
for j in range(4):
    if b[j]==c[j]:
        A+=1
        B-=1
print('%dA%dB'%(A,B))
        


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-9 14:46:18 | 显示全部楼层
import random

computer = str(random.randint(1,9))
while len(computer) < 4:
        a = random.randint(0,9)
        if str(a) not in computer:
                computer += str(a)
#print(computer)


N = 0
HISTORY = []
while True:
        c_A = 0
        c_B = 0
        N += 1
        human = input('请输入不重複的四个数字, Q - 退出遊戲:')
        if human == 'Q' or human =='q':
                print('退出游戏啦!')
                break
        for n in range(4):
                if human[n] == computer[n]:
                        c_A += 1
                elif human[n] != computer[n] and human[n] in computer:
                        c_B += 1
        record = str(N) + '. ' + human + '-->' + str(c_A) + 'A' + str(c_B) + 'B'
        HISTORY.append(record)
        print('HISTORY:')
        for each in HISTORY:
                print(each)
        if c_A == 4:
                break

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2 输入重复数字无提示

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-9 15:39:33 | 显示全部楼层
  1. def func(s1,s2):   #s1,s2的符合情况(s1,s2长度相同)
  2.     a,b=0,0
  3.     for i in range(len(s1)):
  4.         if s1[i]==s2[i]:
  5.             b+=1
  6.         elif s1[i] in s2:
  7.             a+=1               
  8.     return str(a)+"A"+str(b)+"B"


  9. import random
  10. tmp=str(random.randint(1000,9999))
  11. res,cnt="HISTORY:\n",0
  12. while True:
  13.     guess=input('请输入不重複的四个数字, Q - 退出遊戲:')
  14.     if guess.upper()=='Q':
  15.         break
  16.     if len(guess)!=4:
  17.         print('只能输入四位数,请重新输入')
  18.         continue
  19.     cnt+=1   
  20.     res+=str(cnt)+'.  '+guess+'-->'+func(guess,tmp)+'\n'
  21.     print(res)
  22.     if func(guess,tmp)=='0A4B':
  23.         print("猜中啦!")
  24.         break
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1 出题可能有重复数字,输入重复数字无提示

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-9 20:11:20 | 显示全部楼层
@冬雪雪冬 我输入正确可以结束啊,题目也没有说提示‘你输入对了’之类的,不知道我理解有误没
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-9 20:25:58 | 显示全部楼层
Chase_Kas 发表于 2018-4-8 11:38
玩了几把发现要猜对还真的不简单,比较考验逻辑推理

这个输入重复没提示也没序号
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-9 20:32:39 | 显示全部楼层

这个重复也录进去了,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-9 20:35:14 | 显示全部楼层
塔利班 发表于 2018-4-9 20:11
@冬雪雪冬 我输入正确可以结束啊,题目也没有说提示‘你输入对了’之类的,不知道我理解有误没

我测试结果是这样的。
  1. 请输入不重複的四个数字, Q - 退出遊戲:1234
  2. HISTORY:
  3. 1. 1234-->4A0B
  4. 请输入不重複的四个数字, Q - 退出遊戲:
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-9 20:39:08 | 显示全部楼层
冬雪雪冬 发表于 2018-4-9 20:35
我测试结果是这样的。


奇怪了,我自己又粘贴了几遍,,
没有你的那一行,我还看了好几次,逻辑上也打不出来啊
为了一次出结果,我打印了tar
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-9 20:46:06 | 显示全部楼层
冬雪雪冬 发表于 2018-4-9 20:35
我测试结果是这样的。

莫非要求输入正确还要有这一行么,,题目也没有要求结果形式,
而且也只输入得到1A1B
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-9 20:46:36 | 显示全部楼层
塔利班 发表于 2018-4-9 20:39
奇怪了,我自己又粘贴了几遍,,
没有你的那一行,我还看了好几次,逻辑上也打不出来啊
为了一次出结 ...

抱歉我弄错了,已重新评分
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-9 20:47:28 | 显示全部楼层
冬雪雪冬 发表于 2018-4-9 20:46
抱歉我弄错了,已重新评分

没事,都是版主太辛苦啦,跟老师一样在批作业
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 16:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表